`
rhodian
  • 浏览: 71488 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

 

 

但今天,有高人,跟我说,这样做不行,是因为你没有让mysql驱动开启批量执行sql的开关。

 

怎么开启呢?在拼装mysql链接的url时,为其加上allowMultiQueries参数,设置为true,如下:

 

jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true

 

加了参数后,我又将mybatis配置文件改了回去,测试一下,执行成功。

 

这里记录一下,希望对看到的人,有所帮助。

 

 

 

分享到:
评论
2 楼 fushcpc 2016-08-10  
生产场不能用, 会增加sql注入的风险
1 楼 枫叶随风 2016-08-06  
太赞了,我说那个地方配置不对呢,原来有这个设置

相关推荐

    Mybatis 3+Mysql 实现批量插入

    批量插入的基本思想是将多条INSERT语句合并为一条语句执行,减少网络传输和事务管理开销,从而提高效率。在MyBatis中,通过`foreach`元素可以实现这一目标。`foreach`元素允许在SQL语句中进行迭代,特别适合用于构建...

    spring boot+mybatis plus+easy poi实现数据库导出成excel和excel导入到数据库.zip

    在本项目中,MyBatis Plus被用来连接数据库并执行查询,以获取用于导出或验证导入数据的SQL语句。 3. **EasyPoi**:EasyPoi是针对Java的Excel操作库,类似于EasyExcel,但是更注重于读写Excel数据。它支持多种类型...

    Mybatis与JDBC批量插入MySQL数据库性能测试

    在批量插入场景下,JDBC提供了Statement对象的addBatch()和executeBatch()方法,可以将多条插入语句一次性提交,减少与数据库的交互次数,从而提高效率。 Mybatis是一个轻量级的持久层框架,它简化了JDBC的复杂性,...

    基于mybatis batch实现批量提交大量数据

    "基于MyBatis批量提交大量数据的实现" MyBatis批量提交大量数据是...需要注意在xml文件中配置多条参数同时插入,使用SqlSessionFactory和SqlSession来执行批量提交操作,并分段处理长sql语句,以免超出数据库的限制。

    mybatis执行批量更新batch update 的方法(oracle,mysql两种)

    在MyBatis中,批量更新(batch update)是一种提高...通过以上介绍,你应该了解了如何在MyBatis中针对Oracle和MySQL数据库执行批量更新。正确使用批量更新可以显著提高应用程序的性能,同时确保数据操作的高效和安全。

    SpringBoot使用mybatis批量新增500万数据到mysql数据库Demo

    1. **批量插入(Batch Insertion)**:Mybatis支持批处理,可以一次性提交多条SQL语句,减少与数据库的交互次数,提高效率。在Mybatis的映射文件中,可以通过`&lt;insert&gt;`标签的`useGeneratedKeys`和`keyProperty`属性...

    mybatis学习之路mysql批量新增数据的方法

    我们可以看到,单条insert语句需要循环执行多次,效率非常低下,而批量insert方法可以一次性insert大量数据,效率提高了很多倍。因此,在实际项目中,我们应该尽量使用批量insert方法来提高数据insert的效率。 四、...

    springmvc+mysql增删改查批量删除异步请求全选反选

    批量删除功能涉及多条记录的处理,通常需要在用户选择多个记录后,通过后台处理这些记录的ID集合,构建合适的DELETE语句进行删除。全选/反选功能是用户界面的一个便利设计,通过复选框让用户快速选择所有或取消所有...

    Mybatis批量更新三种方式的实现

    所以需要在连接mysql的url上加`&allowMultiQueries=true`,这样才能执行多条sql语句。 方式二:使用trim和foreach标签 第二种方式是使用trim和foreach标签来实现批量更新。例如: ``` update tableName ,"&gt; ,...

    mybatis使用annotation在mysql,oracle上进行批量处理

    这里,`ExecutorType.BATCH`用于创建执行器,它会自动收集多个SQL语句并在适当的时候一起提交,实现批量处理。 5. **注意点**: - 对于Oracle数据库,由于其对批处理的支持方式与MySQL不同,可能需要额外的配置...

    mybatis中批量插入的两种方式(高效插入)

    而`BATCH` 模式则重复使用预处理语句并批量执行所有更新语句,显著提高了性能。 批量插入使用`ExecutorType.BATCH` 的一个示例代码如下: ```java @Autowired private SqlSessionTemplate sqlSessionTemplate; //...

    mybatis 根据id批量删除的实现操作

    ### 补充知识:MyBatis执行多条SQL语句 如果你需要一次性执行多条SQL删除语句,可以在数据库连接URL上开启`allowMultiQueries=true`,例如: ```url jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&...

    mybatis_insertbatch_db.rar

    2. **批处理(Batch Execution)**:MyBatis支持JDBC的批处理功能,允许我们一次性提交多条SQL语句,减少与数据库的通信次数。通过设置`SqlSession`的自动提交为false,然后在需要的时候调用`commit()`方法,可以...

    Mysql批量操作1

    在 MySQL 中,批量操作是指在单个数据库语句中执行多条操作的过程。这种操作可以大大提高数据库的性能和效率。本文将对 MySQL 批量操作进行详细的介绍,包括批量插入、批量修改和批量删除操作。 批量插入 批量插入...

    mybatis-batch.zip

    MyBatis-Batch 正是为了解决这个问题,它通过批处理技术实现了批量执行 SQL,从而显著提高了处理效率。 MyBatis-Batch 的核心功能包括: 1. **批量插入**:通过 BatchExecutor,MyBatis-Batch 可以将多个插入操作...

    mybatis基础源码及jar包

    6. **批处理**:MyBatis提供了批处理功能,可以通过设置SqlSession的自动提交为false,然后执行多条SQL后再统一提交,以提高效率。例如,使用`&lt;batch&gt;`标签可以批量插入数据。 7. **JDBC的封装**:MyBatis在JDBC的...

    myBatis使用分享

    - **批处理**:通过设置`Statement`的`Batch`执行模式,可以批量处理多条SQL,提高效率。 - **减少ResultMap**:尽量使用自动映射,避免过多的ResultMap配置,简化配置文件,提高解析速度。 - **优化SQL**:编写...

    mybatis mysql delete in操作只能删除第一条数据的方法

    在使用MyBatis进行MySQL数据库操作时,可能会遇到一个常见的问题,即使用`DELETE IN`语句删除多条记录时,实际上只能删除第一条数据。这个问题通常是由代码实现中的一个小错误导致的。本文将深入探讨这个问题的原因...

    mybatis_plus插件2.7版本破解

    5. **批量操作**:支持多条SQL语句一次性执行,提高数据库操作的效率,如批量插入、更新等。 6. **填充实体对象**:在查询结果与实体类映射过程中,MyBatis Plus可以自动将查询结果填充到对应的实体对象中,减少了...

Global site tag (gtag.js) - Google Analytics