mybatis+mysql如何批量执⾏多条语句
此处仅描述问题处理⽅法,关于mysql、mybatis的内容不在此赘述。
因为项⽬需要,需要在mybatis同个标签中执⾏多条sql语句。如下:
<insert id="insertUser" parameterType="del.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发送多条语句,它应该也会这么执⾏的。
简单的mysql语句我承认⼀开始想的太简单了,直接这样做的结果,是会在jdbc驱动层⾯报出语法错误异常,程序⽆法执⾏下去。
debug后发现,从mybatis拼装sql,到语句传⼊jdbc驱动,语句都是正常的,但是在mysql驱动验证sql合法性时,sql被截断,它认为⼀次性发过去的多条sql是不合法的。
看了⽹上很多说法,⼀说是mybatis本⾝不⽀持;⼀说是mysql驱动不⽀持。困扰很久,没能解决,后为了项⽬进度,暂时将sql分开执⾏了。
<insert id="insertUser" parameterType="del.User">
insert into user (id,email,name,phone,status) values(#{id,jdbcType=INTEGER},#{email,jdbcType=VARCHAR},#{nick,jdbcType=VARCHAR},#{phone,jdbc Type=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配置⽂件改了回去,测试⼀下,执⾏成功。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。