-
mybatis-plus Sqlsession批量执行sql语句
2018-06-15 16:12:29正常使用mybaitis 在配置文件...获取Dao就可以直接用了 UserMapper mapper = sqlSession.getMapper(UserMapper.class); 你会发现后台不会创建sqlsession了 而是用的同一个 <bean class="org.mybatis....正常使用mybaitis 在配置文件创建bean 就可以在使用时
@Autowired SqlSession sqlSession; 获取Dao就可以直接用了 UserMapper mapper = sqlSession.getMapper(UserMapper.class); 你会发现后台不会创建sqlsession了 而是用的同一个
<bean class="org.mybatis.spring.SqlSessionTemplate" id="sqlSession">
<constructor-arg index="0" ref="sqlSessionFactory"/> <constructor-arg index="1" value="BATCH"/> </bean>
而mybatis-plus 必须配置其封装后的 MybatisSqlSessionTemplate
<bean class="com.baomidou.mybatisplus.MybatisSqlSessionTemplate" id="sqlSession"> <constructor-arg index="0" ref="sqlSessionFactory"/> <constructor-arg index="1" value="BATCH"/> </bean>
完毕 -
[MyBatis]获取数据库连接、批量执行SQL语句
2015-06-26 17:22:27Configuration c = this... batchExecutor.doUpdate(c.getMappedStatement(sql), entity); if (i++ > 0 && i % BATCH_SIZE == 0) { batchExecutor.doFlushStatements(); } } batchExecutor.doFlushStatements();Configuration c = this.getSqlSession().getConfiguration(); ManagedTransactionFactory managedTransactionFactory = new ManagedTransactionFactory(); BatchExecutor batchExecutor = new BatchExecutor(c,managedTransactionFactory.newTransaction(this.getSqlSession().getConnection(), false)); int i = 0; for (T entity : collection) { batchExecutor.doUpdate(c.getMappedStatement(sql), entity); if (i++ > 0 && i % BATCH_SIZE == 0) { batchExecutor.doFlushStatements(); } } batchExecutor.doFlushStatements();
-
mybatis 批量修改_Mybatis 的三种执行器,你了解过吗?
2020-11-25 15:51:43Mybatis 的三种执行器❝在企业开发中, 对数据库的批量操作, 是一个非常常见的操作, Mybatis提供了批量执行器, 来支持批量操作.❞Mybatis sql执行器Mybatis 支持全局修改执行器, 参数名为: defaultExecutorType. 但是...Mybatis 的三种执行器
❝
在企业开发中, 对数据库的批量操作, 是一个非常常见的操作, Mybatis提供了批量执行器, 来支持批量操作.
❞Mybatis sql执行器
Mybatis 支持全局修改执行器, 参数名为:
defaultExecutorType
. 但是笔者并不推荐这种方式,笔者建议在获取sqlSession
对象时设置. Mybatis 共有三种执行器:SIMPLE
: 默认的执行器, 对每条sql进行预编译->设置参数->执行等操作BATCH
: 批量执行器, 对相同sql进行一次预编译, 然后设置参数, 最后统一执行操作REUSE
:REUSE
执行器会重用预处理语句prepared statements
如何设置执行器
1.局部设置
在获取
sqlSession
时设置, 需要注意的时, 如果选择的是批量执行器时, 需要手工提交事务。// 获取指定执行器的sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)
// 获取批量执行器时, 需要手动提交事务
sqlSession.commit();2.全局设置
可在全局配置文件中配置。
<settings>
<setting name="defaultExecutorType" value="BATCH" />
settings>三种执行器效率测试
xml代码:
<mapper namespace="com.ywh.demo.mapper.StudentMapper">
<insert id="save" useGeneratedKeys="true" keyProperty="id">
insert into t_student values (null , #{name}, #{age}, #{sex}, #{birth})
insert>
mapper>测试代码:
对于一条sql语句的执行不同的执行器没有太大的差异,所以这边采用插入
10000
条数据的方式。public class TestStudentMapper {
// 批量保存方法
private void batchSave(StudentMapper mapper) {
// 初始化10000个对象
List list = new ArrayList<>();for (int i = 0; i < 10000; i++) {
list.add(new StudentPO("zhangsan_" + i, "M",20 + i % 10, LocalDate.now()));
}// 批量执行long start = System.currentTimeMillis();for (StudentPO studentPO : list) {
mapper.save(studentPO);
}long end = System.currentTimeMillis();// 输出执行耗时
System.out.println("耗时:" + (end - start) + " ms!");
}// 默认执行器@Testpublic void test_SIMPLE(){// 获取自动提交事务的Maper
StudentMapper mapper = SqlSessionUtil.getMapperAutoTx(StudentMapper.class);// 执行批量保存
batchSave(mapper);
}// 重用预编译执行器@Testpublic void test_REUSE(){// 获取批量保存sqlSession
SqlSession sqlSession = SqlSessionUtil.openSession(ExecutorType.REUSE, true);// 获取Mapper 对象
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);// 执行批量保存
batchSave(mapper);
}// 批量执行器@Testpublic void test_BATCH(){// 获取批量保存sqlSession
SqlSession sqlSession = SqlSessionUtil.openSession(ExecutorType.BATCH, true);// 获取Mapper 对象
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);// 执行批量保存
batchSave(mapper);
sqlSession.commit();
}
}测试结果:
simple
方式:从执行日志可以看出, 每次插入操作, 都会执行编译, 设置参数, 执行sql操作.
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Preparing: insert into t_student values (null , ?, ?, ?, ?)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_0(String), 20(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- <== Updates: 1
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Preparing: insert into t_student values (null , ?, ?, ?, ?)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_1(String), 21(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- <== Updates: 1
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Preparing: insert into t_student values (null , ?, ?, ?, ?)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_2(String), 22(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- <== Updates: 1
...
耗时:21575 ms!reuse
方式:从执行日志可以看出, 只有第一次插入操作, 执行了sql编译步骤, 对其它插入操作执行了设置参数, 执行sql的操作.
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Preparing: insert into t_student values (null , ?, ?, ?, ?)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_0(String), 20(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- <== Updates: 1
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_1(String), 21(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- <== Updates: 1
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_2(String), 22(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- <== Updates: 1
...
耗时:19322 ms!batch
方式:从执行日志可以看出, 只对第一次插入操作执行了sql编译操作, 对其它插入操作仅执行了设置参数操作, 最后统一执行.
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Preparing: insert into t_student values (null , ?, ?, ?, ?)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_0(String), 20(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_1(String), 21(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_2(String), 22(Integer), M(String), 2020-07-24(Date)
...
耗时:835 ms!「结论:」 在做批量操作时, 使用批量执行器, 性能会有很大的提升.
点击关注不迷路
更多技术分享、优质文章尽在作者的公众号:「程序员的小黑屋」,长按下图订阅,第一时间获取更新。↓↓↓
-
list mybatis批量保存_Mybatis 的三种执行器,你了解过吗?
2021-01-09 21:31:34Mybatis 的三种执行器❝在企业开发中, 对数据库的批量操作, 是一个非常常见的操作, Mybatis提供了批量执行器, 来支持批量操作.❞Mybatis sql执行器Mybatis 支持全局修改执行器, 参数名为: defaultExecutorType. 但是...Mybatis 的三种执行器
❝
在企业开发中, 对数据库的批量操作, 是一个非常常见的操作, Mybatis提供了批量执行器, 来支持批量操作.
❞Mybatis sql执行器
Mybatis 支持全局修改执行器, 参数名为:
defaultExecutorType
. 但是笔者并不推荐这种方式,笔者建议在获取sqlSession
对象时设置. Mybatis 共有三种执行器:SIMPLE
: 默认的执行器, 对每条sql进行预编译->设置参数->执行等操作BATCH
: 批量执行器, 对相同sql进行一次预编译, 然后设置参数, 最后统一执行操作REUSE
:REUSE
执行器会重用预处理语句prepared statements
如何设置执行器
1.局部设置
在获取
sqlSession
时设置, 需要注意的时, 如果选择的是批量执行器时, 需要手工提交事务。// 获取指定执行器的sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)
// 获取批量执行器时, 需要手动提交事务
sqlSession.commit();2.全局设置
可在全局配置文件中配置。
<settings>
<setting name="defaultExecutorType" value="BATCH" />
settings>三种执行器效率测试
xml代码:
<mapper namespace="com.ywh.demo.mapper.StudentMapper">
<insert id="save" useGeneratedKeys="true" keyProperty="id">
insert into t_student values (null , #{name}, #{age}, #{sex}, #{birth})
insert>
mapper>测试代码:
对于一条sql语句的执行不同的执行器没有太大的差异,所以这边采用插入
10000
条数据的方式。public class TestStudentMapper {
// 批量保存方法
private void batchSave(StudentMapper mapper) {
// 初始化10000个对象
List list = new ArrayList<>();for (int i = 0; i < 10000; i++) {
list.add(new StudentPO("zhangsan_" + i, "M",20 + i % 10, LocalDate.now()));
}// 批量执行long start = System.currentTimeMillis();for (StudentPO studentPO : list) {
mapper.save(studentPO);
}long end = System.currentTimeMillis();// 输出执行耗时
System.out.println("耗时:" + (end - start) + " ms!");
}// 默认执行器@Testpublic void test_SIMPLE(){// 获取自动提交事务的Maper
StudentMapper mapper = SqlSessionUtil.getMapperAutoTx(StudentMapper.class);// 执行批量保存
batchSave(mapper);
}// 重用预编译执行器@Testpublic void test_REUSE(){// 获取批量保存sqlSession
SqlSession sqlSession = SqlSessionUtil.openSession(ExecutorType.REUSE, true);// 获取Mapper 对象
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);// 执行批量保存
batchSave(mapper);
}// 批量执行器@Testpublic void test_BATCH(){// 获取批量保存sqlSession
SqlSession sqlSession = SqlSessionUtil.openSession(ExecutorType.BATCH, true);// 获取Mapper 对象
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);// 执行批量保存
batchSave(mapper);
sqlSession.commit();
}
}测试结果:
simple
方式:从执行日志可以看出, 每次插入操作, 都会执行编译, 设置参数, 执行sql操作.
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Preparing: insert into t_student values (null , ?, ?, ?, ?)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_0(String), 20(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- <== Updates: 1
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Preparing: insert into t_student values (null , ?, ?, ?, ?)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_1(String), 21(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- <== Updates: 1
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Preparing: insert into t_student values (null , ?, ?, ?, ?)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_2(String), 22(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- <== Updates: 1
...
耗时:21575 ms!reuse
方式:从执行日志可以看出, 只有第一次插入操作, 执行了sql编译步骤, 对其它插入操作执行了设置参数, 执行sql的操作.
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Preparing: insert into t_student values (null , ?, ?, ?, ?)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_0(String), 20(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- <== Updates: 1
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_1(String), 21(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- <== Updates: 1
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_2(String), 22(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- <== Updates: 1
...
耗时:19322 ms!batch
方式:从执行日志可以看出, 只对第一次插入操作执行了sql编译操作, 对其它插入操作仅执行了设置参数操作, 最后统一执行.
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Preparing: insert into t_student values (null , ?, ?, ?, ?)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_0(String), 20(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_1(String), 21(Integer), M(String), 2020-07-24(Date)
[main][DEBUG][o.z.l.m.l.mapper.StudentMapper.save]- ==> Parameters: zhangsan_2(String), 22(Integer), M(String), 2020-07-24(Date)
...
耗时:835 ms!「结论:」 在做批量操作时, 使用批量执行器, 性能会有很大的提升.
点击关注不迷路
更多技术分享、优质文章尽在作者的公众号:「程序员的小黑屋」,长按下图订阅,第一时间获取更新。↓↓↓
-
mybatis批量update,返回行数为-1
2020-07-03 10:38:48mybatis批量update,返回行数为-1 mybatis批量更新返回结果为-1...BATCH可以批量更新操作,缓存SQL以提高性能,缺陷就是无法获取update、delete返回的行数。 如果要拿到更新条数,修改如下: 在mybatis-config.xml配 -
mybatis批量更新报错解决办法
2020-04-13 21:54:09然后编写批量更新语句时候,发现老是更新失败,但是从控制台获取的sql语句又能够在数据库中正常执行,这个小坑让我花了些时间,为了避免以后再犯错,在此这里来记录下解决办法。 二、报错信息 注:在使用本方案解决... -
mybatis 批量提交清除缓存_重学Mybatis(三)-------缓存 (含面试题)
2021-01-23 03:28:45mybatis的一级缓存mybatis的一级缓存是基于sqlsession为生命周期的,如果多次执行同一个sql语句时,只需第一次连接数据库查询,剩下几次均可通过mybatis缓存获取。生命周期:当你这个sqlsession没有了,会... -
21. Mybatis 的三种执行器
2019-08-27 17:05:52在企业开发中, 对数据库的批量操作, 是一个非常常见的操作, Mybatis提供了批量执行器, 来支持批量操作. 1. Mybatis sql执行器 Mybatis 支持全局修改执行器, 参数名为: defaultExecutorType. 但是笔者并不推荐这种... -
Mybatis执行Update返回行数为负数
2019-04-17 14:22:52获取mybatis的update行数,总是返回负数。后来在官网上找到原因,是由于defaultExecutorType的引起的,defaultExecutorType有三个执行器SIMPLE、REUSE和BATCH。其中BATCH可以批量更新操作缓存SQL以提高性能,但是有... -
JDBC执行过程回顾与MyBatis执行过程
2020-08-22 17:56:203)执行SQL 4)读取结果 1.2、预编译的三种执行器 三种执行器都支持批处理 1)Mysql不支持(setFetchSize)设置一次性读取多少行。 2)addBatch批量操作,将多个SQL合并在一起,最后调executeBatch一起发送至数据库... -
mybatis plus 批量保存_重学Mybatis(三)-------缓存 (含面试题)
2020-12-18 21:33:24mybatis的一级缓存mybatis的一级缓存是基于sqlsession为生命周期的,如果多次执行同一个sql语句时,只需第一次连接数据库查询,剩下几次均可通过mybatis缓存获取。生命周期:当你这个sqlsession没有了,会... -
mybatis之StatementHandler
2020-06-14 21:05:46StatementHandler接口中的功能很多,例如创建Statement对象,为SQL语句绑定实参,执行select、insert、update、delete等多种类型的SQL语句,批量执行SQL语句,将结果集映射成结果对象。 StatementHandler接口的定义... -
mybatis面试题
2020-05-23 15:41:58为了应付面试,搞了一些面试题。 什么是Mybatis? Mybaits的优点:MyBatis框架的缺点: ...Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式? 如何执行批量插入? 如何获取自. -
Mybatis使用总结(自增长、多条件、批量操作、多表查询等等)...
2020-09-29 18:09:20(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 (3)通过xml 文件或注解的方式将要执行的各 -
Mybatis的基本使用
2021-01-03 12:10:48文章目录Mybatis基本使用使用的一般流程驼峰映射成下划线JDBCTYPE模糊查询插入数据,以及获取当前插入数据的主键执行流程如下批量插入数据 利用foreachupdate语句 以及使用 \Mybatis基本使用 通过简单的xml或注解来... -
MyBatis之核心类
2019-06-03 10:20:21核心类 参数处理器ParameterHandler(默认参数处理器DefaultParameterHandler) 参数解析:参数映射配置、参数映射解析、参数类型解析 ...简单执行器SimpleExecutor、批量执行器BatchExecuto... -
Mybatis foreach遍历
2019-06-14 16:53:48获取的要删除的用户的id,在dao层进行遍历这些id,每次都执行一次 delete from user where id=?;语句 这样的效率很低; >思路二 获取的要删除的用户的id,在dao层使用 'in' 或者 'or' 将这些id拼接到一个SQL... -
Mybatis更新数据返回记录数为负数
2020-12-11 14:14:53将defaultExecutorType配置为BATCH,可以批量更新操作缓存SQL以提高性能,但是有个缺陷就是无法获取update、delete返回的行数。 MyBatis配置文件中defaultExecutorType有三个参数 SIMPLE:执行器执行其它语句 REUSE... -
mybatis的update或insert返回-2761246的问题
2018-08-20 22:42:24而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优; 但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合... -
Mybatis小练习 报错 求大神指导,信息详尽
2019-05-28 11:48:57#{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值 --> <!-- 将插入数据的主键返回,返回到user对象中 SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值... -
sqlserver55555_JDBC 5种常见数据库连接的获取
2020-12-30 19:21:47Java对数据库的操作主要以下几步1)加载驱动,获取数据库连接2)开启事务3)创建语句4)批量执行操作或执行查询获取结果集,处理结果5)提交事务6)关闭连接第一步:加载驱动类,获取数据库连接,条件是要有对应的第三... -
超简单,超强大的ORM框架,OQL,SQL,ES多查询引擎,超越JPA,Hibernate,Mybatis-源码
2021-01-30 03:47:00批量插入相同类型的多个实体并返回生成的密钥 更新单个现有实体-一次更新实体的所有字段 获取多对一关系(部门公司) 获取一对多关系(公司部门) 更新实体一对多关系(公司部门)-添加两项,更新两项并删除一项-... -
mybatis 实际开发中踩过的坑--01
2020-06-08 10:45:12在同一个事物内,同一条sql默认只执行一次,并将结果存入缓存中,因此多次查询会返回同样的值 因此在一个事物中,批量保存数据时,根据序列函数获取唯一id就会出错 解决方法: 序列函数加注解 @Options(flushCache...