mybatis一次请求执行多条sql

因为项目需要,需要在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>  

前段时间看帖子,发现这样做不行,是因为你没有让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};



  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值