Mybatis源码(session创建过程)

前言:如果你同我一样对这种源码代码很讨厌,但是却又想搞懂内部是怎么运作的那么你大可往下看。

  1. 回顾:xml在mybatis里面的作用?

    答:放在resources文件夹下面的mybatis-config.xml,MyBatis中的Configuration组件用于描述主配置文件信息,框架在启动时会解析XML配置,将配置信息转换为Configuration对象。

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
    <!--配置有顺序按照引入文件properties,settings,typeAliases,environment顺序排列-->
    <configuration>
         <!--引入外部配置文件-->
    <properties resource="org/mybatis/example/config.properties"></properties>
        
        <!--设置-->
        <settings>
             <!--开启缓存-->
            <setting name="cacheEnabled" value="true"/>
             <!--开启懒加载-->
            <setting name="lazyLoadingEnabled" value="true"/>
            <!--自动生成主键-->
            <setting name="useGeneratedKeys" value="false"/>
        </settings>
    
      <!--起别名-->
        <typeAliases>
             <!--为类起别名-->
            <typeAlias alias="Author" type="domain.blog.Author"/>
            <typeAlias alias="Blog" type="domain.blog.Blog"/>
            <typeAlias alias="Comment" type="domain.blog.Comment"/>
            <typeAlias alias="Post" type="domain.blog.Post"/>
            <typeAlias alias="Section" type="domain.blog.Section"/>
            <typeAlias alias="Tag" type="domain.blog.Tag"/>
            
            <!--
            通过包扫描给所有的实体类起别名,给指定报名下的所有类起别名,默认每个实体类的别名是首字母小写的类名Dept   dept
            -->
            <package name="com.zheng.pojo"/>
        </typeAliases>
    
        <!--环境-->
        <environments default="development">
            <environment id="development">
                <!--事务管理器
                在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):
                -->
                <transactionManager type="JDBC"/>
                <!--数据源
                POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时               间。这种处理方式很流行,能使并发 Web 应用快速响应请求。
                -->
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
       
        <!--mapper注册-->
       <mappers>
            <mapper resource="org/mybatis/example/BlogMapper.xml"/>
       </mappers>
    </configuration>
    

    还有mapper.xml文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper    
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"    
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mappers namespace="dao.VoteUserDao">
    
    </mappers>
    

    说实话我已经能够信手拈来了这些xml文件(不敢说全默写,但是基本懂得各个标签的用法)

    但是无知的少年啊!你知道这些帮助我们节省时间的xml文件是怎样被读取的吗?

  2. mybatis读取xml过程:

    • JDK API中提供了3种方式解析XML,分别为DOM、SAX和XPath。
    • 在这3种方式中,API最易于使用的就是XPath方式,MyBatis框架中也采用XPath方式解析XML文件中的配置信息。

    如何通过XPath方式解析XML文件?

    答:官方的xpathAPI可以学习虽然这里我很想用自己的方式表达出来但是我还没搞懂(我会回来更新的)

    Mybatis的读取xml方式是对Xpath读取方式的简化也就是做了一种封装

    答:XPath太繁琐了(虽然我看不懂但是我知道XPath读取节点方式很很拉跨!)为了简化XPath解析操作,MyBatis通过XPathParser工具类封装了对XML的解析操作,同时使用XNode类增强了对XML节点的操作。使用XNode对象,我们可以很方便地获取节点的属性、子节点等信息。很大程度上简化了XML解析过程。所有这里建议学习XPathParser工具类更好。

    都知道Mybaris-config.xml解析完之后会产生一个Configuration对象干嘛用?

    答:MyBatis框架启动后,首先创建Configuration对象,然后解析所有配置信息,将解析后的配置信息存放在Configuration对象中。Configuration是MyBatis中比较重要的组件,主要有以下3个作用:
    (1)用于描述MyBatis配置信息,例如标签配置的参数信息。
    (2)作为容器注册MyBatis其他组件,例如TypeHandler、MappedStatement等。
    (3)提供工厂方法,创建ResultSetHandler、StatementHandler、Executor、ParameterHandler等组件实例。

    什么是SqlSession实例创建过程?

    答:MyBatis中的SqlSession实例使用工厂模式创建,所以在创建SqlSession实例之前需要先创建SqlSessionFactory工厂对象,为了创建SqlSessionFactory对象,首先创建了一个SqlSessionFactoryBuilder对象,然后以MyBatis主配置文件输入流作为参数,调用SqlSessionFactoryBuilder对象的build()方法,然后调用SqlSessionFactory对象的openSession()方法。

    疑惑不解:这不是谁都知道?

image

session创建过程图

posted @ 2021-10-23 18:12  旅祸少年  阅读(165)  评论(0)    收藏  举报