【测试开发】知识点-mybatis,全局配置文件介绍

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。

具体学习可以结合官方文档:https://mybatis.org/mybatis-3/zh/configuration.html

一、属性(properties)

mybatis 可以通过 properties 标签来引入外部 properties 配置文件里的内容。

最常见的就是引入外部配置文件里的数据库连接信息,在之前的 mybatis 配置文件里是写死的,现在来引入我们项目配置文件application.properties里的数据库信息.

那么 mybatis 配置文件现在可以这么写:

<?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>
    <properties resource="application.properties"></properties>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${spring.datasource.driver-class-name}"/>
                <property name="url" value="${spring.datasource.url}"/>
                <property name="username" value="${spring.datasource.username}"/>
                <property name="password" value="${spring.datasource.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

在标签<<properties>中:

  • 如果使用resource:读取类路径下属性文件
  • 如果使用url:指定的路径读取属性文件,并覆盖之前读取过的同名属性

引入配置文件application.properties之后就可以使用${}来使用配置文件里的属性名了。

二、设置(settings)

这是 MyBatis 中极为重要的设置,会改变 MyBatis 运行时的行为。文档里的设置项很多,可以逐个看下混个脸熟,以后使用到的时候知道哪里找。

比如mapUnderscoreToCamelCase,作用是: 是否开启驼峰命名自动映射,即从经典数据库列名A_COLUMN映射到经典 Java 属性名aColumn

举个栗子:

数据库字段:user_name,开启配置后,就可以映射 java 属性名 userName

配置文件这样写:

...
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
...

三、类型别名(typeAliases)

1. 单个起别名

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,方便引用的时候使用。

比如在 xml 文件UserMapper.xml中:

<mapper namespace="com.pingguo.bloomtest.dao.UserMapper">
    <select id="getUserById" resultType="com.pingguo.bloomtest.pojo.User">
      select * from user where id = #{id}
    </select>
</mapper>

返回类型resultTypecom.pingguo.bloomtest.pojo.User,全类名有点长,给它起个别名。

回到全局配置文件mybatis-config.xml中:

    <typeAliases>
        <typeAlias type="com.pingguo.bloomtest.pojo.User" alias="user" />
    </typeAliases>
  • type: 写上全类名
  • alias: 不写的话默认是类名小写

然后引用的时候就可以使用别名:

<mapper namespace="com.pingguo.bloomtest.dao.UserMapper">
    <select id="getUserById" resultType="user">
      select * from user where id = #{id}
    </select>
</mapper>

2. 批量起别名

标签<typeAlias>一次只可以给一个类型起别名,如果要起别名的很多,可以进行批量处理。

使用package标签:

    <typeAliases>
        <!--<typeAlias type="com.pingguo.bloomtest.pojo.User" alias="user" />-->
        <package name="com.pingguo.bloomtest.pojo" />
    </typeAliases>
  • name:指定包名,为这个包以及下面的所有后代包的每一个类都起一个默认别名(类名小写)

如果引用的时候resultType="User"我换成大写开头,运行也是OK的,别名不区分大小写

3. @Alias 给类指定别名

假如com.pingguo.bloomtest.pojo包下还有一个子包,而这个子包下面也有一个类叫User,这时候就是别名冲突了,mybatis 运行报错。

可以使用@Alias给类指定别名:

@Alias("User2")
public class User {
    @TableId(type = IdType.ID_WORKER)
    private Long id;

    private String username;
    private String password;
...

4. 内置别名

mybatis 有为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,采取了特殊的命名风格。

我们自定义别名的时候不要与内置的重复。

不过不用别名,就用全类名也有好处。比如在用 idea编辑器,可以直接按住ctrl+左击 类名跳过去,很方便。

四、类型处理器(typeHandlers)

类型处理器的作用,简单来说就是架起了java 类型和数据库类型一一映射的桥梁。

比如 java 对象中的 String 类型的变量,保存到数据库兼容的 varchar 或者 char。

image.png

这部分就先混个脸熟先,后续涉及到对应知识点再进一步学习。

五、插件(plugins)

MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed),执行器,常见的增删改查
  • ParameterHandler (getParameterObject, setParameters),参数处理,sql语句预编译设置参数
  • ResultSetHandler (handleResultSets, handleOutputParameters),结果集处理,查询到结果后拿到结果集并封装成Javabean对象
  • StatementHandler (prepare, parameterize, batch, update, query),sql语句处理器

这4个对象里有很多各自的方法(括号里),通过插件可以在方法执行之前做一些自定义的处理,来改变一些默认行为。

这里同样混脸熟,后续学习了mybatis 运行机制和原理的时候,再进一步学习。

六、环境配置(environments)

MyBatis 可以配置多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中。

在之前已经用过这个标签<environments>:

<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${spring.datasource.driver-class-name}"/>
            <property name="url" value="${spring.datasource.url}"/>
            <property name="username" value="${spring.datasource.username}"/>
            <property name="password" value="${spring.datasource.password}"/>
        </dataSource>
    </environment>
</environments>

其中<environment>可以配置一个具体的环境信息,id代表当前环境的唯一标识,可以通过default动态的指定当前我要使用的环境。

另外,里面还有2个不可或缺的标签:transactionManagerdataSource

transactionManager

transactionManager 事务管理器,type是管理器的类型。

在 MyBatis 中有两种类型的事务管理器:

  • JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
  • MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。

如果我们使用Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

dataSource

dataSource数据源,type是数据源的类型。有三种内建的数据源类型:

  • UNPOOLED: 这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢,但对那些数据库连接可用性要求不高的简单应用程序来说,是一个很好的选择。 性能表现则依赖于使用的数据库,对某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形
  • POOLED: 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。
  • JNDI: 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。

七、数据库厂商标识(databaseIdProvider)

MyBatis 可以根据不同的数据库厂商执行不同的语句,databaseIdProvider这个标签其实就是 mybatis 在一致性方面的作为。

你只需要告诉 mybatis 你写的 sql 是属于哪个数据库厂商下的,那么它就可以动态的根据数据库厂商标识,来发送不同的sql语句。

<databaseIdProvider type="DB_VENDOR">
  <property name="MySQL" value="mysql"/>
  <property name="DB2" value="db2"/>
  <property name="Oracle" value="oracle" />
</databaseIdProvider>

这个DB_VENDOR,作用就是得到数据库厂商的标识(驱动自带获取厂商标识的方法)。

name设置不同的数据库标识,value可以设置别名。

最后,需要在 sql映射文件里告诉mybatis 这条 sql 是又哪个厂商去执行:

<mapper namespace="com.pingguo.bloomtest.dao.UserMapper">
    <select id="getUserById" resultType="com.pingguo.bloomtest.pojo.User" databaseId="mysql">
      select * from user where id = #{id}
    </select>
</mapper>

这里databaseId里的值就是上面配置的别名。

八、映射器(mappers)

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。

mappers标签就是将 sql 映射注册到全局配置文件中去,比如之前写的:

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

每个<mapper>注册一个 sql映射,其中又会涉及到如下几个属性:

resource

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

url

<!-- 使用完全限定资源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>

class

上面2个是注册配置文件的,而这个是用来注册接口的,里面写接口全类名

<!-- 使用映射器接口实现类的全类名 -->
<mappers>
  <mapper class="com.pingguo.bloomtest.dao.UserMapper"/>
</mappers>

但是要注意:sql映射文件必须和接口同名,并且放在同一目录下。

另外,注册接口的情况下,也是可以不写 sql 映射文件的,所有的sql都利用注解写在接口上。

public interface UserMapper {

    @Select("select * from user where id = #{id}")
    User getUserById(Integer id);
}

感觉写注解很方便啊?可以mybatis好不容易让sql与代码分离这不又回去了?

没关系,混合用就好了。可以把比较重要的、复杂的用来写 sql映射文件,简单的可以写注解里,方便快速开发。

批量注册
上面是单个的注册,现在同样也可以批量进行注册:

<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

name写包名。

posted @ 2021-11-17 22:28  把苹果咬哭的测试笔记  阅读(93)  评论(0编辑  收藏  举报