转载请注明来自: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 源码简述的更多相关文章

  1. Mybatis源码学习之DataSource(七)_1

    简述 在数据持久层中,数据源是一个非常重要的组件,其性能直接关系到整个数据持久层的性能.在实践中比较常见的第三方数据源组件有Apache Common DBCP.C3P0.Proxool等,MyBat ...

  2. Mybatis源码学习之整体架构(一)

    简述 关于ORM的定义,我们引用了一下百度百科给出的定义,总体来说ORM就是提供给开发人员API,方便操作关系型数据库的,封装了对数据库操作的过程,同时提供对象与数据之间的映射功能,解放了开发人员对访 ...

  3. 精尽MyBatis源码分析 - MyBatis-Spring 源码分析

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  4. 精尽MyBatis源码分析 - Spring-Boot-Starter 源码分析

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  5. MyBatis源码分析(一)开篇

    源码学习的好处不用多说,Mybatis源码量少.逻辑简单,将写个系列文章来学习. SqlSession Mybatis的使用入口位于org.apache.ibatis.session包中的SqlSes ...

  6. MyBatis源码分析-MyBatis初始化流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  7. MyBatis源码分析-SQL语句执行的完整流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  8. MyBatis源码分析-IDEA新建MyBatis源码工程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  9. MyBatis源码分析(5)——内置DataSource实现

    @(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该 ...

随机推荐

  1. 前端js收藏

    1 爱心特效 <script type="text/javascript"> (function(window,document,undefined){ var hea ...

  2. 重写toFixed()方法

    1.直接在原型上修改,仍然使用元调用方式 Number.prototype.toFixed = function (exponent) { return parseInt(this * Math.po ...

  3. flink引出的kafka不同版本的兼容性

    参考: 官网协议介绍:http://kafka.apache.org/protocol.html#The_Messages_Fetch kafka协议兼容性  http://www.cnblogs.c ...

  4. HTML标签有序标签和无序标签

    1.<ul>标签定义无序列表,所谓无序,是指以●.○.▽.▲等开头的,没有顺序的列表项目 1.1  设置无序列表的类型—type             无序列表的默认符号是圆点(● ). ...

  5. LOJ-10094(强连通分量)

    题目链接:传送门 思路: 先缩点,然后统计入度为0的点即可. #include<iostream> #include<cstdio> #include<cstring&g ...

  6. 如何理解Unity组件化开发模式

    Unity的开发模式核心:节点和组件,组件可以加载到任何节点上,每个组件都有 gameobject 属性,可以通过这个属性获取到该节点,即游戏物体. 也就是说游戏物体由节点和组件构成,每个组件表示物体 ...

  7. weblogic获取应用目录路径(war包)

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...

  8. REdis主挂掉后复制节点才起来会如何?

    结论: 这种情况下复制节点(即从节点)无法提升为主节点,复制节点会一直尝试和主节点建立连接,直接成功.主节点恢复后,复制节点仍然保持为复制节点,并不会成为主节点. 复制节点无法提升为主节点的原因是复制 ...

  9. 自我理解node.js相比java的优势

    今天学习node.js,相比于之前学习过的java,node.js有一些优越之处.原因是它是一个基于Chrome v8引擎建立的JavaScript运行平台. (1)创建服务器:自行服务器来监听客户端 ...

  10. jquery,html5,css3主要特性总结

    jquery特性: 1.丰富简单的DOM选择器 2.同一函数实现get和set 3.支持链式方法书写 4.完善的事件处理功能 5.强大的css动画效果 6.完善的Ajax 7.简单的元素样式操作 8. ...