MyBatis批量修改
再利用MyBatis操作Oracle实现批量的修改操做的时候,需要用到存储过程的知识点
批量修改,不同于批量的插入,批量修改可以同时操作不同表,但是如何保证他们是在同一次的操作中,这里就要用到存储过程。
两个关键字
- Begin
- ends
begin
update set student name='hehe',age=21 where id = 101;
update set dept dept_no=101,dept_name = '销售部' where dept_no = 102;
end
从这里看出,这里是两句的SQL语句,操作的不同的数据库表,但是这里保证了在同一次事务操作中完成。
所以有了上述的思路后,我们可以通过<foreach>
标签来循环遍历参数列表,完成多条update语句的插入,从而实现批量修改
<!-- 批量修改 -->
<update id="updateByBatch" >
<foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">
update student
<set>
<if test="item.name != null">
NAME = #{item.name},
</if>
<if test="item.email != null">
email = #{item.email},
</if>
<if test="item.age !=null">
AGE = #{item.age},
</if>
</set>
where ID = #{item.id}
</foreach>
</update>
这里又有一个比较有意思的地方给,管擦返回值,是-1.没想到吧
说明一下MyBatis的批量修改返回值是-1,这是由mybatis的defaultExExecutorType
引起的
按照正常的JDBC原理来说,这里的DML操作后,返回的int值本应该代表的是修改的行数,但是这里却不同。
这里的defaultExEcutorType的类型有三个执行器,分别如下所示:
- SIMPLE 就是普通的执行器;
- REUSE 执行器会重用预处理语句(prepared statements);
- BATCH 执行器将重用语句并执行批量更新。
BATCH可以批量更新操作,缓存SQL以提高性能
,缺陷就是无法获取update、delete返回的行数。
看到这儿里,我们就可以基本理解了,采用的是缓存的机制来提高效率,所以获取不到影响的行数。
如果要拿到更新条数,修改如下:
在mybatis-config.xml配置:
<configuration>
<settings>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultExecutorType" value="BATCH"/>
</settings>
</configuration>