MyBatis(五)动态SQL之批量操作(更新)⼀、批量修改
  批量修改,分为两种情况:
  (1)把每条数据修改为相同内容
⽅式⼀:update emp set ....  where eid in (1,2,3);
⽅式⼆:update emp set .... where eid = 1 or eid = 2 or eid = 3;
  (2)把每条数据修改为对应的字段内容
update emp set ... where eid = 1;
update emp set ... where eid = 2;
update emp set ... where eid = 3;
⼆、实现批量修改
  1、在接⼝中声明⽅法
/
/批量修改
public void updateMoreByArray(@Param("emps")Employee[]  emps);
  2、在对应的 xml 中进⾏配置
<!--
public void updateMoreByArray(@Param("emps")Employee[]  emps);
-->
<update id="updateMoreByArray">
<foreach collection="emps" item="emp">
update tbl_employee
set
last_name = #{lastName},
gender  = #{gender},
email = #{email}
where id = #{id};
</foreach>
</update>
  3、测试
@Test
public void testBatchUpdate() throws IOException {
//1、获取 sqlSessionFactory
SqlSessionFactory sqlSessionFactory = getsqlSessionFactory();
//2、获取 sqlSession 实例,能直接执⾏已经映射的 SQL 语句
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
EmployeeMapperBatch mapper = Mapper(EmployeeMapperBatch.class);
Employee emp1 = new Employee(1, "Tom1", "1", "Tom@126");
Employee emp2 = new Employee(3, "John", "1", "John@126");
Employee emp3 = new Employee(4, "Smith", "0", "Smith@126");
Employee[] emps = {emp1, emp2, emp3};
mapper.updateMoreByArray(emps);
} finally {
sqlSession.close();
}
}
    运⾏结果:
    原因:创建的预编译对象(PrepareStatement),默认只能执⾏⼀条 SQL 语句,并不⽀持执⾏多条 SQL 语句。不能通过分号写多个 SQL 来让它执⾏。
    解决⽅法:
    在 jdbc.properties 的 url 后⾯添加⼀个 allowMultiQueries 参数
批量更新sql语句jdbc.sql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true
jdbc.username=root
jdbc.password=root
    默认情况下,该属性为 false,预编译对象只能执⾏⼀条 SQL语句。添加了该属性后,预编译对象就允许执⾏多条 SQL 语句。
    再次来执⾏就成功了,执⾏的 SQL 语句:
update tbl_employee set last_name = ?, gender = ?, email = ? where id = ?;
update tbl_employee set last_name = ?, gender = ?, email = ? where id = ?;
update tbl_employee set last_name = ?, gender = ?, email = ? where id = ?;
    这时数据库也修改成功了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。