mybatis一次执行多条sql:allowMultiQueries=true

数据库版本:5.7  springboot版本:2.1.3

1.需求:页面上有一个列表,可以勾选列表的多条数据,按下禁用按钮,就把这些勾选数据设置为禁用。就是一个对多条数据修改状态的需求。

于是让前端传入一个列表,[{"id":1,"status":0},{"id":2,"status":0}]这样的数据,然后在sql中进行foreach,如下图

debug可以看到生成的执行sql为 update j_lamp_item lam set lam.`status` = 0 where lam.school_id = 3 and lam.lamp_item_id = 1;update j_lamp_item lam set lam.`status` = 0 where lam.school_id = 3 and lam.lamp_item_id = 2

2.但是在程序中,报错了,以下是报错信息截图

 大概就是mysql版本不支持之类的报错

于是把这条sql放入navicat去执行,update j_lamp_item lam set lam.`status` = 0 where lam.school_id = 3 and lam.lamp_item_id = 1;update j_lamp_item lam set lam.`status` = 0 where lam.school_id = 3 and lam.lamp_item_id = 2  执行结果正确,没有问题。于是日了狗了,相同的sql在navicat正常运行,在程序中执行异常

3.多次怀疑mysql5.7版本后,将这条sql放入navicat并使用mysql8.0执行正常

4.于是尝试直接把执行sql:<update id="updateStatus" >update j_lamp_item lam set lam.`status` = 0 where lam.school_id = 3 and lam.lamp_item_id = 1;update j_lamp_item lam set lam.`status` = 0 where lam.school_id = 3 and lam.lamp_item_id = 2</update>放在mapper.xml文件中执行,程序一样的异常

5.是不是一次执行两条sql有问题?mapper.xml文件中直接改为<update id="updateStatus" >update j_lamp_item lam set lam.`status` = 0 where lam.school_id = 3 and lam.lamp_item_id = 1;</update>,执行成功,没有异常

6.可以肯定是一次执行多条sql的问题,于是百度后(mybatis一次执行多条sql),得到要在连接中增加allowMultiQueries=true

7.修改后连接后得到 jdbc:mysql://127.0.0.1:3306/test_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull

8.修改后,程序执行没有出现异常

原文地址:https://www.cnblogs.com/chuwu/p/14720048.html