【MyBatis从入门到入土】2 - MyBatis配置、生命周期作用域

文章目录

  • MyBtis从入门到入土
    • 4 配置解析
      • 4.1 核心配置文件
      • 4.2 environments环境配置
      • 4.3 properties属性配置
      • 4.4 typeAliases别名配置
      • 4.5 settings设置配置
      • 4.6 Mapping映射器配置
      • 4.7 其他配置
    • 5 生命周期和作用域

MyBtis从入门到入土

4 配置解析

在上一篇博客实操的项目中,一开始需要在mybatis-config.xml文件中配置各种信息,这一次我们来深入解析这个配置文件
当然,最好的方式是结合MyBatis的官方文档来Configuration

4.1 核心配置文件

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

  • configuration(配置)
    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)
        • transactionManager(事务管理器)
        • dataSource(数据源)
    • databaseIdProvider(数据库厂商标识)
    • mappers(映射器)

4.2 environments环境配置

首先我们从环境配置开始,以上一篇博客项目的mybatis-config.xml为例:

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="mysql"/>
            dataSource>
        environment>
    environments>
  1. 我们可以配置多个环境,也就是多个,每个环境可以连接到一个数据库。(连接多个数据库的作用可以是用于生产和测试)
    展示两个环境
	
    <environments default="test">
    
        <environment id="development">
            <transactionManager type="JDBC"/>
            <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>
        
        <environment id="test">
            <transactionManager type="JDBC"/>
            <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>
  1. 官网加粗了的一句话

One important thing to remember though: While you can configure multiple environments, you can only choose ONE per SqlSessionFactory instance.*
一件很重要的事情需要去记住:虽然你可以配置多个环境,但每个SqlSessionFactory实例只能选择一个环境。

  1. MyBatis的默认的transactionManagerJDBC,默认的dataSourcePOOLED,如果要了解和使用其他的可以直接上官网查询。

4.3 properties属性配置

  1. 在resources编写配置文件db.properties,这个文件含有数据库连接的配置信息
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=mysql

注意在配置文件里直接用&,不需要跟原来xml文件中的&这样的转义写法了

  1. 接着在mybatis-config.xml配置文件中添加properties配置,注意,我们添加的这些配置是有顺序的,如果你不按照顺序的话,那么会报下面这个错误:

The content of element type “configuration” must match “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)”.
这个错误表示mybatis-config.xml中的标签中元素位置不能随意,必须匹配其顺序要求。

  1. 这样我们就可以在环境中直接引用属性中的值了 ,采用${value}的格式:
        <environment id="development">
            <transactionManager type="JDBC"/>
            <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>

4.4 typeAliases别名配置

A type alias is simply a shorter name for a Java type. It’s only relevant to the XML configuration and simply exists to reduce redundant typing of fully qualified classnames.
别名是Java类名的简短名字。它对XML配置唯一的意义和存在是去减少冗余的全限定类名的输入。

  1. 方式一:指定类名
    在mybatis-config.xml中使用配置别名信息
    <typeAliases>
        <typeAlias type="com.cap.pojo.User" alias="user">typeAlias>
    typeAliases>

起好别名后,就可以直接在UserMapping.xml中使用了

    <select id="getUserById" resultType="user" parameterType="int">
        SELECT * FROM mybatis.user
        WHERE id = #{id};
    select>

    <update id="updateUser" parameterType="user" >
        UPDATE mybatis.user
        SET name=#{name},pwd=#{pwd}
        WHERE id=#{id};
    update>
  1. 方式二:指定包名
    <typeAliases>
        <package name="com.cap.pojo"/>
    typeAliases>

指定包名的话,MyBatis会去扫描包下类别名注解@Alias("alias_name"),如果没有指明注解别名的话,MyBatis会默认使用小写首字母的类名作为别名,相当于:

@Alias("user")
public class User{
...
}
  1. 这里还有一些默认的内置名称,可以直接使用
    【MyBatis从入门到入土】2 - MyBatis配置、生命周期作用域_第1张图片

4.5 settings设置配置

These are extremely important tweaks that modify the way that MyBatis behaves at runtime. 这是MyBatis中极为重要的调整设置,他们会改变MyBatis在运行时的行为。
下面列举比较重要的几个设置,其余可以见官网
在这里插入图片描述在这里插入图片描述

4.6 Mapping映射器配置

映射器的作用是告诉MyBatis去哪里找我们定义的SQL映射语句。
官网提到的映射器配置有四种方式,下面列举三种最常用的方式,其中首推使用第一种方式,因为它最通用,也不像第二、第三种一样注意点多。

  1. 方式一:使用相对于类路径的资源引用
    <mappers>
       <mapper resource="com/cap/dao/UserMapping.xml"/>
   mappers>
  1. 方式二:使用映射器接口实现类的完全限定类名
    <mappers>
        <mapper class="com.cap.dao.UserMapping" />
    mappers>

注意点:

  • 接口和它的配置文件必须同名:UserMapper接口和UserMapper.xml
  • 接口和它的配置文件必须在同一包下
  1. 方式三:将包内的映射器接口实现全部注册为映射器
    <mappers>
        <package name="com.cap.dao"/>
    mappers>

注意点和方式二一样

4.7 其他配置

其他配置不常用,这里不展开描述

  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)

5 生命周期和作用域

我们知道MyBatis框架中持久层的流程大约如下:
【MyBatis从入门到入土】2 - MyBatis配置、生命周期作用域_第2张图片那么我们来解析一下SqlSessionFactoryBuilderSqlSessionFactorySqlSession这三个类的生命周期和作用域,如果你不了解他们的话,那么后期可能会造成严重的并发问题

  • SqlSessionFactoryBuilder
    • 一次性,使用它创建完SqlSessionFactory就可以抛弃
    • 它最好的作用域是存在于方法的局部变量
  • SqlSessionFactory
    • 存在于程序运行的整个周期
    • 最好的作用域是作为全局作用域(即类变量/静态变量

    There should be little or no reason to ever dispose of it or recreate it. 没有理由丢弃它再去重新创建该实例。

    • 它的实现方式有多种,最简单的可以使用单例模式或者静态单例模式创建它
  • SqlSession
    • 每个线程应该有自己的SqlSession实例。SqlSession线程不安全,所以线程间不要共享。
    • 最好的作用域是一个请求或者方法的局部变量
    • 用完之后必须关闭
  • Mapper
    • Mapper是一些绑定映射语句的接口。Mapper的实例可以从SqlSession实例中获取
    • Mapper实例最好的作用域是方法内的局部变量,并且你不需要显式地关闭它。

尽管在整个请求作用域保留映射器实例不会有什么问题,但是你很快会发现,在这个作用域上管理太多像 SqlSession 的资源会让你忙不过来。 因此,最好将映射器放在方法作用域内。

你可能感兴趣的:(#,Mybatis从入门到入土)