• Mybatis 源码简述


    转载请注明来自:http://www.cnblogs.com/xmzJava/p/8578399.html

    日常开发中,mybatis如果报错了调错起来会比较麻烦,因为一层套着一层,如果没有对mybatis有整体的认识,很容易迷失其中,今天我们大致的把mybatis的流程梳理一遍,看一下一次正常的sql操作,内部究竟发生了什么。

    SqlSessionFactory


    1 static {
    2      try {
    3          reader = Resources.getResourceAsReader("mybatis/config.xml");
    4          sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    5      } 
    6      catch (IOException e) {
    7          e.printStackTrace();
    8      }
    9  }

    我们先来看上述两行代码,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


    经过上述一系列的解析配置,我们的准备工作终于做好了,现在我们来看下以下代码

     1 SqlSession ss = sqlSessionFactory.openSession();
     2       try {
     3           int rows = ss.insert("SQL");
     4           ss.commit();
     5           
     6      } catch (Exception e) {
     7          ss.rollback();
     8          return 0;
     9      } finally {
    10          ss.close();
    11      }

    几行代码就完成了一次数据库的插入,现在我们就看看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

  • 相关阅读:
    神经网络之 --- 2012_ Alexnet
    Array.obj : error LNK2001: unresolved external symbol "void __cdecl Test_ultiply(void)" (?Test_ultiply@@YAXXZ)
    学习opencv出现配置错误(一)
    port和interface的区别
    Vivado当中的ooc与global模式
    ADC采样率,符号率
    MATLAB&Simulink的重复方式
    傅里叶变换的对称性质
    AXI总结一
    晶振相关(一)
  • 原文地址:https://www.cnblogs.com/xmzJava/p/8578399.html
Copyright © 2020-2023  润新知