- 浏览: 980911 次
文章分类
- 全部博客 (428)
- Hadoop (2)
- HBase (1)
- ELK (1)
- ActiveMQ (13)
- Kafka (5)
- Redis (14)
- Dubbo (1)
- Memcached (5)
- Netty (56)
- Mina (34)
- NIO (51)
- JUC (53)
- Spring (13)
- Mybatis (17)
- MySQL (21)
- JDBC (12)
- C3P0 (5)
- Tomcat (13)
- SLF4J-log4j (9)
- P6Spy (4)
- Quartz (12)
- Zabbix (7)
- JAVA (9)
- Linux (15)
- HTML (9)
- Lucene (0)
- JS (2)
- WebService (1)
- Maven (4)
- Oracle&MSSQL (14)
- iText (11)
- Development Tools (8)
- UTILS (4)
- LIFE (8)
最新评论
-
Donald_Draper:
Donald_Draper 写道刘落落cici 写道能给我发一 ...
DatagramChannelImpl 解析三(多播) -
Donald_Draper:
刘落落cici 写道能给我发一份这个类的源码吗Datagram ...
DatagramChannelImpl 解析三(多播) -
lyfyouyun:
请问楼主,执行消息发送的时候,报错:Transport sch ...
ActiveMQ连接工厂、连接详解 -
ezlhq:
关于 PollArrayWrapper 状态含义猜测:参考 S ...
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper) -
flyfeifei66:
打算使用xmemcache作为memcache的客户端,由于x ...
Memcached分布式客户端(Xmemcached)
上一篇文章中,我们讲到DefaultSqlSession的查询,今天来讲更新
//DefaultSqlSession
从DefaultSqlSession类,看一看出插入,删除,更新操作实际上都是调用update方法,下面
我们来看一下这个方法
update方法委托给具体的executor,executor默认为CachingExecutor,CachingExecutor为执行器代理,具体executor
有SimpleExecutor,BatchExecutor;
下面来看SimpleExecutor
//CachingExecutor
具体执行器SimpleExecutor
//BaseExecutor
//SimpleExecutor
//创建StatementHandler,创建Statement,执行查询,Statement关闭,上一篇我们已经说,这里就不说了,
我们看一下BatchExecutor
//执行statement
handler为RoutingStatementHandler,RoutingStatementHandler为StatementHandler的代理类,具体可能为SimpleStatementHandler,PreparedStatementHandler,
CallableStatementHandler;
下面我们来看一下RoutingStatementHandler的batch
//RoutingStatementHandler
RoutingStatementHandler的batch方法实际上,是调用代理的batch方法,
//PreparedStatementHandler
//CallableStatementHandler
具体为调用CallableStatement和PreparedStatement的批处理函数
讲到批处理,我们来看一下 DefaultSqlSession的flushStatements方法
这里我们来看一下具体executor的flushStatements
//BatchExecutor
BatchExecutor的doFlushStatements主要是关闭statementList中的Statement,
清空statementList与batchResultList
//SimpleExecutor
SimpleExecutor没做任何事情,从上可以看出doFlushStatements,主要是BatchExecutor会用到;
总结:
Sqlsession的update,通过CachingExecutor代理,CachingExecutor是SimpleExecutor,BatchExecutor等执行器代理执行器;CachingExecutor是调用Executor的相应方法。SimpleExecutor,BatchExecutor为实际执行器,继承BatchExecutor。SimpleExecutor更新,构造StatementHandler,获取Statement,执行查询,关闭statement。BatchExecutor的doFlushStatements主要是关闭statementList中的Statement,
清空statementList与batchResultList
//DefaultSqlSession
public class DefaultSqlSession implements SqlSession { private Configuration configuration; private Executor executor; private boolean dirty; public DefaultSqlSession(Configuration configuration, Executor executor) { this.configuration = configuration; this.executor = executor; dirty = false; } //插入 public int insert(String statement) { return insert(statement, null); } public int insert(String statement, Object parameter) { //委托给update方法 return update(statement, parameter); } public int update(String statement) { return update(statement, null); } //删除 public int delete(String statement) { //委托给update return update(statement, null); } public int delete(String statement, Object parameter) { return update(statement, parameter); } public int update(String statement, Object parameter) { int i; try { dirty = true; org.apache.ibatis.mapping.MappedStatement ms = configuration.getMappedStatement(statement); //委托给executor的update i = executor.update(ms, wrapCollection(parameter)); } } //刷新Statements public List flushStatements() { List list; try { list = executor.flushStatements(); } } }
从DefaultSqlSession类,看一看出插入,删除,更新操作实际上都是调用update方法,下面
我们来看一下这个方法
public int update(String statement, Object parameter) { int i; try { dirty = true; org.apache.ibatis.mapping.MappedStatement ms = configuration.getMappedStatement(statement); //委托给executor的update i = executor.update(ms, wrapCollection(parameter)); } }
update方法委托给具体的executor,executor默认为CachingExecutor,CachingExecutor为执行器代理,具体executor
有SimpleExecutor,BatchExecutor;
下面来看SimpleExecutor
//CachingExecutor
public int update(MappedStatement ms, Object parameterObject) throws SQLException { flushCacheIfRequired(ms); return _flddelegate.update(ms, parameterObject); }
具体执行器SimpleExecutor
//BaseExecutor
public int update(MappedStatement ms, Object parameter) throws SQLException { ErrorContext.instance().resource(ms.getResource()).activity("executing an update").object(ms.getId()); if(closed) { throw new ExecutorException("Executor was closed."); } else { clearLocalCache(); //委托给doUpdate return doUpdate(ms, parameter); } } //待子类扩展 protected abstract int doUpdate(MappedStatement mappedstatement, Object obj) throws SQLException;
//SimpleExecutor
public int doUpdate(MappedStatement ms, Object parameter) throws SQLException { Statement stmt = null; int i; Configuration configuration = ms.getConfiguration(); //创建StatementHandler StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null); //创建Statement stmt = prepareStatement(handler, ms.getStatementLog()); //执行查询 i = handler.update(stmt); //Statement关闭 closeStatement(stmt); }
//创建StatementHandler,创建Statement,执行查询,Statement关闭,上一篇我们已经说,这里就不说了,
我们看一下BatchExecutor
public class BatchExecutor extends BaseExecutor { public static final int BATCH_UPDATE_RETURN_VALUE = -2147482646; private final List statementList = new ArrayList();//statement集合 private final List batchResultList = new ArrayList();//结果集合 private String currentSql; private MappedStatement currentStatement; public BatchExecutor(Configuration configuration, Transaction transaction) { super(configuration, transaction); } public int doUpdate(MappedStatement ms, Object parameterObject) throws SQLException { Configuration configuration = ms.getConfiguration(); //创建StatementHandler StatementHandler handler = configuration.newStatementHandler(this, ms, parameterObject, RowBounds.DEFAULT, null, null); BoundSql boundSql = handler.getBoundSql(); String sql = boundSql.getSql(); Statement stmt; if(sql.equals(currentSql) && ms.equals(currentStatement)) { //如果sql与currentSql相等,则从statementList获取Statement int last = statementList.size() - 1; stmt = (Statement)statementList.get(last); BatchResult batchResult = (BatchResult)batchResultList.get(last); batchResult.addParameterObject(parameterObject); } else { //获取连接 java.sql.Connection connection = getConnection(ms.getStatementLog()); //创建statement stmt = handler.prepare(connection); currentSql = sql; currentStatement = ms; //将statement添加到statementList statementList.add(stmt); batchResultList.add(new BatchResult(ms, sql, parameterObject)); } //设置statement参数 handler.parameterize(stmt); // handler.batch(stmt); return -2147482646; } }
//执行statement
handler.batch(stmt);
handler为RoutingStatementHandler,RoutingStatementHandler为StatementHandler的代理类,具体可能为SimpleStatementHandler,PreparedStatementHandler,
CallableStatementHandler;
下面我们来看一下RoutingStatementHandler的batch
//RoutingStatementHandler
public class RoutingStatementHandler implements StatementHandler { private final StatementHandler _flddelegate; public void batch(Statement statement) throws SQLException { _flddelegate.batch(statement); } }
RoutingStatementHandler的batch方法实际上,是调用代理的batch方法,
//PreparedStatementHandler
public class PreparedStatementHandler extends BaseStatementHandler { public void batch(Statement statement) throws SQLException { PreparedStatement ps = (PreparedStatement)statement; ps.addBatch(); } }
//CallableStatementHandler
public void batch(Statement statement) throws SQLException { CallableStatement cs = (CallableStatement)statement; cs.addBatch(); }
具体为调用CallableStatement和PreparedStatement的批处理函数
讲到批处理,我们来看一下 DefaultSqlSession的flushStatements方法
public List flushStatements() { List list; try { list = executor.flushStatements(); } }
这里我们来看一下具体executor的flushStatements
//BatchExecutor
public List doFlushStatements(boolean isRollback) throws SQLException { List results; List list; results = new ArrayList(); if(!isRollback) break MISSING_BLOCK_LABEL_83; list = Collections.emptyList(); Statement stmt; //关闭statementList中的Statement for(Iterator i$ = statementList.iterator(); i$.hasNext(); closeStatement(stmt)) stmt = (Statement)i$.next(); //currentSql,设为null currentSql = null; statementList.clear(); batchResultList.clear(); return list; }
BatchExecutor的doFlushStatements主要是关闭statementList中的Statement,
清空statementList与batchResultList
//SimpleExecutor
public List doFlushStatements(boolean isRollback) throws SQLException { return Collections.emptyList(); }
SimpleExecutor没做任何事情,从上可以看出doFlushStatements,主要是BatchExecutor会用到;
总结:
Sqlsession的update,通过CachingExecutor代理,CachingExecutor是SimpleExecutor,BatchExecutor等执行器代理执行器;CachingExecutor是调用Executor的相应方法。SimpleExecutor,BatchExecutor为实际执行器,继承BatchExecutor。SimpleExecutor更新,构造StatementHandler,获取Statement,执行查询,关闭statement。BatchExecutor的doFlushStatements主要是关闭statementList中的Statement,
清空statementList与batchResultList
发表评论
-
Mybatis缓存实现
2016-12-07 10:36 979SqlSessionFactory初始化:http://don ... -
DefaultSqlSession第三讲-事务提交,回滚,关闭SqlSession,清除缓存
2016-11-20 11:07 5699上面两篇讲过query和update及flushStateme ... -
DefaultSqlSession第一讲query解析
2016-11-20 11:06 1622上一篇文章:我们说过DefaultSqlSession,Def ... -
Mybatis的SqlSession解析
2016-11-20 11:02 2544在前文中,Mybatis使用教程中,有下面一段代码: Sql ... -
Mybatis的Reflector解析
2016-11-18 12:53 2160Mybatis的MetaObject解析:http://don ... -
Mybatis的MetaObject解析
2016-11-18 11:40 9576SqlSessionFactory初始化:http://don ... -
mybatis 动态标签语句的解析(BoundSql)
2016-10-30 09:48 5755SqlSessionFactory初始化:http://don ... -
Mybatis的Environment解析详解
2016-10-29 18:28 1992SqlSessionFactory初始化:http://don ... -
Mybatis 解析Mapper(class)
2016-10-26 11:44 3346SqlSessionFactory初始化:http://don ... -
Mybatis加载解析Mapper(xml)文件第二讲
2016-10-25 21:30 4783SqlSessionFactory初始化:http://don ... -
Mybatis加载解析Mapper(xml)文件第一讲
2016-10-25 16:51 6176SqlSessionFactory初始化:http://don ... -
SqlSessionFactory初始化
2016-10-20 15:38 2454mybatis 使用教程:http://donald-drap ... -
mybatis 使用教程
2016-10-14 09:03 907Myeclispe下mybatis generator的使 ... -
Spring+Mybatis多数据源的实现
2016-09-21 18:15 3094浅谈Spring事务隔离级别:http://www.cnblo ... -
mybaitis CDATA 防止字符被解析
2016-08-17 18:45 724在使用mybatis 时我们sql是写在xml 映射文件中,如 ... -
Myeclispe下mybatis generator的使用
2016-07-05 18:05 1375准备:下载附件包解压到myeclispe的dropins文件夹 ...
相关推荐
hsbc statement template
test-sql-statement.frx
这个标题"switch-statement-examples_C-C++_statement_"表明我们将深入探讨`switch`语句在C和C++中的用法,并通过实例进行解析。 `switch`语句的基本语法如下: ```c switch(expression) { case value1: // code...
fluent-plugin-mysql-prepared-statement, 的插件 流利的插件mysql准备语句查询 安装 td-agent(Linux) /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-mysql-prepared-statement td-agent(Mac...
以下是对"Efficiency Analysis of sql statement.zip_statement"中涉及的知识点的详细说明: 1. **索引的使用**:索引是提高SQL查询速度的重要手段。为经常用于查询的列创建索引可以大大加快查找速度。但需要注意的...
本教程将深入浅出地介绍如何使用JDBC的Statement接口来执行数据库的增加(INSERT)和删除(DELETE)操作,帮助初学者从入门到熟练掌握这一核心技术。 首先,JDBC的核心是Java.sql包中的DriverManager类,它负责管理...
vl-ui-cookie声明 Cookieverklaring Pagina安装$ npm install --save vl-ui-cookie-statement原料药强,可以保护车辆的功能。演示版De pagina bevat een overzicht van de Mogelijkheden遇到了代号voorbeelden。 ...
本讲主要探讨了C语言中的程序结构,包括C程序的组成、基本结构以及数据输入输出。 首先,C程序通常由一个或多个源程序文件组成,每个文件可能包含不同的函数。预编译命令如`#include`用于引入头文件,例如`#include...
在本项目中,JavaScript主要用于前端交互逻辑,处理用户输入的查询条件,计算查询概率,并与后端服务器进行通信,实时更新和反馈监控结果。同时,JavaScript的事件驱动模型也能有效地处理大量并发查询请求,确保系统...
简化逻辑陈述采取逻辑陈述并将其简化。用法将简化函数应用于以下概述的一种类型。例子消除双重否定import { simplify , ... statement , statement : 'statement 3' , } , } ,}simplify ( myNotStatement ) // {
2. 执行计划分析: 工具会提供SQL语句的执行计划,这是理解查询如何在数据库内部执行的关键。执行计划展示了数据是如何被访问、排序和组合的,有助于发现潜在的索引问题或者不恰当的表连接方式。 3. 资源消耗统计...
更新收藏 我们建议在安装python, 和其他依赖项之前在工作。 需要Make v4.0或更高版本。 $ make makerules $ make init $ make collect 每晚收藏 该集合由。 建立国家数据集 然后可以将收集的文件转换为国家数据集...
在vscode中用分号完成语句。 模仿IntelliJ的完整声明。 换句话说: 用完整的正常... 您可以将extension.complete-statement重新绑定到ctrl+shift+enter 。 顺便说一句, ctrl+; 比ctrl+shift+enter更容易记住和键入。
作为会话进行编程2:使用if ... end和Statement修饰符进行选择学习目标写一个if...end语句写一个if...else...end语句写一个if...elsif...else...end语句使用语句修饰符更改默认顺序介绍我们已经介绍了Ruby在读取和...
作为会话进行编程2:使用if ... end和Statement修饰符进行选择 学习目标 写一个if...end语句 写一个if...else...end语句 写一个if...elsif...else...end语句 使用语句修饰符更改默认顺序 介绍 我们已经介绍了Ruby在...
#### 二、BNF与C语言语法 **Backus-Naur Form (BNF)** 是一种用于定义上下文无关文法的形式化语言,它提供了一种简洁明了的方式来描述编程语言的语法结构。在C语言中,通过BNF可以清晰地定义语言的各个组成部分,如...
prepareStatement和Statement的区别 prepareStatement和Statement是 Java 中两个常用的数据库操作接口,它们都可以用来执行 SQL 语句,但是它们之间有着明显的区别。 首先,从创建时的区别开始,Statement 需要...
帐户收入报表程序 待办事项清单 创建对齐方式以充当终端中的表 选择继续计算资产负债表 资产负债表代码 授予用户创建新价值的完整权限(负债,资产等的详细信息) 向用户显示平衡值 在终端中创建路线以用作资产负债...
顶级投行、金融估值建模培训资料-Three Statement Financial Modeling _ Street Of Walls.pdf
【Jsp实现学生成绩管理系统-更新数据库文件】 在信息技术教育领域,开发一个学生成绩管理系统是提升教学管理效率的重要工具。本系统采用JavaServer Pages(JSP)技术结合MySQL数据库来实现,旨在为管理员、教师和...