1. 程式人生 > >mybatis 一次執行多條SQL

mybatis 一次執行多條SQL

此處僅描述問題處理方法,關於mysql、mybatis的內容不在此贅述。

因為專案需要,需要在mybatis同個標籤中執行多條sql語句。如下:

Xml程式碼  收藏程式碼
  1. <insert id="insertUser" parameterType="com.test.model.User">  
  2.          insert into user (id,email,name,phone,status) values(#{id,jdbcType=INTEGER},#{email,jdbcType=VARCHAR},#{nick,jdbcType=VARCHAR},#{phone,jdbcType=VARCHAR
    },#{status,jdbcType=INTEGER});  
  3.          delete from roleuser where userid=#{id,jdbcType=INTEGER};  
  4.          <if test="roles != null and roles.size() != 0 ">  
  5.             insert into roleuser (userid,roleid) values  
  6.             <foreach collection="roles" item="roleId" separator="," close=";"
    >  
  7.                 (#{id,jdbcType=INTEGER},#{roleId,jdbcType=INTEGER})  
  8.             </foreach>  
  9.          </if>  
  10. </insert>  

尋思著,在mysql中同時執行多條語句時,mysql是一條一條執行的。如果我一次性向mysql傳送多條語句,它應該也會這麼執行的。

我承認一開始想的太簡單了,直接這樣做的結果,是會在jdbc驅動層面報出語法錯誤異常,程式無法執行下去。

debug後發現,從mybatis拼裝sql,到語句傳入jdbc驅動,語句都是正常的,但是在mysql驅動驗證sql合法性時,sql被截斷,它認為一次性發過去的多條sql是不合法的。

看了網上很多說法,一說是mybatis本身不支援;一說是mysql驅動不支援。困擾很久,沒能解決,後為了專案進度,暫時將sql分開執行了。

Xml程式碼  收藏程式碼
  1. <insert id="insertUser" parameterType="com.test.model.User">  
  2.         insert into user (id,email,name,phone,status) values(#{id,jdbcType=INTEGER},#{email,jdbcType=VARCHAR},#{nick,jdbcType=VARCHAR},#{phone,jdbcType=VARCHAR},#{status,jdbcType=INTEGER});  
  3. </insert>  
  4. <delete id="deleteUserById" parameterType="java.lang.Integer">  
  5.         delete from roleuser where userid=#{id,jdbcType=INTEGER};  
  6. </delete>  
  7. .........  

但今天,有高人,跟我說,這樣做不行,是因為你沒有讓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};