最近遇见了一个需要批量插入的操作,没办法只好又来看看了哟,话说好久都没认真研究过技术方面的东西了。由于spring3.0.5还没有集成mybatis3,所以只能使用mybatis官方自带的与spring3集成的jar包,叫mybatis-spring-1.0.0.jar。记得以前以前看过在spring+ibatis2时的批量插入代码,大概样式如下:
@Override
public void addArea(final List<Area> list){
this.getSqlMapClientTemplate().execute(new SqlMapClientCallback(){
@Override
public Object doInSqlMapClient(SqlMapExecutor executor)
throws SQLException {
executor.startBatch();
int batch = 0;
for(Area area:list){
executor.insert("area_addArea", area);
batch++;
if(batch==500){ //500条时批量插入一次
executor.executeBatch();
batch=0;
}
}
executor.executeBatch();
return null;
}
});
}
上面代码是通过回调函数手动进行批量插入,总体来说,来是比较简单的。
但是在mybatis-spring-1.0.0.jar中,并没有this.getSqlSession.execute(..)之类的方式,所以通过回调的方式也就不太可行了。在网上找到了这篇文章:
http://www.cnblogs.com/xcch/articles/2042298.html
上面这篇文章基本上说得比较清楚了,但是它并没有说怎么与spring3集成的,于是本人试着去弄一下怎么会spring集成的这个功能。mybatis-spring-1.0.0有个官方的文档,有英文的也有中文的,使用起来基本上与spring+ibatis2的思路是差不多的,即继承SqlSessionDaoSupport这个类,然后将sqlSessionTemplate注入此类的子类即可。然而批量处理时sqlSession是通过sessionFactory.openSession(ExecutorType.BATCH,false)得到的,而SqlSessionDaoSupport中通过getSqlSession()获得的sqlSession并没有可以获得SqlSessionFactory的方法,即org.apache.ibatis.session.SqlSession没有返回SqlSessionFactory的方法,不过实现了SqlSession的SqlSessionTemplate有此方法,因此只需要修改SqlSessionDaoSupport类,让其返回SqlSessionTemplate即可:
public class SqlSessionTemplateDaoSupport extends DaoSupport {
private SqlSessionTemplate sqlSession;
@Autowired(required = false)
public final void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
if (!this.externalSqlSession) {
this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
}
}
public final SqlSession getBatchSqlSession() {
return new SqlSessionTemplate(this.sqlSession.getSqlSessionFactory(),ExecutorType.BATCH);
// return sqlSession.getSqlSessionFactory().openSession(executorType, false);
}
...
可以看到新实现的SqlSessionTemplateDaoSupport类只是将返回类弄sqlSession的类型改成了SqlSessionTemplate,通过构造方法可以看出其实它本来就是SqlSessionTemplate类型的。需要注意的是上面构造sqlSession时是通过SqlSessionTemplate(this.sqlSession.getSqlSessionFactory(),ExecutorType.BATCH);来创建的,而不通过sqlSession.getSqlSessionFactory().openSession(executorType, false)来创建的。如果通过后者来创建需要手动来提交事务,即手动sqlSession.commit()。
而通过SqlSessionTemplate则不需要,因为SqlSessionTemplate中sqlSession的执行是需要通过SqlSessionInterceptor拦截的,这个动态拦截器会在执行方法后自己执行sqlSession.commit()方法。
分享到:
相关推荐
3. 在Service层中调用Mapper接口,准备批量插入的数据: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public void batchInsert(List<User> users) { userMapper....
3. **数据库配置**:如InnoDB引擎的缓冲池大小、重做日志大小等,都会影响批量插入的性能。 4. **网络延迟**:数据库服务器与应用服务器之间的网络状况也会影响性能。 测试过程中,我们可以记录以下指标:总耗时、...
本文将深入探讨如何在 Mybatis Plus 中自定义批量插入和批量更新,并根据唯一索引来确保数据的唯一性。 首先,了解 Mybatis Plus 的批量操作基础。Mybatis Plus 提供了 `batchInsert()` 和 `batchUpdate()` 方法来...
Mybatis实现多表联合查询和批量插入 Mybatis是一款流行的持久层框架,它可以帮助开发者快速、高效地访问数据库。在实际开发中,经常需要对多个表进行联合查询,或者对大量数据进行批量插入。本文将详细介绍如何使用...
Spring 中使用 MyBatis 实现批量插入的示例代码 一、前言 在实际开发中,批量插入数据是非常常见的需求。使用 Spring 框架结合 MyBatis 框架,可以实现高效的批量插入操作。本文将详细介绍 Spring 中使用 MyBatis ...
3. **性能监控**:持续监控批量插入的性能,根据实际情况调整批处理大小,找到最佳的批量大小以平衡性能和资源使用。 4. **错误处理**:设计合理的错误处理机制,当批量插入失败时,能够有效地回滚事务,并记录或...
mybatis-plus.executor-type=BATCH # 设置为 BATCH 执行器以启用批量插入 ``` 3. 创建实体类: 为要批量插入的数据创建对应的实体类,确保每个字段都有对应的getter和setter方法。例如,有一个`User`类: ```java ...
本文将深入探讨MyBatis中实现批量插入的两种高效方式。 ### 1. MyBatis `foreach` 标签 `foreach` 是MyBatis中用于在SQL语句中迭代集合的标签,特别适合构建`IN`条件。`foreach` 元素的属性包括: - `item`: 集合...
使用方法请看博客 https://blog.csdn.net/bandaotixiruiqiang/article/details/72478361#comments_12931827
只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢
MyBatis批量插入Update MyBatis批量插入是一种高效的数据插入方式,通过将多条数据一次性插入数据库,可以大大提高插入速度。在实际测试中,使用MyBatis批量插入可以达到至少快一倍的执行效率。 MyBatis批量插入的...
MyBatis foreach批量插入数据:Oracle与MySQL区别介绍 MyBatis foreach批量插入数据是一种高效的数据批量插入方式,通过foreach标签可以实现批量插入数据。但是,在不同的数据库管理系统中,foreach标签的使用有...
本篇将深入探讨如何在Spring Boot项目中整合Mybatis,实现对SQL Server数据库的跨库批量插入操作。 首先,我们需要在Spring Boot项目中引入相关的依赖。对于Mybatis的支持,我们需要添加Mybatis和其Spring Boot ...
Mybatis数据批量插入实现详解 Mybatis是一种流行的持久层框架,它提供了多种方式来实现数据批量插入。本文将详细介绍如何使用Mybatis实现数据批量插入。 使用foreach标签实现批量插入 在Mybatis中,可以使用...
总的来说,"mybatis-generator代码生成插件(中文注释,生成批量插入及修改)"是一款强大的开发辅助工具,它通过自动化代码生成,降低了开发难度,提高了代码质量,尤其是在处理复杂数据关系和大量数据操作时,其...
Java实现使用Mybatis将数据批量插入到Oracle数据库,并且可以使用Oracle序列来生成主键
MyBatis动态SQL和批量插入的应用 MyBatis是一款功能强大且灵活的持久层框架,提供了多种方式来对数据库进行交互。其中,动态SQL是一种非常强大的特性,能够根据不同的条件生成不同的SQL语句。下面将详细介绍MyBatis...
3. **批量插入的Mapper方法**: 关键在于`<insert>`标签中的`addTrainRecordBatch`方法,其`parameterType`设置为`java.util.List`,表明这个方法接收一个列表作为参数。`<foreach>`标签用于遍历列表中的每个元素,...
这篇文章将详细讲解如何在MyBatis的Mapper配置文件中实现批量插入。 首先,批量插入的数据通常来源于一个集合,如List对象,因此在Mapper接口中,我们需要定义一个方法接收这样的参数。例如,我们可以创建一个`...
oracle中insert, 插入批量插入及union