mybatis 一次執行多條SQL
此處僅描述問題處理方法,關於mysql、mybatis的內容不在此贅述。
因為專案需要,需要在mybatis同個標籤中執行多條sql語句。如下:
Xml程式碼- <insert id="insertUser" parameterType="com.test.model.User">
- insert into user (id,email,name,phone,status) values(#{id,jdbcType=INTEGER},#{email,jdbcType=VARCHAR},#{nick,jdbcType=VARCHAR},#{phone,jdbcType=VARCHAR
- delete from roleuser where userid=#{id,jdbcType=INTEGER};
- <if test="roles != null and roles.size() != 0 ">
- insert into roleuser (userid,roleid) values
- <foreach collection="roles" item="roleId" separator="," close=";"
- (#{id,jdbcType=INTEGER},#{roleId,jdbcType=INTEGER})
- </foreach>
- </if>
- </insert>
尋思著,在mysql中同時執行多條語句時,mysql是一條一條執行的。如果我一次性向mysql傳送多條語句,它應該也會這麼執行的。
我承認一開始想的太簡單了,直接這樣做的結果,是會在jdbc驅動層面報出語法錯誤異常,程式無法執行下去。
debug後發現,從mybatis拼裝sql,到語句傳入jdbc驅動,語句都是正常的,但是在mysql驅動驗證sql合法性時,sql被截斷,它認為一次性發過去的多條sql是不合法的。
看了網上很多說法,一說是mybatis本身不支援;一說是mysql驅動不支援。困擾很久,沒能解決,後為了專案進度,暫時將sql分開執行了。
Xml程式碼- <insert id="insertUser" parameterType="com.test.model.User">
- insert into user (id,email,name,phone,status) values(#{id,jdbcType=INTEGER},#{email,jdbcType=VARCHAR},#{nick,jdbcType=VARCHAR},#{phone,jdbcType=VARCHAR},#{status,jdbcType=INTEGER});
- </insert>
- <delete id="deleteUserById" parameterType="java.lang.Integer">
- delete from roleuser where userid=#{id,jdbcType=INTEGER};
- </delete>
- .........
但今天,有高人,跟我說,這樣做不行,是因為你沒有讓mysql驅動開啟批量執行sql的開關。
怎麼開啟呢?在拼裝mysql連結的url時,為其加上allowMultiQueries引數,設定為true,如下:
jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
加了引數後,我又將mybatis配置檔案改了回去,測試一下,執行成功。
這裡記錄一下,希望對看到的人,有所幫助。
附MYSQL 多表更新 語句
UPDATE A
LEFT OUTER JOIN
B ON A.ID = B.ID
LEFT OUTER JOIN
C ON A.ID = C.ID
SET
A.NAME = C.NAME,
A.TYPE = B.TYPE
WHERE
A.ID = #{ID}
AND A.S_ID = #{S_ID}
AND A.P_ID = #{P_ID};