在mysql中同时执行多条语句时,mysql是一条一条执行的。如果我一次性向mysql发送多条语句,它应该也会这么执行的。
UPDATE newly_data SET city_name = ? , this_post = ? , id = ? ,
city_id = ? where 1=1 AND id = ? ;
UPDATE newly_data SET city_name = ? , this_post = ? , id = ? ,
city_id = ? where 1=1 AND id = ? ;
2020-05-26 10:25:02.233 DEBUG 13368 --- [p-nio-80-exec-1] c.w.p.m.NewMapper.updateListByField :
==> Parameters:
秦皇岛市(String), null, 1(Integer), 13(Integer), 1(Integer),
秦皇岛市(String), null, 3(Integer), null, 3(Integer)
2020-05-26 10:25:02.236 DEBUG 13368 --- [p-nio-80-exec-1]
我承认一开始想的太简单了,直接这样做的结果,是会在jdbc驱动层面报出语法错误异常,程序无法执行下去。
debug后发现,从mybatis拼装sql,到语句传入jdbc驱动,语句都是正常的,但是在mysql驱动验证sql合法性时,sql被截断,它认为一次性发过去的多条sql是不合法的。
看了网上很多说法,一说是mybatis本身不支持;一说是mysql驱动不支持。
但今天,有高人,跟我说,这样做不行,是因为你没有让mysql驱动开启批量执行sql的开关。
怎么开启呢?在拼装mysql链接的url时,为其加上allowMultiQueries参数,设置为true,如下:
jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
UPDATE newly_data SET city_name = ? , this_post = ? , id = ? ,
city_id = ? where 1=1 AND id = ? ;
UPDATE newly_data SET city_name = ? , this_post = ? , id = ? ,
city_id = ? where 1=1 AND id = ? ;
2020-05-26 10:25:02.233 DEBUG 13368 --- [p-nio-80-exec-1] c.w.p.m.NewMapper.updateListByField :
==> Parameters:
秦皇岛市(String), null, 1(Integer), 13(Integer), 1(Integer),
秦皇岛市(String), null, 3(Integer), null, 3(Integer)
2020-05-26 10:25:02.236 DEBUG 13368 --- [p-nio-80-exec-1] c.w.p.m.NewMapper.updateListByField : <==
Updates: 1