# 3. MyBatis 全局配置文件

# 3.1 properties

引入外部配置文件,可以写一些固定的配置,如数据库连接等。

  • jdbc.properties

    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mybatis
    jdbc.username=root
    jdbc.password=root
    
  • mybatis-config.xml

    <!--
    	properties 有两个属性:
        	resource:引用类路径资源
        	url:引用网络路径或磁盘路径资源
    -->
    <properties resource="jdbc.properties"></properties>
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    

# 3.2 settings

可修改MyBatis在运行时的行为方式。

img

img

图源:https://blog.csdn.net/fageweiketang/article/details/80767532

下面以 mapUnderscoreToCamelCase(开启自动驼峰命名规则)举例。

# 3.2.1 修改 mybatis-config.xml 文件

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

# 3.2.2 再次测试

# 结果:
Employee{id=1, lastName='hedon', gender=1, email='171725713@qq.com'}
# 对比:
可以发现,开启了自动驼峰命名规则后,lastName 的值就可以获取到了。

# 3.3 typeAliases

类型别名只是Java类型的简称。它仅与 XML 配置有关,只是为了减少完全限定的类名的冗余类型而存在。

# 3.3.1 单独取别名 XML 版本 —— typeAlias

# 3.3.1.1 修改 mybatis-config.xml

<!--
	起别名,这样以后就可以用 Employee 代替 com.hedon.mybatis.bean.Employee 
	
	注意:如果以后不指定 alias 的话,默认就是类名小写 => employee
-->
<typeAliases>
    <typeAlias type="com.hedon.mybatis.bean.Employee" alias="Employee"></typeAlias>
</typeAliases>

这样在 EmployeeMapper.xml 中简化 com.hedon.mybatis.bean.Employee 的写法了。

# 3.3.1.2 修改 EmployeeMapper.xml

<!--<select id="getById" resultType="com.hedon.mybatis.bean.Employee">-->
<select id="getById" resultType="Employee">
  select * from tbl_employee where id = #{id}
</select>

# 3.3.2 批量取别名 —— package

我们还可以进行批量取别名,经测试,默认别名是==类名==(首字母大小写都可以)=> ==别名不区分大小写==。

# 3.3.2.1 修改 mybatis-config.xml

<typeAliases>
    <!--
        package:为某个包下的所有类批量起别名
        name:指定包,为当前包及其子包的每一个类都起一个默认别名(经测试,类名和类名首字母小写都可以)。
    -->
    <package name="com.hedon.mybatis.bean"/>
</typeAliases>

注意:可能存在子包下也有 Employee 类,导致冲突,运行报错(因为别名已经用过了,想再用到另外一个身上,肯定不行)。

image-20200923172544723

这时候可以用 ==@Alias== 注解来进一步区分。

# 3.3.2.2 为子包下的 Employee 单独取名字

package com.hedon.mybatis.bean.example;
import org.apache.ibatis.type.Alias;

//这样这个类就不会在用 Employee 做别名了,就不存在冲突了。
@Alias(value = "SecondEmployee")
public class Employee {
    private String text;
}

# 3.3.4 MyBatis 内置的别名

我们起别名的时候不要和这些重复了,会冲突。

image-20200923183511594 image-20200923183527621

# 3.4 typeHandlers

无论是 MyBatis 在预处理语句(PreparedStatement)中 设置一个参数时,还是从结果集中取出一个值时, 都会 用类型处理器将获取的值以合适的方式转换成 Java 类型。

image-20200925090813678 image-20200925090833892

# 3.5 Handling Enums

# 3.6 objectFactory

# 3.7 plugins

插件是MyBatis提供的一个非常强大的机制,我们可以通过插件来修改 MyBatis 的一些核心行为。插件通过动态代理机制,可以介入四大对象的任何一个方法的执行。

四大对象:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

# 3.8 environments

MyBatis可以配置多种环境,比如开发、测试和生 产环境需要有不同的配置。

每种环境使用一个environment标签进行配置并指 定唯一标识符。

可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境。

# 3.8.1 id

指定当前环境的唯一标识。

# 3.8.2 transactionManager

type:

  • JDBC —— JdbcTransactionFactory

    使用了 JDBC 的提交和回滚设置,依赖于从数 据源得到的连接来管理事务范围。

  • MANAGED —— ManagedTransactionFactory

    不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。

  • 自定义

    实现 TransactionFactory 接口,type=全类名/ 别名。

# 3.8.3 dataSource

type:

  • UNPOOLED —— UnpooledDataSourceFactory

    不使用连接池。

  • POOLED —— PooledDataSourceFactory

    使用连接池。

  • JNDI

    在 EJB 或应用服务器这类容器中查找指定的数据源。

  • 自定义

    实现 DataSourceFactory 接口,定义数据源的获取方式。


# 3.9 databaseIdProvider

MyBatis 可以根据不同的数据库厂商执行不同的语句。

image-20200925091845196

# 3.9.1 type

DB_VENDOR:

使用 MyBatis 提供的 VendorDatabaseIdProvider 解析数据库厂商标识。也可以实现 DatabaseIdProvider 接口来自定义。

# 3.9.2 property

  • name

    数据库厂商标识。

  • value

    为标识起一个别名,方便SQL语句使用 databaseId 属性引用。

    image-20200925092122318

# 3.9.2 匹配规则

1、如果没有配置databaseIdProvider标签,那么databaseId=null;

2、如果配置了databaseIdProvider标签,使用标签配置的name去匹 配数据库信息,匹配上设置databaseId=配置指定的值,否则依旧为 null;

3、如果databaseId不为null,他只会找到配置databaseId的sql语句;

4、MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。


# 3.10 mappers

将 sql 映射文件注册到全局配置中。

# 3.10.1 逐个注册

<mappers>
  <!--resource 引用类路径下的 mapper 文件-->
  <mapper resource = "mybatis/mapper/EmployeeMapper.xml"></mapper>
  <!--url 引用网络或者磁盘路径下的 mapper 文件-->
  <mapper url = "file:///D:/EmployeeMapper.xml"></mapper>
  <!-- 
       class 注册接口 
     1. 有 sql 映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下。
		 2. 在接口类中的每一个方法都加上类似 @Select("sql 语句") 这样的注解,就可以不写 xml 配置文件直接注入。
  -->
  <mapper class = "com.hedon.mybatis.EmployeeMapper"></mapper>
  <mapper class = "com.hedon.mybatis.PersonAnnotation"></mapper>
</mappers>

# 3.10.2 批量注册

<mappers>
  <!--
		 将 com.hedon.mapper 包下的 *Mapper 接口类注册进来。
		 这种方式要求 SQL 映射文件名必须和接口名相同并且在同一目录下。
	-->
  <package name="com.hedon.mapper"></package>
</mappers>
/
上次更新: 8/28/2022, 11:43:26 PM