想法:更新某条符合条件的记录的状态status为1,并且返回这条记录的id。如果没有符合条件的记录,就返回0。
update语句默认返回的是影响到的记录数,用selectKey可以返回指定属性值到 传入的对象。
比如updateStatus(exampleObject),执行sql update 后
使用 exampleObject.getId()可以得到 被修改的记录的id
本篇涉及到 selectKey、 mysql的ifnull()、max()
假设ExampleObject 属性有主键id, is_delete,status,relation_id…等其他属性
第一部分:ExampleObjectImpl.java
@Resource
ExampleObjectMapper exampleObjectMapper;
@Override
public Long updateStatus(ExampleObject exampleObject ) {
int affectRow=exampleObjectMapper.updateStatus(exampleObject );
System.out.println("修改成功?:"+affectRow);
System.out.println("返回的id:"+exampleObject .getId());
return exampleObject.getId();
}
第二部分:ExampleObjectMapper .java
注意 这里int值 不是返回的主键id,是修改的行数
int updateStatus(ExampleObject exampleObject);
第三部分:ExampleObjectMapper .xml
order=“AFTER”:在update语句执行后 再执行selectKey
keyProperty="id:select语句返回的 id 要赋给哪个属性
<update id="updateStatus" parameterType="com.*******.model.ExampleObject" >
<selectKey resultType="java.lang.Long" keyColumn="id" keyProperty="id" order="AFTER">
select id from example_table
where relation_id=#{relationId}
</selectKey>
update example_table
set status=0,relation_id=#{relationId}
where is_delete=0 and status=1
and unix_timestamp( start_date ) =unix_timestamp( #{startDate} )
and unix_timestamp( end_date ) =unix_timestamp( #{endDate} )
limit 1
</update>
到这里出现了问题:控制台报错ExecutorException: SelectKey returned no data.
如果update语句修改的行数为0,或者
如果没有符合条件的记录 select语句的结果就是 N/A
ifnull()处理不了 N/A,再加个max(),当查询结果为 N/A时,max(id)的值为null,这样报错就处理好了。
<update id="updateStatus" parameterType="com.*******.model.ExampleObject">
<selectKey resultType="java.lang.Long" keyColumn="id" keyProperty="id" order="AFTER">
select ifnull(max(id),0) id from example_table
where relation_id=#{relationId}
</selectKey>
update example_table
set status=0,relation_id=#{relationId}
where is_delete=0 and status=1
and unix_timestamp( start_date ) =unix_timestamp( #{startDate} )
and unix_timestamp( end_date ) =unix_timestamp( #{endDate} )
limit 1
</update>
结果