Mybatis源码阅读之三

news/2024/7/5 2:02:29

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    由前面的系列二分析到MapperMethod的execute方法,我们接着分析MapperMethod。如下List-1:

    List-1

public class MapperMethod {private final SqlCommand command;private final MethodSignature method;public MapperMethod(Class<?> mapperInterface, Method method, Configuration config) {this.command = new SqlCommand(config, mapperInterface, method);this.method = new MethodSignature(config, mapperInterface, method);}public Object execute(SqlSession sqlSession, Object[] args) {Object result;switch (command.getType()) {case INSERT: {Object param = method.convertArgsToSqlCommandParam(args);result = rowCountResult(sqlSession.insert(command.getName(), param));break;}case UPDATE: {Object param = method.convertArgsToSqlCommandParam(args);result = rowCountResult(sqlSession.update(command.getName(), param));break;}case DELETE: {Object param = method.convertArgsToSqlCommandParam(args);result = rowCountResult(sqlSession.delete(command.getName(), param));break;}case SELECT:if (method.returnsVoid() && method.hasResultHandler()) {executeWithResultHandler(sqlSession, args);result = null;} else if (method.returnsMany()) {result = executeForMany(sqlSession, args);} else if (method.returnsMap()) {result = executeForMap(sqlSession, args);} else if (method.returnsCursor()) {result = executeForCursor(sqlSession, args);} else {Object param = method.convertArgsToSqlCommandParam(args);result = sqlSession.selectOne(command.getName(), param);}break;case FLUSH:result = sqlSession.flushStatements();break;default:throw new BindingException("Unknown execution method for: " + command.getName());}if (result == null && method.getReturnType().isPrimitive() && !method.returnsVoid()) {throw new BindingException("Mapper method '" + command.getName() + " attempted to return null from a method with a primitive return type (" + method.getReturnType() + ").");}return result;}
...

    List-1中,根据类型来调用不同的处理,我们以insert为例子分析,调用的就是如下的List-2,首先将传入Mapper方法上的参数转换为SQL参数,之后调用SqlSession的insert方法,注意这个SqlSession是SqlSessionTemplate,我们来看SqlSessionTemplate的insert方法,如List-3:

    List-2

case INSERT: {Object param = method.convertArgsToSqlCommandParam(args);result = rowCountResult(sqlSession.insert(command.getName(), param));break;
}

    List-3

public int insert(String statement, Object parameter) {return this.sqlSessionProxy.insert(statement, parameter);
}

如下图1所示,

                                                             图1

  •     步骤2调用的SqlSessionInterceptor是JDK的代理类;
  •     步骤4中,做了很多事情,比如不同类型Executor的生成就是在里面;
  •     步骤13中,会先清空缓存——因为我们目前看的是insert更新操作;
  •     步骤17中调用的StatementHandler默认是RoutingStatementHandler,用了Delegate设计模式,默认情况下委托给PreparedStatementHandler;
  •     步骤23中,涉及了KeyGenerator,所以后面看mybatis中返还主键值看这里;

    步骤17中,RoutingStatementHandler使用了代理模式,将事情全部委托给第三方来做。

    步骤1中调用的SqlSessionTemplate,以Template结尾,看着像使用Template模板模式,但是个人觉得是使用了代理模式,因为它内部实现上,大部分事情都委托给了内部类SqlSessionInterceptor。

    值得一提的是,BaseExecutor使用了Template模板模式,定义了执行步骤,然后具体实现由其实现类了实现。

    图1的过程中,涉及了事物,使用的是Spring的事物管理。

转载于:https://my.oschina.net/u/2518341/blog/3050615


http://lihuaxi.xjx100.cn/news/243932.html

相关文章

如何创建可扩展表视图中的iOS 学习和拓展优化(有待更新)

首先介绍老外的文章&#xff1a;《How To Create an Expandable Table View in iOS》这是老外用Swift实现的&#xff0c;对应的老外github项目源码&#xff1a;https://github.com/appcoda/expandable-table-view小编经过学习了老外的Expandable Table View然后用Objective-C实…

python学习 第七篇 sql优化

查询单条语句&#xff1a;用来获取用户列表和单个用户>>> fields["id","name","name_cn","email","mobile"] >>> sql"select %s from users where name admin" % ,.join(field…

数据结构(队列实现篇)

在数据结构与算法中&#xff0c;队列queue是一种受限的线性储存结构&#xff0c;特殊之处在于它只允许在表的前端front进行删除操作&#xff0c;而在表的后端rear进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表。进行插入操作的端称为队尾&#xf…

2016.01.04 论文改重

今天的任务是修改查重的问题&#xff0c;另外加入参考文献。 其中&#xff0c;上午的时间完成论文查重。 下午的时间完成参考文献的丰富和标记。 晚上的时间完成DOM基础&#xff08;李炎恢&#xff09;的学习 预计晚上八点到晚上十点 优先级&#xff1a;论文查重&#xff0c;参…

java连接mysql数据库(jsp显示和控制台显示)

很多事情&#xff0c;在我们没有做之前我们觉得好难&#xff0c;但是只要你静下心来&#xff0c;毕竟这些都是人搞出来的&#xff0c;只要你是人&#xff0c;那就一定可以明白。 配置&#xff1a;JDK1.8&#xff0c;MySQL5.7&#xff0c;eclipse&#xff1a;Neon Release (4.6.…

汇编与反汇编

本来是打算学习linux的&#xff0c;然后做运维。可是在学习的过程中总是感觉不痛快&#xff0c;抓不住重点&#xff0c;就向下学c语言&#xff1b;学习c语言又发现有许多知识点抓不住重点&#xff0c;就向下学习汇编、学习微机原理&#xff0c;发现汇编与反汇编才是学习计算机科…

Tslib移植与分析【转】

转自&#xff1a;http://blog.csdn.net/water_cow/article/details/7215308 目标平台&#xff1a;LOONGSON-1B开发板&#xff08;mips32指令集&#xff09;编译平台&#xff1a;x86PC--VMware6.5--Ubuntu10.04&#xff08;下面简称“ubuntu系统”&#xff09; 或&am…

总结:如何使用redis缓存加索引处理数据库百万级并发

前言&#xff1a;事先说明&#xff1a;在实际应用中这种做法设计需要各位读者自己设计&#xff0c;本文只提供一种思想。准备工作&#xff1a;安装后本地数redis服务器&#xff0c;使用mysql数据库&#xff0c;事先插入1000万条数据&#xff0c;可以参考我之前的文章插入数据&a…