在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