3. MyBatis 核心配置文件标签

2021-04-20 10:50:26 浏览数 (1)

3. MyBatis 核心配置文件标签

  • 4.1 properties标签
  • 4.2 typeAliases标签
  • 4.3 environments标签
  • 4.4 mappers标签
  • 4.5 知识小结

常用标签


sqlMapConfig.xmlMyBatis框架的核心配置文件,主要用来配置数据源、映射文件、属性等

1566869842463

4.1 properties标签

作用

设置属性键值对,属性可以外部配置,也可动态替换。

需求

在上一篇的入门案例中,我们使用最简单的方式配置 sqlMapConfig.xml,将 JDBC 访问数据库的账号密码直接写在 sqlMapConfig.xml 文件中,如下:

image-20210312165417762

这就导致了一个耦合高的问题。

为了解决这个耦合高的问题,我们应该将这种变化的参数写到外部的配置文件中。而 sqlMapConfig.xml 只从外部的配置文件中读取需要的相关参数即可。

下面我们来看看如何应用起来。

应用

1. 在 resources 目录下,新增 jdbc.properties文件

image-20210312172544480

代码语言:javascript复制
jdbc.username=root
jdbc.password=********你的密码*********
jdbc.url=jdbc:mysql://localhost:3306/db3
jdbc.driverClass=com.mysql.jdbc.Driver
2. 修改sqlMapConfig.xml文件,通过读取外部文件来动态配置内部的属性值

image-20210312173112026

代码语言:javascript复制
<?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>

    <!--定义属性文件
        resource:从类路径下面读取外部文件
        url:从一个资源定位地址来读取配置文件
        提供参数使用: 可以使用 ${参数名} 进行参数引用
    -->
    <properties resource="jdbc.properties" >
    </properties>


    <environments default="default">
        <!--环境变量-->
        <environment id="default">
            <!--事务管理器:由JDBC管理事务 -->
            <transactionManager type="JDBC"/>
            <!--数据源配置信息:POOLED 使用连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载其他的映射文件 -->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

配置完毕之后,我们可以再执行一下测试代码,确认是否运行正常(接着上一篇中的入门案例),如下:

image-20210312173310089

3.设置 properties 的内部参数属性说明

在 properties 标签虽然可以直接引用外部文件的参数,但是有时候我们还是希望可以设置一些默认参数。那么这时候就可以设置 properties 的内部属性。

image-20210312174325290

代码语言:javascript复制
<?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>

    <!--定义属性文件
        resource:从类路径下面读取外部文件
        url:从一个资源定位地址来读取配置文件
        提供参数使用: 可以使用 ${参数名} 进行参数引用
    -->
    <properties resource="jdbc.properties" >
        <!--先读取内部属性,后读取外部属性,在属性名一样时,外部属性起作用-->
        <property name="jdbc.username" value="root"/>
        <property name="jdbc.password" value="root"/>
    </properties>

    <environments default="default">
        <!--环境变量-->
        <environment id="default">
            <!--事务管理器:由JDBC管理事务 -->
            <transactionManager type="JDBC"/>
            <!--数据源配置信息:POOLED 使用连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载其他的映射文件 -->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

4.2 typeAliases标签

作用

给用户自定义的实体类定义别名,它只和 XML 配置有关,用来减少类完全限定名的冗余。

这样说这个作用有些抽象,下面再来截图说明如下:

在我们入门案例中,使用 UserMapper.xml 来映射一个 User 实体类的相关查询SQL方法。

image-20210312182053593

在上面的示例中,我们发现如果需要在 resultType 设置实体类的映射,需要写完整 com.lijw.entity.User 路径。如果需要写的SQL映射比较多,那就比较繁琐了。

那么有没有办法简化一下呢?这个当然有,我们可以使用 typeAliases 标签给这个 com.lijw.entity.User 路径设置别名,然后引用这个别名来简化配置。

下面是常见的默认内置别名,下面看完了 内置别名 之后,我们再写个案例来演示 别名 的自定义设置。

内置别名

内置别名可以直接使用,别名不区分大小写

别名

映射类型

_byte

byte

_long

long

_short

short

_int

int

_integer

int

_double

double

_float

float

_boolean

boolean

string

String

byte

Byte

long

Long

short

Short

int

Integer

integer

Integer

double

Double

float

Float

boolean

Boolean

date

Date

decimal

BigDecimal

bigdecimal

BigDecimal

object

Object

map

Map

hashmap

HashMap

list

List

arraylist

ArrayList

collection

Collection

iterator

Iterator

应用

方式一

“单个实体类的别名设置 typeAlias ”

让我们回到 sqlMapConfig.xml 配置文件,配置如下:

image-20210313014350526

代码语言:javascript复制
    <!--
        typeAlias :
        1. type:指定实体类全名
        2. alias: 指定别名,如果省略这个属性,默认使用类名字做为别名,别名不区分大小写,通常别名使用小写。
    -->
    <typeAliases>
        <typeAlias type="com.lijw.entity.User" />
    </typeAliases>

当我们配置好了这个 User 的实体类别名之后,我们再回到映射文件UserMapper.xml中使用别名配置 映射关系,如下:

image-20210313014504384

代码语言:javascript复制
<!--
实体类的映射文件
namespace 指定接口的类全名
-->
<mapper namespace="com.lijw.dao.UserMapper">
    <!--
    查询语句
    id: 接口中方法的名字
    resultType:返回的实体类的类型,类全名
    -->
    <select id="findAllUsers" resultType="user">
        select * from user
    </select>
</mapper>

测试执行是否正常,如下:

image-20210313014554516

可以看到,我们已经成功进行实体类的别名映射了。但是如果要我们一个个实体类去写映射,肯定会觉得特别累。那么如何去简化呢?

我们可以直接配置一个包下所有实体类的别名。

方式二

“包扫描配置别名package ”

image-20210313014957348

代码语言:javascript复制
    <!--
        typeAlias :
        1. type:指定实体类全名
        2. alias: 指定别名,如果省略这个属性,默认使用类名字做为别名,别名不区分大小写,通常别名使用小写。
    -->
    <typeAliases>
        <!--
            package指定包名
            1. 自动将这个包下所有的实体类定义别名,别名就是类的名字。(在日志输出中会有乱码,不用理会,不影响使用,这是mybatis的bug)
            2. 如果有多个子包,只需要指定父包即可。
            3. 可以使用多个package标签,指定不同的包名
        -->
        <package name="com.lijw.entity"/>
    </typeAliases>

通过直接设置一个包下的所有实体类的别名映射,我们就不用一个个去写实体类的规则了。

4.3 environments标签

作用

MyBatis可以配置多种环境,有助于将SQL映射应用于多种数据库之中,如dev(development开发环境)、uat(test测试环境)、prd(produce生产环境)

尽管可以配置多个环境,但是每个环境只能有一个SqlSessionFactory实例。所以需要选择到底使用哪个环节的配置。

另外在 environments标签中还有 transactionManager 和 dataSource 两个标签,用途如下:

transactionManager事务管理器

类型

作用

JDBC

由JDBC进行事务的管理

MANAGED

事务由容器来管理,后期学习Spring框架的时候,所有的事务由容器管理

dataSource数据源

类型

作用

UNPOOLED

不使用连接池,每次自己创建连接

POOLED

使用mybatis创建的连接池

JNDI

由应用服务器提供连接池的资源,我们通过JNDI指定的名字去访问连接池资源

应用

下面我们创建一个默认default环境的配置参数,还有一个生产环境的配置参数。

image-20210313165640287

代码语言:javascript复制
<?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>

    <!--定义属性文件
        resource:从类路径下面读取外部文件
        url:从一个资源定位地址来读取配置文件
        提供参数使用: 可以使用 ${参数名} 进行参数引用
    -->
    <properties resource="jdbc.properties" >
        <!--先读取内部属性,后读取外部属性,在属性名一样时,外部属性起作用-->
        <property name="jdbc.username" value="root"/>
        <property name="jdbc.password" value="root"/>
    </properties>

    <!--
        typeAlias :
        1. type:指定实体类全名
        2. alias: 指定别名,如果省略这个属性,默认使用类名字做为别名,别名不区分大小写,通常别名使用小写。
    -->
    <typeAliases>
        <!--
            package指定包名
            1. 自动将这个包下所有的实体类定义别名,别名就是类的名字。(在日志输出中会有乱码,不用理会,不影响使用,这是mybatis的bug)
            2. 如果有多个子包,只需要指定父包即可。
            3. 可以使用多个package标签,指定不同的包名
        -->
        <package name="com.lijw.entity"/>
    </typeAliases>

    <!--mybatis环境的配置-->
    <!-- 一个核心配置文件,可以配置多个运行环境,default默认使用哪个运行环境 -->
    <environments default="produce">
        <!-- 其中的一个运行环境,通过id来进行标识-->
        <!-- 默认环境变量-->
        <environment id="default">
            <!--
                事务管理器type的取值:
                1. JDBC:由JDBC进行事务的管理
                2. MANAGED:事务由容器来管理,后期学习Spring框架的时候,所有的事务由容器管理
            -->
            <transactionManager type="JDBC"/>
            <!--
                数据源:
                1. POOLED:使用mybatis创建的连接池
                2. UNPOOLED:不使用连接池,每次自己创建连接
                3. JNDI:由服务器提供连接池的资源,我们通过JNDI指定的名字去访问服务器中资源
            -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>

        <!-- 生产环境变量-->
        <environment id="produce">
            <!--事务管理器:由JDBC管理事务 -->
            <transactionManager type="JDBC"/>
            <!--数据源配置信息:POOLED 使用连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>

    </environments>

    <!-- 加载其他的映射文件 -->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

4.4 mappers标签

作用


加载外部的实体类映射文件。

应用


image-20210313170246901

代码语言:javascript复制
1. 加载指定的resources目录下的映射文件
 <mapper resource="UserMapper.xml"/>

2. 加载指定接口的全限定名
 <mapper class="com.dao.UserMapper"/>
 
3. 加载并扫描指定包下所有的接口
 <package name="com.mapper"/>

4.5 知识小结

4.5.1 mybatis文件的关系介绍

1589005133152

4.5.2 核心配置文件标签顺序

1589005246218

要注意标签的顺序,不然会报错。

4.5.3 常用标签

properties标签:该标签可以加载外部的properties文件

代码语言:javascript复制
<!--定义属性文件
    resource:从类路径下面读取外部文件
    url:从一个资源定位地址来读取配置文件
    提供参数使用: 可以使用 ${参数名} 进行参数引用
-->
<properties resource="jdbc.properties" >
    <!--先读取内部属性,后读取外部属性,在属性名一样时,外部属性起作用-->
    <property name="jdbc.username" value="root"/>
    <property name="jdbc.password" value="root"/>
</properties>

typeAliases标签:设置类型别名

代码语言:javascript复制
<!--
    typeAlias :
    1. type:指定实体类全名
    2. alias: 指定别名,如果省略这个属性,默认使用类名字做为别名,别名不区分大小写,通常别名使用小写。
-->
<typeAliases>
    <!--
        package指定包名
        1. 自动将这个包下所有的实体类定义别名,别名就是类的名字。(在日志输出中会有乱码,不用理会,不影响使用,这是mybatis的bug)
        2. 如果有多个子包,只需要指定父包即可。
        3. 可以使用多个package标签,指定不同的包名
    -->
    <package name="com.lijw.entity"/>
</typeAliases>

environments标签:数据源环境配置

代码语言:javascript复制
<!--mybatis环境的配置-->
<!-- 一个核心配置文件,可以配置多个运行环境,default默认使用哪个运行环境 -->
<environments default="produce">
    <!-- 其中的一个运行环境,通过id来进行标识-->
    <!-- 默认环境变量-->
    <environment id="default">
        <!--
            事务管理器type的取值:
            1. JDBC:由JDBC进行事务的管理
            2. MANAGED:事务由容器来管理,后期学习Spring框架的时候,所有的事务由容器管理
        -->
        <transactionManager type="JDBC"/>
        <!--
            数据源:
            1. POOLED:使用mybatis创建的连接池
            2. UNPOOLED:不使用连接池,每次自己创建连接
            3. JNDI:由服务器提供连接池的资源,我们通过JNDI指定的名字去访问服务器中资源
        -->
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driverClass}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>

    <!-- 生产环境变量-->
    <environment id="produce">
        <!--事务管理器:由JDBC管理事务 -->
        <transactionManager type="JDBC"/>
        <!--数据源配置信息:POOLED 使用连接池 -->
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driverClass}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>

</environments>

mappers标签:加载映射配置

代码语言:javascript复制
<!-- 加载其他的映射文件 -->
<mappers>
    <mapper resource="UserMapper.xml"/>
</mappers>
4.5.4 核心配置文件模板

上面我们已经了解了 Mybatis 配置文件的相关标签,但是每次都要去写一遍挺麻烦的,所以我们可以创建一个文件模板。方便我们后续直接使用。

image-20210313171603718

设置的模板内容如下:

代码语言:javascript复制
<?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>

    <!--定义属性文件
        resource:从类路径下面读取外部文件
        url:从一个资源定位地址来读取配置文件
        提供参数使用: 可以使用 ${参数名} 进行参数引用
    -->
    <properties resource="jdbc.properties" >
        <!--先读取内部属性,后读取外部属性,在属性名一样时,外部属性起作用-->
        <property name="jdbc.username" value="root"/>
        <property name="jdbc.password" value="root"/>
    </properties>

    <!--
        typeAlias :
        1. type:指定实体类全名
        2. alias: 指定别名,如果省略这个属性,默认使用类名字做为别名,别名不区分大小写,通常别名使用小写。
    -->
    <typeAliases>
        <!--
            package指定包名
            1. 自动将这个包下所有的实体类定义别名,别名就是类的名字。(在日志输出中会有乱码,不用理会,不影响使用,这是mybatis的bug)
            2. 如果有多个子包,只需要指定父包即可。
            3. 可以使用多个package标签,指定不同的包名
        -->
        <package name="com.lijw.entity"/>
    </typeAliases>

    <!--mybatis环境的配置-->
    <!-- 一个核心配置文件,可以配置多个运行环境,default默认使用哪个运行环境 -->
    <environments default="produce">
        <!-- 其中的一个运行环境,通过id来进行标识-->
        <!-- 默认环境变量-->
        <environment id="default">
            <!--
                事务管理器type的取值:
                1. JDBC:由JDBC进行事务的管理
                2. MANAGED:事务由容器来管理,后期学习Spring框架的时候,所有的事务由容器管理
            -->
            <transactionManager type="JDBC"/>
            <!--
                数据源:
                1. POOLED:使用mybatis创建的连接池
                2. UNPOOLED:不使用连接池,每次自己创建连接
                3. JNDI:由服务器提供连接池的资源,我们通过JNDI指定的名字去访问服务器中资源
            -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>

        <!-- 生产环境变量-->
        <environment id="produce">
            <!--事务管理器:由JDBC管理事务 -->
            <transactionManager type="JDBC"/>
            <!--数据源配置信息:POOLED 使用连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>

    </environments>

    <!-- 加载其他的映射文件 -->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

配置完毕之后,我们来使用一下,如下:

image-20210313171702626

image-20210313171727133

image-20210313171745301

0 人点赞