美文网首页
Mybatis批量执行SQL

Mybatis批量执行SQL

作者: Alex_1799 | 来源:发表于2018-05-18 17:42 被阅读0次

    mybatis+mysql如何批量执行多条语句

    此处仅描述问题处理方法,关于mysql、mybatis的内容不在此赘述。

    因为项目需要,需要在mybatis同个标签中执行多条sql语句。如下:

         <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});  
                 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分开执行了。

         <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>  
        .........  
    

    ---------------------------------------------------------allowMultiQueries=true----------------------------------------------------------------------------------
    但今天,有高人,跟我说,这样做不行,是因为你没有让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};
    

    相关文章

      网友评论

          本文标题:Mybatis批量执行SQL

          本文链接:https://www.haomeiwen.com/subject/ezzgdftx.html