一、批量修改
批量修改,分為兩種情況:
(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 = sqlSession.getMapper(EmployeeMapperBatch.class); Employee emp1 = new Employee(1, "Tom1", "1", "Tom@126.com"); Employee emp2 = new Employee(3, "John", "1", "John@126.com"); Employee emp3 = new Employee(4, "Smith", "0", "Smith@126.com"); Employee[] emps = {emp1, emp2, emp3}; mapper.updateMoreByArray(emps); } finally { sqlSession.close(); } }
運行結果:

原因:創建的 預編譯對象(PrepareStatement),默認只能執行一條 SQL 語句,並不支持執行多條 SQL 語句。不能通過分號寫多個 SQL 來讓它執行。
解決方法:
在 jdbc.properties 的 url 后面添加一個 allowMultiQueries 參數
jdbc.driver=com.mysql.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 = ?;
這時數據庫也修改成功了。
