但行好事
莫论前程❤

Mybatis核心组件详解

概述

​ 想要全面深入的理解mybatis框架,首要前提是学习它的核心组件,**mybatis的核心组件包括:

  • SqlSessionFactoryBuilder(构造器)
  • SqlSessionFactory(工厂接口)
  • SqlSession(会话接口)
  • SQL Mapper(映射器)。

接下来通过一张图来整体展示四个核心组件的关系:  

img

内容

SqlSessionFactoryBuilder(构造器)
  • 作用:根据配置信息或者代码来生成SqlSessionFactory
  • 实现原理:SqlSessionFactoryBuilder类负责构建SqlSessionFactory,通过源码分析,该类下提供了多个build的重载方法。其实这些方法可以归结为一个签名的方法,但是这些方法的参数不统一,为了方便调用,故重载了多个方法。如下图:

img

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

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) 
public SqlSessionFactory build(Reader reader, String environment, Properties properties)
public SqlSessionFactory build(Configuration config)

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

    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = null;
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

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

img

SqlSessionFactory(工厂接口)

  • 作用:生产SqlSession会话
  • 实例代码:sqlSession = sqlSessionFactory.openSession();

SqlSession(会话)

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

    种类:

    • SIMPLE:简易执行器,默认执行器
    • REUSE:一种执行器重用预处理语句
    • BATCH:执行器重用语句和批量更新,针对批量专用的执行器。

      执行过程:

    • MyBatis根据Configuration来构建StatementHandler

    • 使用prepareStatement方法,对SQL编译并对参数进行初始化
    • 步骤三,调用prepareStatement的prepare()进行预编译和基础设置,再通过StatementHandler的parameterize()来设置参数并执行
    • resultHandler再组装查询结果返回给调用者。

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

    种类:

    • SimpleStatementHandler:对应SIMPLE执行器
    • PrepareStatementHandler:对应REUSE执行器
    • CallableStatementHandler:对应BATCH执行器

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

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

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

    img

Sql Mapper(映射器)

  •  作用:1)定义参数、2)描述缓存、3)描述SQL语句、4)定义查询结果和POJO的映射关系
  • 主要元素:通过一个表格简单介绍

img

  • 引入映射器mapper的方法

    用文件路径引入映射器                      

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

​ 用包名引入映射器                        

<mappers>
    <mapper resource="对应mapper接口包的全路基">
</mappers>

​ 用类注册引入映射器

<mappers>
    <mapper resource="对应mapper接口类的路径">
</mappers>

​ 用xml配置文件引入映射器             

<mappers>
    <mapper url="file:///var/mappers+文件路径">
</mappers>
  • 引入映射器步骤

定义映射器接口RoleMapper.java 

package com.liming.domain.mapper;
import com.liming.domain.po.Role;
public interface RoleMapper{
    public Role getRole(Long id);
}

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

<?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">  
    <mapper namespace="com.liming.domain.mapper.RoleMapper">  
        <select id="getRole" parameterType="long" resultType="role">  
            select id, role_name as roleName from t_role where id = #{id} 
        </select>  
    </mapper> 

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

<?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">
<configuration> 
    <!-- 别名定义 -->
    <typeAliases>
        <typeAlias alias="role" type="com.liming.domain.po.Role"/>
    </typeAliases>
    <!--定义数据库信息,默认使用development数据库构建环境-->
    <environments default="development">
        <environment id="development">
            <!--采用jdbc事务管理-->
            <transactionMapper type="JDBC"/>
            <!--配置数据库链接信息-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="****"/>
            </dataSource>   
        </environment>
    </environments>
    <!--定义映射器-->
    <mappers>
        <mapper resource="com/liming/domain/mapper/roleMapper.xml"/>
    </mappers>
</configuration>

总结

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

赞(3) 打赏
未经允许不得转载:刘鹏博客 » Mybatis核心组件详解
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏