select * from users where id in ()
Run Code Online (Sandbox Code Playgroud)
查询如上所示.
<select id="getByIds" resultMap="BaseResultMap">
SELECT
<include refid="BaseColumnList"/>
FROM users
WHERE id IN
<foreach item="id" collection="ids"
open="(" separator="," close=")">
#{id}
</foreach>
</select>
Run Code Online (Sandbox Code Playgroud)
如果Param ids为空,Mybatis将抛出BadSqlGrammarException,它会生成类似' select * from users where id in' 的查询.
如果ids为空,我如何跳过查询并返回空列表?
在myBatis 3中,如何在使用动态sql时比较字符串?
以前使用iBatis可以执行以下操作:
<isEqual property="sortBy" compareValue="portfolio_id">order by p.portfolio_id</isEqual>
Run Code Online (Sandbox Code Playgroud)
现在使用myBatis可以执行以下操作:
<if test="sortBy.equals('facility_id')">
order by pd.facility_id
</if>
Run Code Online (Sandbox Code Playgroud)
sortBy是参数map中的属性,"facility_id"是值
我有点困惑,因为它在ibatis中很直接.
我是mybatis的新手.我想获取最后插入记录的ID.我的数据库是mysql,我的mapper是xml
<insert id="insertSelective" parameterType="com.mycom.myproject.db.mybatis.model.FileAttachment" >
<selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER" >
SELECT LAST_INSERT_ID() as id
</selectKey>
insert into fileAttachment
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="name != null" >
name,
</if>
<if test="attachmentFileSize != null" >
size,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="name != null" >
#{name,jdbcType=VARCHAR},
</if>
<if test="attachmentFileSize != null" >
#{attachmentFileSize,jdbcType=INTEGER},
</if>
</trim>
</insert>
Run Code Online (Sandbox Code Playgroud)
我认为这里写的语句'SELECT LAST_INSERT_ID()as id'应该返回最后插入记录的id但是我在插入记录后总是1.
我的mapper.java类我有方法
int insertSelective(FileAttachment record);
Run Code Online (Sandbox Code Playgroud)
在我正在使用的dao课程中
int id = fileAttachmentMapper.insertSelective(fileAttachment);
插入新记录时,我的ID值始终为1.我的Id字段自动递增,记录正确插入.
我有一个使用mybatis进行对象持久化的应用程序.但是我有机会运行任意的sql(来自用户).我可以用mybatis做吗?
更新:
我选择使用dbutils(JDBC)来运行用户定义的sql,但我需要一个DataSource实例来创建QueryRunner.有什么方法可以从mybatis获取数据源吗?
如何在MyBatis的动态SQL中检查空字符串?我在documentaiton中找到了下面的代码,但是我想检查空字符串,而不是null.
<select id="findActiveBlogWithTitleLike" parameterType="Blog" resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
Run Code Online (Sandbox Code Playgroud) 我想知道,我们如何在myBatis关联标记中传递多个列.
例如,我在一个mapper.xml文件中有以下xml片段:
<resultMap type="com.mysite.domain.CourseBuilderCourses" id="ResultMapWithAssmnts" extends="BaseResultMap">
<association property="totalAssignmentCnt" column="course_id" select="selectTotalAssgnmentsCnt"/>
<association property="totalAssessmentCnt" column="course_id" select="selectTotalAssesmentsCnt"/>
<!-- see this association >> --> <association property="subscription" column="course_id" select="com.mysite.persistence.mybatis.CourseSubscriptionMapper.selectByUsercId"/>
</resultMap>
Run Code Online (Sandbox Code Playgroud)
如您所见,<association>with property订阅只有一列,course_id
我想传递2列,因此产生的代码,我们如何做到这一点?
我尝试了以下组合,没有效果:
column="{course_id,user_id}" // null,null are passed as parameters
column="course_id,user_id" // null,null are passed as parameters
column="{COURSE_ID=course_id,USER_ID=user_id}" // null,null are passed as parameters
Run Code Online (Sandbox Code Playgroud)
但如果我传递单个,column ="{course_id}"或column ="course_id"
工作没有任何问题.
伙计们好吗?
我正在尝试在mybatis中生成如下所示的sql.
SELECT COL_C
FROM TBLE_1
WHERE (COL_A, COL_B) in ( ('kp','kar'),('srt','sach'));
Run Code Online (Sandbox Code Playgroud)
我的输入参数类型是HashMap.现在如何从mapper xml文件生成SQL.下面的代码抛出异常,说map被评估为null.
<select id="selectCOLC" parameterType="java.util.HashMap" resultType="String">
SELECT COL_C
FROM TBLE_1
WHERE (COL_A, COL_B) in
<foreach item="item" collection="#{map.keySet()}" open="((" separator="),(" close="))">
#{item},#{item.get(item)}
</foreach>
</select>
Run Code Online (Sandbox Code Playgroud)
其中的另一种方法是创建具有关键值字段类,创建对象的列表,然后通过parameterType为list它看起来像下面.
<select id="selectCOLC" parameterType="list" resultType="String">
SELECT COL_C
FROM TBLE_1
WHERE (COL_A, COL_B) in
<foreach item="item" collection="list" open="((" separator="),(" close="))">
#{item.getKey()},#{item.getVal()}
</foreach>
</select>
Run Code Online (Sandbox Code Playgroud)
但有没有办法让我的mapper工作第一种方法?除了将查询更改为union之外
我有一个xml映射器 - 一个选择和一个结果映射器.它没有问题.但我想使用注释.我的映射器:
<resultMap id="readItemsRM" type="com.company.Item">
<id property="id" column="Id"/>
<result property="comment" column="Comment"/>
<collection property="textItems" ofType="com.company.TextItem">
<id property="id" column="TxId"/>
<result property="name" column="TxName"/>
</collection>
</resultMap>
Run Code Online (Sandbox Code Playgroud)
所以我确实喜欢这个
@Results({
@Result(id=true, property="id", column="Id"),
@Result(property="comment", column="Comment"),
///,???
})
public List<Item> select();
Run Code Online (Sandbox Code Playgroud)
我无法理解如何在不执行一个sql查询的情况下通过注释映射我的集合.正如我发现的所有示例都假设执行了一个以上的查询.请帮忙.
我有一个自定义周围实现匹配自定义注释.我希望自定义在外部@Transactional中执行.不幸的是,这似乎不起作用.(AOP正在工作.我看到展示它的堆栈跟踪).
堆栈跟踪显示我的AOP执行之前(记录器),MyBatis会话启动事务,MyBatis关闭事务,Spring关闭事务,然后我的AOP完成.
我认为让我的AOP工具Ordered会有所帮助.我将返回的值设置为1.我用过.这没用.我想这是因为我误读了Spring的命令.
建议订购
当多条建议都想在同一个连接点运行时会发生什么?Spring AOP遵循与AspectJ相同的优先级规则来确定建议执行的顺序.最高优先级的建议首先"在路上"(因此,给出两条之前的建议,优先级最高的建议首先运行).从连接点"出路",最高优先级建议最后运行(因此,给出两条后建议,具有最高优先级的建议将运行第二).
当在不同方面定义的两条建议都需要在同一个连接点运行时,除非您另行指定,否则执行顺序是未定义的.您可以通过指定优先级来控制执行顺序.这是通过在方法类中实现org.springframework.core.Ordered接口或使用Order注释对其进行注释来以常规Spring方式完成的.给定两个方面,从Ordered.getValue()(或注释值)返回较低值的方面具有较高的优先级.
当在同一方面定义的两条建议都需要在同一个连接点上运行时,排序是未定义的(因为没有办法通过反射为javac编译的类检索声明顺序).考虑将这些建议方法折叠到每个方面类中每个连接点的一个建议方法中,或者将这些建议重构为单独的方面类 - 可以在方面级别进行排序.
所以我拿出了order属性.这应该使@Transactional返回Integer.MIN_VALUE.因此,如果我理解上面的引用,它应该运行到最后.当我重新部署时,它仍然向后执行.我的AOP,Spring TX,MyBatis,关闭MyBatis,关闭SPring Tx,关闭我的AOP.
我究竟做错了什么?
目标是在发生故障时回滚所有/任何事务.但这并不像预期的那样有效.
我们使用Spring MVC + JMS + Service + Mybatis.在日志中,JMS设置为回滚,但是插入行而不是回滚.想知道我错过了什么或做错了什么?
最近添加了@Transactional标记.所以不确定它是否按预期工作.
码:
服务类别:
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public class DataExchangeLogic implements DataExchangeService {
private DataExchDao dataExchDao;
...
@Override
public void save(DataExch dataExch) throws ValidationException {
if (dataExch.getId() != null && dataExch.getId() > 0) {
this.dataExchDao.update(dataExch);
} else {
//LOGGER.debug("in insert::");
this.dataExchDao.create(dataExch);
//Empty exception throw to test rollback
throw new RuntimeException();
}
}
}
Run Code Online (Sandbox Code Playgroud)
DAO:
public interface DataExchDaoMybatis
extends NotificationDao {
void create(DataExch dataExch);
}
Run Code Online (Sandbox Code Playgroud)
春天语境
<bean …Run Code Online (Sandbox Code Playgroud) mybatis ×10
java ×6
database ×2
ibatis ×2
spring ×2
sql ×2
foreach ×1
mysql ×1
spring-aop ×1
spring-jms ×1
transactions ×1