# 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在运行时的行为方式。
图源: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 类,导致冲突,运行报错(因为别名已经用过了,想再用到另外一个身上,肯定不行)。
这时候可以用 ==@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 内置的别名
我们起别名的时候不要和这些重复了,会冲突。
# 3.4 typeHandlers
无论是 MyBatis 在预处理语句(PreparedStatement)中 设置一个参数时,还是从结果集中取出一个值时, 都会 用类型处理器将获取的值以合适的方式转换成 Java 类型。
# 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 可以根据不同的数据库厂商执行不同的语句。
# 3.9.1 type
DB_VENDOR:
使用 MyBatis 提供的 VendorDatabaseIdProvider
解析数据库厂商标识。也可以实现 DatabaseIdProvider
接口来自定义。
# 3.9.2 property
name
数据库厂商标识。
value
为标识起一个别名,方便SQL语句使用 databaseId 属性引用。
# 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>