Mybatis步步进阶(四)——Mybatis框架流程及核心配置详解

时间:2020-12-16 05:08:53

     Mybatis框架的主要作用是让程序的主要精力都放在sql上,通过my提供的映射,半自动化的生成sql操作数据。通过想PrepareStatement中输入的参数自动进行输入映射,将结果集ResultSet映射成java对象作为输出映射。

一、Mybatis运行流程及相关核心类 

 Mybatis步步进阶(四)——Mybatis框架流程及核心配置详解

1、SqlMapConfig.xml是Mybatis的全局配置文件,类似于Hibernate中的hibernate.cfg.xml,主要用于配置数据源、事务、加载实体mapper.xml配置文件(同上图Config.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理,事务控制由mybatis管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池 ,由mybatis管理 -->
            <dataSource type="POOLED">
                <property name ="driver" value ="com.mysql.jdbc.Driver" />
                <property name ="url" value ="jdbc:mysql://127.0.0.1:3306/mybatisdemo?characterEncoding=utf-8"/>
                <property name ="username" value ="root" />
                <property name ="password" value ="dannyhoo" />
            </dataSource>
        </environment>
    </environments>
    <!-- 使用resource方式加载映射文件 -->
    <mappers>
        <mapper resource="sqlmap/User.xml"/>
    </mappers>
</configuration>

2、SqlSessionFactory:会话工厂 是每一个MyBatis Application必有的,根据config配置文件创建,它主要用于创建Sqlsession会话,由sqlSessionBuilder通过new 的方式创建,SessionFatoryBuider可直接当作一个工具类使用,不需要使用单例进行管理,而由它创建的SqlSessionFactory是最好通过单例模式来创建,保证工厂一旦创建一次,就使用一个SqlSessionFactory实例。并且SqlSessionFactory的作用范围是应用程序级的,在一个application中可仅有一个SqlSessionFactory,所以用单例控制SqlSessionFactory的创建。

3、Sqlsession:会话工厂创建出Sqlsession会话后,回话方可执行DB操作,执行sql语句、事务控制等,执行后可commit提交到数据库;SqlSession的作用范围和生命周期需要开发人员特别注意,因为它不是线程安全的,除了操作方法之外,还有数据属性。所以它的作用范围最好界定到方法级别,定义为方法的局部变量,也就是一个方法独有一个SqlSession实例。

     Exucutor:Mybatis在Sqlsession中提供了Exucutor类(执行器),是SqlSession用于执行sql操作数据库的接口类

     Mapped Statement:另外Mapped Statement是底层封装对象,对操作数据库的参数进行封装,包括sql语句、输入参数、输出参数

二、SqlMapConfig.xml属性详解

1、properties  

1)以JDBC为例,如果将上面datasource属性灵活可配置,例如换一个数据库连接,可将value参数值以${}变量的形式传入

抽象db.properties文件如下

     jdbc.driver=com.mysql.jdbc.Driver

     jdbc.url=jdbc:mysql://localhost:3306/max?characterEncoding=utf-8

     jdbc.username=rootjdbc.password=123456

修改datasource 标签,同时在SqlMapConfig.xml中加载db.properties文件     

     <properties resouce=”db.properties”/>

          .................

     <dataSource type="POOLED">

         <property name ="driver" value ="${jdbc.dirver}" />

         <property name ="url" value ="${jdbc.url"/>

         <property name ="username" value ="${jdbc.username}" />

         <property name ="password" value ="${jdbc.password}" />

     </dataSource>

2)配置读取优先级问题

     如果在db中有一个username参数,同时,在user实体的mapper映射中也有一个username参数,则my存在一个读取配置优先级问题,properties元素体内定义的属性优先于properties元素中的resource或url加载的属性,最后读取parameterType传递的属性。如果出现同属性名,则后面读取的属性值会覆盖前面已经读取的相同属性名的值。

     针对这个问题,首先保证properties resource加载的文件中属性名具有一定特殊性,如jdbc.username;其次,不要再properties元素体内添加其他属性值,均将它定义到.properties文件中,统一加载。

2、settings

Mybatis的全局配置参数,用于添加延迟加载、缓存配置信息。后面详细介绍

3、aliase

     别名的使用场景也非常广泛,例如在输入、输出映射中,如果输入pojo类型,则需要填写这个pojo的全路径,这时可以把这些pojo类使用别名标记,简化开发;

1)自定义别名

<typeAliases>
          <typeAliase type=”cn.max.po.User” alias=”user”/>
</typeAliases>
在resultType中引用别名

 <!-- 查询-->
    <select id="findUserById" parameterType="int" resultType="user">
        select * from user where id=#{id}
    </select>

2)批量定义别名

<typeAliases>
     <!--自动扫描包中的类,为每一个类定义别名,别名==类名-->
     <package name=”cn.max.po”/>
     <package name=”cn.max.server”/>
     <package name=”cn.max.en”/>
</typeAliases>

4、typeHandlers类型处理器

     Mybatis自动提供多中类型处理器,主要用于处理输入、输出映射、参数java类型和jdbc数据类型的映射。、

5、mapper映射

1)通过resouce加载单个pojo映射文件

     <mapper resource="mapper/UserMapper.xml"/>

2)通过mapper接口class加载

<mapper class=”cn.max.po.UserMapper”/>

     通过class加载的好处在于可以直接写到包名,如class=“cn.max.po”,则po包下的所有mapper.java接口都会被加载,但这要求mapper.java接口和mapper.xml配置文件在同一目录下且名称一致,通过mapper代理可找到该映射信息。

3)通过url加载

<mapper url=”file:///d:\work\map\User.xml”/>-本地全路径