Mybatis 源码简述
转载请注明来自:http://www.cnblogs.com/xmzJava/p/8578399.html
日常开发中,mybatis如果报错了调错起来会比较麻烦,因为一层套着一层,如果没有对mybatis有整体的认识,很容易迷失其中,今天我们大致的把mybatis的流程梳理一遍,看一下一次正常的sql操作,内部究竟发生了什么。
SqlSessionFactory
static {
try {
reader = Resources.getResourceAsReader("mybatis/config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}
catch (IOException e) {
e.printStackTrace();
}
}
我们先来看上述两行代码,mybatis请求数据库前,需要读取配置文件的信息,然后构建出一个SqlSessionFactory。我们从第三行代码开始
方法很简单,将配置文件的路劲转为流返回
再看第四行的build方法
看到 XMLConfigBuilder ,顾名思义就是通过流,解析xml的配置文件。
我们看下是怎么解析的
这是构造方法
跳转到XpathPather
第一行的 commonConstructor:将validation、variables、entityResolver设置到XPathParser类的参数中而已,顺便再实例化一个javax.xml.xpath.XPath出来,XPath用于在XML文档中通过元素和属性进行导航,并对元素和属性进行遍历。
重点在第二行:将XML配置文件转化为Document对象,我们看下具体实现
前半部分是验证,重点在最后解析这边:
我们回到最前面
现在第一行的作用已经很清楚了,解析xml配置文件并将Document存储到XPathParser中
我们再看第二行的parse方法
可以看到使用XPathParser的evalNode方法解析标签,后面解析标签会大量用到此方法,此方法将标签解析为XNode
重点在parseConfiguration中,点进去看看
很明显可以看到,这里要做的是把配置文件的各个节点进行解析,并将数据设置到相应的对象中去。
这些解析方法我们本次不深入探讨
我们再回到最前面
前面一系列流程简单的总结就是,读取xml文件到Document,再解析Document到Configuration
等于现在所有的配置工作都做好了,我们看下build方法
最终,构建出来了一个DefaultSqlSessionFactory。
SqlSession
经过上述一系列的解析配置,我们的准备工作终于做好了,现在我们来看下以下代码
SqlSession ss = sqlSessionFactory.openSession();
try {
int rows = ss.insert("SQL");
ss.commit(); } catch (Exception e) {
ss.rollback();
return 0;
} finally {
ss.close();
}
几行代码就完成了一次数据库的插入,现在我们就看看mybatis到底是怎么实现的
从第一行开始分析:获得sqlsession
我们再看下newExecutor的方法
返回不同类型的执行器,mybatis的缓存开关在这里就有提现。
再看第三行:
得到DefaultSqlSession后,我们开始执行我们的sql了
在mybatis中,其实就两种操作:查询与修改,新增和删除其实只是特殊的修改
我们先看 getMappedStatement,
在之前xml解析中,mybatis会自动的把每一个sql语句但是当做一个MappedStatement放到一个map中,key是namespace作为前缀,再加上该节点本身的id值。
具体信息可以点击这边
再下一行,这里把参数做了层包装,就开始执行sql了,具体内容下篇继续
参考:
http://www.cnblogs.com/xrq730/p/6824030.html
https://my.oschina.net/lichhao/blog/114311
Mybatis 源码简述的更多相关文章
- Mybatis源码学习之DataSource(七)_1
简述 在数据持久层中,数据源是一个非常重要的组件,其性能直接关系到整个数据持久层的性能.在实践中比较常见的第三方数据源组件有Apache Common DBCP.C3P0.Proxool等,MyBat ...
- Mybatis源码学习之整体架构(一)
简述 关于ORM的定义,我们引用了一下百度百科给出的定义,总体来说ORM就是提供给开发人员API,方便操作关系型数据库的,封装了对数据库操作的过程,同时提供对象与数据之间的映射功能,解放了开发人员对访 ...
- 精尽MyBatis源码分析 - MyBatis-Spring 源码分析
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- 精尽MyBatis源码分析 - Spring-Boot-Starter 源码分析
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- MyBatis源码分析(一)开篇
源码学习的好处不用多说,Mybatis源码量少.逻辑简单,将写个系列文章来学习. SqlSession Mybatis的使用入口位于org.apache.ibatis.session包中的SqlSes ...
- MyBatis源码分析-MyBatis初始化流程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
- MyBatis源码分析-SQL语句执行的完整流程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
- MyBatis源码分析-IDEA新建MyBatis源码工程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
- MyBatis源码分析(5)——内置DataSource实现
@(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该 ...
随机推荐
- A Senior Interview
1.How many time did they spent to plan the final project? 答:两天左右,两次开会. 4.How many time did they spen ...
- Python从入门到精通之eighth!
函数式编程与内置函数 函数作用域: def test1(): print('in the test1') def test(): print('in the test') return test1() ...
- 第六周助教工作总结——NWNU李泓毅
本周应批改作业23份,实际批改作业23份. 本周作业要求:https://www.cnblogs.com/nwnu-daizh/p/10569690.html 本周存在的问题: 一.github迭代过 ...
- excel日期拾取插件(支持Excel 2007 - 2016)
插件安装完毕后示意图如下: 插件安装说明请查看附件里面的安装说明. 插件下载
- 复习支持向量机(SVM)没空看书时,掌握下面的知识就够了
支持向量机(support vector machines, SVM)是一种二类分类模型.它的基本模型是定义在特征空间上的间隔最大的线性分类器:支持向量机还包括核技巧,这使它成为实质上的非线性分类器. ...
- What's the Difference Between Iterators and Generators in Python
https://www.quora.com/Whats-the-difference-between-iterators-and-generators-in-Python
- 启动eclipse could not create the java Vittual Machine
查询并几种方法: 1.都说是 eclipse.ini 环境初始文件的内存问题,续增大堆内存大小,具体配置如,如果找不到问题所在可以试试(该方法是确定环境变量没问题下试行) -Xms64m-Xmx25 ...
- Vim常用的命令
Noted:均在命令模式下进行的 移动: j---->向下 k---->向上 l---->向右 h---->向左 保存: w---->保存 退出: q---->退出 ...
- IOS 模拟器多开集成测试和那些坑
#### 前言公司一直没有IOS自动化,搞得很尴尬,个人感觉搞自动测试的,不搞IOS自动化,就像金X,少了重要一点啊.也向领导申请过不止一次,总只都各种原因没有分配机器,不了了之.某天线上IOS出bu ...
- 判断Array/Object
Object.prototype.isPrototypeOf() / Array.prototype.isPrototypeOf()if(typeof items === "object ...