`
zz733
  • 浏览: 11891 次
  • 性别: Icon_minigender_1
  • 来自: 株洲
社区版块
存档分类
最新评论

MyBatis源码分析(三)批量更新

 
阅读更多

主要是org.apache.ibatis.executor.BatchExecutor这个类,此类继承BaseExecutor(基本增删改查,缓存,懒加载处理)
BatchExecutor这个类有四个属性

  //批处理更新最大返回结果 
public static final int BATCH_UPDATE_RETURN_VALUE = Integer.MIN_VALUE + 1002;
//存放声明(命令)对象集合
  private final List<Statement> statementList = new ArrayList<Statement>();
// 批处理结果集合
  private final List<BatchResult> batchResultList = new ArrayList<BatchResult>();
//当前sql语句
  private String currentSql;

 一个带参数构造函数,传入配置信息和事务对象

public BatchExecutor(Configuration configuration, Transaction transaction) {
super(configuration, transaction);
}

重写了三个方法, 1.更新方法  2.查询方法 3.刷新方法
我们来看批量更新doUpdate

public int doUpdate(MappedStatement ms, Object parameterObject)
throws SQLException {
Configuration configuration = ms.getConfiguration();
StatementHandler handler = configuration.newStatementHandler(this, ms, parameterObject, RowBounds.DEFAULT, null);
BoundSql boundSql = handler.getBoundSql();
String sql = boundSql.getSql();
Statement stmt;
if (currentSql != null && sql.hashCode() == currentSql.hashCode() && sql.length() == currentSql.length()) {
int last = statementList.size() - 1;
stmt = statementList.get(last);
} else {
Connection connection = transaction.getConnection();
stmt = handler.prepare(connection);
currentSql = sql;
statementList.add(stmt);
batchResultList.add(new BatchResult(ms, sql, parameterObject));
}
handler.parameterize(stmt);
handler.batch(stmt);
return BATCH_UPDATE_RETURN_VALUE;
}

  最重要一句话就是handler.batch(stmt),实际上就是stmt.addBatch();
举个小例子来说明:

//记录1
stmt.setInt(1, 1); 
stmt.setString(2, "Cujo"); 
stmt.addBatch(); 

//记录2
stmt.setInt(1, 2); 
stmt.setString(2, "Fred"); 
stmt.addBatch(); 

//记录3
stmt.setInt(1, 3); 
stmt.setString(2, "Mark"); 
stmt.addBatch(); 

//批量执行上面3条语句
int [] counts = statement.executeBatch(); 

//Commit it 
connection.commit();

 

如果项目中要用到批量更新如何使用?
下面的映射文件,假设namespace="com.dao.Stuent"

<insert id="insertbatch" parameterType="java.util.List"> 
<selectKey keyProperty="fetchTime" order="BEFORE" 
resultType="java.lang.String"> 
SELECT CURRENT_TIMESTAMP() 
</selectKey> 
insert into kangaiduoyaodian ( depart1, depart2, product_name, 
generic_name, img, product_specification, unit, 
approval_certificate, manufacturer, marketPrice, vipPrice, 
website, fetch_time, productdesc ) values 
<foreach collection="list" item="item" index="index" 
separator=","> 
( #{item.depart1}, #{item.depart2}, #{item.productName}, 
#{item.genericName}, #{item.img}, 
#{item.productSpecification}, #{item.unit}, 
#{item.approvalCertificate}, #{item.manufacturer}, 
#{item.marketprice}, #{item.vipprice}, #{item.website}, 
#{fetchTime}, #{item.productdesc} ) 
</foreach> 
</insert> 

 调用:  SqlSession session = factory.openSession(ExecutorType.BATCH); //关键是这句

原文: http://www.ibatis3.com/thread-111-1-1.html

分享到:
评论

相关推荐

    mybatis源码分析思维导图.rar

    MyBatis是一款流行的Java...总的来说,MyBatis源码分析思维导图会涵盖MyBatis的各个关键组件、工作流程、特性以及扩展机制。通过深入学习和理解这些内容,开发者能够更好地利用MyBatis进行数据库操作,并优化其性能。

    mybatis源码分析

    通过对MyBatis源码的分析,开发者可以更深入地理解其内部运作机制,从而更好地优化应用,解决实际问题。同时,这也是一种提升个人技术水平和解决问题能力的有效途径。在阅读源码过程中,可能会遇到各种设计模式和...

    mybatis源码.rar

    源码分析是理解框架工作原理的重要途径,通过阅读MyBatis的源码,我们可以深入学习其内部机制,包括SQL动态生成、结果映射、事务管理等方面。 1. SQL动态生成:MyBatis的核心之一是SQL动态语句。在XML配置文件或...

    mybatis源码(可以直接导入idea)

    深入学习MyBatis源码,可以让我们在开发过程中更好地利用它,避免潜在的问题,并且能够根据项目需求进行扩展和定制。对于有经验的开发者,源码分析有助于优化数据库操作,提高应用程序的性能。总之,"mybatis-3-...

    尚硅谷Mybatis源码和jar包

    "尚硅谷"的Mybatis源码分析部分可能涵盖了Mybatis的内部设计和实现细节,包括上述组件的源代码解读,这对于理解Mybatis的工作流程和优化代码非常有帮助。同时,提供的课件可能包含了如何使用Mybatis进行开发、配置...

    源码分析专题之Mybatis课程一之源码分析与实现2

    MyBatis 源码分析与实现 在深入探讨 MyBatis 源码之前,我们先了解一下 MyBatis 的基本架构。MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。其核心功能包括 SQL 映射文件、动态 SQL ...

    mybatis基础源码及jar包

    - 分析MyBatis的源码,了解其内部实现机制,如如何解析XML配置文件,如何生成动态代理等。 - 学习如何配置MyBatis环境,包括设置数据源、创建SqlSessionFactory等。 - 熟悉Mapper接口和XML映射文件的编写,理解SQL与...

    mybatis源码

    MyBatis的源码分析可以从以下几个方面入手: 1. SqlSessionFactory的创建流程:理解如何从配置文件构建SqlSessionFactory。 2. SQL的动态生成:研究MyBatis如何根据方法参数动态拼接SQL。 3. Executor的执行过程:...

    mybatis全中文注释源码版.zip

    这个"mybatis全中文注释源码版.zip"文件包含了一个经过全面中文注释的MyBatis源码版本,对于想要深入理解和学习MyBatis工作原理的开发者来说,这是一个宝贵的资源。 首先,我们来看看MyBatis的核心组件: 1. **...

    mybatis-plus源码(mybatis-plus-3.5.1.zip)

    在源码分析中,我们可以重点关注以下几个模块: 1. **SqlRunner**:这是MyBatis-Plus的核心执行器,负责执行SQL语句。 2. **Executor**:执行器接口,包含SimpleExecutor、ReuseExecutor、BatchExecutor等不同类型...

    Mybatis-Self:Mybatis源码分析

    Mybatis-Self 是一个专注于Mybatis源码分析的项目,旨在帮助开发者深入理解Mybatis的工作原理,提升在实际开发中的应用水平。在这个项目中,你可以找到对Mybatis核心组件的详细解析,包括SqlSessionFactory、...

    mybatis-3.5.9 源码(mybatis-3-mybatis-3.5.9.zip)

    MyBatis 是一款著名的持久层框架...通过对 MyBatis-3.5.9 源码的阅读和分析,我们可以深入了解其实现原理,为日常开发和性能优化提供有力支持。同时,这也有助于我们更好地理解和定制 MyBatis,使其更加符合项目需求。

    Mybatis:Mybatis源码分析

    Mybatis 源码分析是理解其内部工作原理的重要途径,这对于优化数据库访问性能、解决实际问题以及定制化开发都有着极大的帮助。 1. **SqlSessionFactoryBuilder**:Mybatis的初始化始于`SqlSessionFactoryBuilder`,...

    mybatis:mybatis源码分析

    通过对MyBatis源码的深入分析,我们可以更清晰地理解其实现原理,更好地利用其特性,甚至定制自己的持久层解决方案。在阅读源码的过程中,还可以学习到设计模式、反射、AOP等Java编程技术,提升我们的编程能力。

    尚硅谷Mybatis Plus笔记+源码

    源码分析则可以帮助理解MP的底层实现,对提升Java开发技能和数据库操作能力非常有帮助。 7. **学习路径** - 首先,熟悉Mybatis的基础知识,理解Mapper、SQL映射和动态SQL的概念。 - 其次,学习Mybatis Plus的基本...

    源码分析专题之Mybatis课程一1

    以上是对 MyBatis 源码分析专题第一课中的主要知识点的概述。MyBatis 的优势在于其灵活的映射机制,允许开发者自由地编写 SQL 语句,同时提供了注解方式,使得配置更加简洁。通过深入学习和理解这些知识点,开发者...

    MyBatis Plus全套学习资料(带源码和笔记)

    五、源码分析 深入研究MyBatis Plus源码可以帮助理解其实现原理,例如如何自动填充字段、如何构造SQL语句等,这对于优化性能和解决实际问题非常有帮助。 六、笔记价值 配套的学习笔记通常会包含作者在学习过程中...

    mybatis 3.2.2源码和jar包

    5. **Executor**:执行器,MyBatis的核心组件,它包含SimpleExecutor、ReuseExecutor和BatchExecutor三种实现,分别对应简单执行、复用PreparedStatement和批量操作的场景。 6. **ParameterHandler**:处理输入参数...

    源码分析专题之Mybatis课程--实战篇1

    【MyBatis 源码分析专题之Mybatis课程--实战篇1】 在Java开发中,MyBatis是一个广泛使用的持久层框架,它简化了数据库操作,提供了灵活的SQL映射和对象关系映射(ORM)。这个专题主要分为几个部分,涵盖了MyBatis的...

    mybatis-3源码

    源码分析是深入理解框架工作原理的关键,尤其是对于 MyBatis-3 这样的高级框架。在这个 `mybatis-3` 的源码包中,我们可以探索其内部机制,包括 SQL 执行、参数绑定、结果映射等核心功能。 首先,MyBatis 的主要...

Global site tag (gtag.js) - Google Analytics