MyBatis源码部分简单地解析
.
一、解析xml:
> org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream, java.lang.String, java.util.Properties)
> org.apache.ibatis.builder.xml.XMLConfigBuilder.parse
> org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration
> org.apache.ibatis.builder.xml.XMLConfigBuilder.environmentsElement "environments"
> org.apache.ibatis.builder.xml.XMLConfigBuilder.mapperElement "mappers" "package/resource/url/class"
> org.apache.ibatis.builder.xml.XMLMapperBuilder.parse
> org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement
> org.apache.ibatis.builder.xml.XMLMapperBuilder.parameterMapElement "/mapper/parameterMap"
> org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElements "/mapper/resultMap"
> org.apache.ibatis.builder.xml.XMLMapperBuilder.sqlElement(java.util.List<org.apache.ibatis.parsing.XNode>) "/mapper/sql"
> org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(java.util.List<org.apache.ibatis.parsing.XNode>) "select|insert|update|delete" 构建statement
> org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode 将mapper里写的sql转化为statement
↓创建statement sql语句RawSqlSource对象,将#{}转为?,并将#{}里的参数名存在对象中
↓关于${}:封装为DynamicSqlSource
> org.apache.ibatis.scripting.LanguageDriver.createSqlSource(org.apache.ibatis.session.Configuration, org.apache.ibatis.parsing.XNode, java.lang.Class<?>)
> org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseScriptNode > org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(java.lang.String, org.apache.ibatis.mapping.SqlSource, org.apache.ibatis.mapping.StatementType, org.apache.ibatis.mapping.SqlCommandType, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.Class<?>, java.lang.String, java.lang.Class<?>, org.apache.ibatis.mapping.ResultSetType, boolean, boolean, boolean, org.apache.ibatis.executor.keygen.KeyGenerator, java.lang.String, java.lang.String, java.lang.String, org.apache.ibatis.scripting.LanguageDriver, java.lang.String)
↑以上是解析xml文件,解析出statement,SqlSource ↓以下是将mapper接口和命名空间绑定
> org.apache.ibatis.builder.xml.XMLMapperBuilder.bindMapperForNamespace
> 二、openSession操作:
> org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource
> org.apache.ibatis.transaction.TransactionFactory.newTransaction(javax.sql.DataSource, org.apache.ibatis.session.TransactionIsolationLevel, boolean)
> org.apache.ibatis.session.Configuration.newExecutor(org.apache.ibatis.transaction.Transaction, org.apache.ibatis.session.ExecutorType)
> org.apache.ibatis.session.defaults.DefaultSqlSession new 三、getMapper:
> org.apache.ibatis.binding.MapperRegistry.getMapper
> org.apache.ibatis.binding.MapperProxyFactory.newInstance(org.apache.ibatis.session.SqlSession)
↓jdk动态代理
> org.apache.ibatis.binding.MapperProxy
> org.apache.ibatis.binding.MapperProxyFactory.newInstance(org.apache.ibatis.binding.MapperProxy<T>) 四、查询:
> org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(java.lang.String, java.lang.Object)
> org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds)
> org.apache.ibatis.session.defaults.DefaultSqlSession.wrapCollection
↑封装参数
↓关于绑定参数名@Param:
> org.apache.ibatis.session.Configuration.getMappedStatement(java.lang.String)
> org.apache.ibatis.executor.BaseExecutor.query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql)
↓通过SqlSource,解析出sql,解析成?,得到参数
> org.apache.ibatis.mapping.MappedStatement.getBoundSql
> org.apache.ibatis.executor.BaseExecutor.queryFromDatabase
> org.apache.ibatis.executor.SimpleExecutor.doQuery
> org.apache.ibatis.executor.SimpleExecutor.prepareStatement 拼装sql的parameter查询条件 ****
> org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters 将得到的参数设置到对应的顺序,还包括JdbcType等 ****
> org.apache.ibatis.executor.statement.StatementHandler.query 执行查询
> java.sql.Statement.execute(java.lang.String) 提交查询
> org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets 处理结果集
.
MyBatis源码部分简单地解析的更多相关文章
- MyBatis 源码分析 - 映射文件解析过程
1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...
- Spring mybatis源码篇章-MybatisDAO文件解析(二)
前言:通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-MybatisDAO文件解析(一) 默认加载mybatis主文件方式 XMLConfigBuilder ...
- Spring mybatis源码篇章-MybatisDAO文件解析(一)
前言:通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-SqlSessionFactory 加载指定的mybatis主文件 Mybatis模板文件,其中的属性 ...
- Mybatis 源码之Plugin类解析
public class Plugin implements InvocationHandler { private Object target; //目标对象 private Interceptor ...
- MyBatis 源码分析 - 配置文件解析过程
* 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAl ...
- 深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)
上篇文章<深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)>我们通过对mybatis源码的简单分析,可看出,在mybatis配置文件中,在configuration根 ...
- MyBatis 源码分析 - 插件机制
1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 My ...
- MyBatis 源码分析 - 缓存原理
1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...
- MyBatis 源码分析 - 内置数据源
1.简介 本篇文章将向大家介绍 MyBatis 内置数据源的实现逻辑.搞懂这些数据源的实现,可使大家对数据源有更深入的认识.同时在配置这些数据源时,也会更清楚每种属性的意义和用途.因此,如果大家想知其 ...
随机推荐
- java编译中出现了Exception in thread “main" java.lang.UnsupportedClassVersionError
这个问题确实是由较高版本的JDK编译的java class文件试图在较低版本的JVM上运行产生的错误. 1.解决措施就是保证jvm(java命令)和jdk(javac命令)版本一致.如果是linux版 ...
- [ DLPytorch ] 注意力机制&机器翻译
MachineTranslation 实现过程 rstrip():删除 string 字符串末尾的指定字符(默认为空格). 语法:str.rstrip([chars]) 参数:chars -- 指定删 ...
- Centos610无桌面安装Docker-内核升级
1.查看当前操作系统和系统内核 (此处只需要注意一项centos6的docker源只有64位的,x86_64,32位的直接换系统吧) 查看当前内核版本uname -r 2.6.32-754.el6.x ...
- MySQL高级 InnoDB 和 MyISAM 的区别
InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和索引存放在表空间 ...
- KEAZ128 时钟配置
本文介绍如何用KEAZ128评估版(FRDM-KEAZ128Q80)配置为40MHz core freqency/20MHz bus frequency. 1.了解器件时钟特性 参见NXP KEA12 ...
- solve License Key is legacy format when use ACTIVATION_CODE activate jetbrains-product 2019.3.1
1.the java-agent and ACTIVATION_CODE can get from this site:https://zhile.io/2018/08/25/jetbrains-li ...
- 陶陶摘苹果(0)<P2005_1>
陶陶摘苹果 (apple.pas/c/cpp) [问题描述] 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳,当她不能直接用 ...
- 3 Struts2的常见配置解析
1 package标签的相关配置 package标签:包,与Java中的包概念不一致.旨在更好的管理actionpackage标签的属性: name : 包的名称,在一个项目不重名即可,无具体含义 ...
- 关于and 和or的执行优先级问题分析
题目:列出本店价低于60或者高于100.并且商品点击数大于628的商品. 按照下面两种写法,得到的结果是不同的. 第一种:结果数据中有点击数为628的记录,显然不符合题目要求. SELECTgoods ...
- The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest - F.Sequence(打表+线段树)
题意:给你一个长度为$n$的数组,定义函数$f(l,r)=a_{l} \oplus a_{l+1} \oplus...\oplus a_{r}$,$F(l,r)=f(l,l)\oplus f(l,l+ ...