引言

            学习知识,就是分解、整合的过程。

概述

             想要全面深入的理解mybatis框架,首要前提是学习它的核心组件,mybatis的核心组件包括:SqlSessionFactoryBuilder(构造器)、SqlSessionFactory(工厂接口)、SqlSession(会话接口)、SQL Mapper(映射器)。接下来通过一张图来整体展示四个核心组件的关系:    mybatis框架(二)——核心组件及其作用-LMLPHP

内容

            一 SqlSessionFactoryBuilder(构造器)

            (1)作用:根据配置信息或者代码来生成SqlSessionFactory

            (2)实现原理:SqlSessionFactoryBuilder类负责构建SqlSessionFactory,通过源码分析,该类下提供了多个build的重载方法。其实这些方法可以归结为一个签名的方法,但是这些方法的参数不统一,为了方便调用,故重载了多个方法。如下图:mybatis框架(二)——核心组件及其作用-LMLPHP

                       究其根源,SqlSessionFactoryBuilder真正重载build方法只有如下三种,分别是InputStream(字节流)、Reader(字符流)、Configuration(类),字节流和字符流都是通过读取XML配置文件的形式创建SqlSessionFactory,而Configuration采用的是java代码方式创建SqlSessionFactory,我们一般常用的是读取配置文件的形式:

 


 
  1. public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)

  2. public SqlSessionFactory build(Reader reader, String environment, Properties properties)

  3. public SqlSessionFactory build(Configuration config)

              读取xml配置文件的方式构造SqlSessionFactory,构造过程中注入了configuration的实例对象,之后configuration实例对象解析XML配置文件来构建SqlSessionFactory,示例代码


 
  1. String resource = "mybatis-config.xml";

  2. InputStream inputStream = Resources.getResourceAsStream(resource);

  3. SqlSessionFactory sqlSessionFactory = null;

  4. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

              通过分析,SqlSessionFactoryBuilder创建SqlSessionFactory采用了建造者的设计模式,相信大家一定非常熟悉,这里SqlSessionFactoryBuilder扮演具体的建造者,Configuration类则负责建造的细节工作,SqlSession则是构造出来的产品。如下图所示

 

mybatis框架(二)——核心组件及其作用-LMLPHP

             二 SqlSessionFactory(工厂接口)

            (1)作用:生产SqlSession会话

            (2)实例代码:sqlSession = sqlSessionFactory.openSession();

        三 SqlSession(会话)

            (1)作用:1)获取映射器,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果;2)通过update、insert、select、delete等方法,带上SQL的id来操作在XML中配置好的SQL,从而完成工作,与此同时它也支持事务,通过commit、rollback方法提交或者回滚事务。

            (2)四大对象:

                   1)执行器(Executor):调度StatementHandler、ParameterHandler、ResultHandler等来执行对应的SQL。

                      种类:SIMPLE:简易执行器,默认执行器

                                 REUSE:一种执行器重用预处理语句

                                 BATCH:执行器重用语句和批量更新,针对批量专用的执行器。

                      执行过程:步骤一,MyBatis根据Configuration来构建StatementHandler

                                        步骤二,使用prepareStatement方法,对SQL编译并对参数进行初始化

                                        步骤三,调用prepareStatement的prepare()进行预编译和基础设置,再通过StatementHandler的parameterize()来设置参数并执行

                                        步骤四,resultHandler再组装查询结果返回给调用者。

                   2)数据库会话器(StatementHandler):使用数据库的Statement(PrepareStatement)执行操作,四大对象的核心,起到承上启下的作用。

                      种类:SimpleStatementHandler:对应SIMPLE执行器

                                 PrepareStatementHandler:对应REUSE执行器

                                 CallableStatementHandler:对应BATCH执行器

                   3)参数处理器(ParameterHandler):用于SQL对参数的处理

                   4)结果处理器(ResultSetHandler):进行最后数据集(ResultSet)的封装返回处理。

            (3)运行原理:SqlSession通过Executor(执行器)创建StatementHandler来运行的,具体原理请看下图

                    mybatis框架(二)——核心组件及其作用-LMLPHP

         四 Sql Mapper(映射器)

             (1) 作用:1)定义参数、2)描述缓存、3)描述SQL语句、4)定义查询结果和POJO的映射关系

             (2) 主要元素:通过一个表格简单介绍

                       mybatis框架(二)——核心组件及其作用-LMLPHP

             (3)引入映射器mapper的方法

                       1)用文件路径引入映射器                         


 
  1. <mappers>

  2. <mapper resource="对应mapper接口全路径的配置文件">

  3. </mappers>

                       2)用包名引入映射器                         


 
  1. <mappers>

  2. <mapper resource="对应mapper接口包的全路基">

  3. </mappers>

                       3)用类注册引入映射器                        


 
  1. <mappers>

  2. <mapper resource="对应mapper接口类的路径">

  3. </mappers>

                       4)用xml配置文件引入映射器                        


 
  1. <mappers>

  2. <mapper url="file:///var/mappers+文件路径">

  3. </mappers>

 

             (4)引入映射器步骤

                        1)定义映射器接口RoleMapper.java                      


 
  1. package com.liming.domain.mapper;

  2. import com.liming.domain.po.Role;

  3. public interface RoleMapper{

  4. public Role getRole(Long id);

  5. }

                        2)对应映射器接口的配置文件RoleMapper.xml:定义mapper映射规则和SQL语句

 

 


 
  1. <?xml version="1.0" encoding="UTF-8" ?>

  2. <!DOCTYPE mapper PUBLIC

  3. "-//mybatis.org//DTD Mapper 3.0//EN"

  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  5. <mapper namespace="com.liming.domain.mapper.RoleMapper">

  6. <select id="getRole" parameterType="long" resultType="role">

  7. select id, role_name as roleName from t_role where id = #{id}

  8. </select>

  9. </mapper>

                        3)在核心配置SqlMapConfig.xml文件中引入映射器

 

 


 
  1. <?xml version="1.0" encoding="UTF-8" ?>

  2. <!DOCTYPE configuration

  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">

  5. <configuration>

  6. <!-- 别名定义 -->

  7. <typeAliases>

  8. <typeAlias alias="role" type="com.liming.domain.po.Role"/>

  9. </typeAliases>

  10. <!--定义数据库信息,默认使用development数据库构建环境-->

  11. <environments default="development">

  12. <environment id="development">

  13. <!--采用jdbc事务管理-->

  14. <transactionMapper type="JDBC"/>

  15. <!--配置数据库链接信息-->

  16. <dataSource type="POOLED">

  17. <property name="driver" value="com.mysql.jdbc.Driver"/>

  18. <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>

  19. <property name="username" value="root"/>

  20. <property name="password" value="****"/>

  21. </dataSource>

  22. </environment>

  23. </environments>

  24. <!--定义映射器-->

  25. <mappers>

  26. <mapper resource="com/liming/domain/mapper/roleMapper.xml"/>

  27. </mappers>

  28. </configuration>

 

总结

           mybatis的核心组件,重点是SqlSession和映射器。SqlSession的运行原理要有所了解,会使用SqlSession,同时也要理解mapper的原理,理解mybatis访问数据看的具体原理。

      下一篇博客总结有关配置元素以及属性的知识点,敬请期待。

--------------------- 本文来自 IT四王子 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/liming363873117/article/details/60467107?utm_source=copy

10-07 15:39