MyBatis全局配置文件详解
作者:程序dunk
MyBatis全局配置文件
MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings
)和属性(properties
)信息。文档的
顶层结构如下:
configuration
配置properties
属性settings
设置typeAliases
类型命名typeHandlers
类型处理器objectFactory
对象工厂plugins
插件environments
环境environment
环境变量transactionManager
事务管理器dataSource
数据源databaseIdProvide
r 数据库厂商标识mappers
映射器
properties 属性
mybatis
可以使用properties来引入外部properties配置文件的内容
resource
:引入类路径下的资源
url:引入网络路径或者磁盘路径下的资源
<properties resource="dbconfig.properties"></properties>
如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
- 在 properties 元素体内指定的属性首先被读取。
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。 – 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
settings 设置
这是 MyBatis 中极为重要的调整设置,它们会改变MyBatis 的运行时行为。
setting包含很多重要的设置项
setting
:用来设置每一个设置项
name
:设置项名
value
:设置项的取值
mapUnderscoreToCamelCase
:驼峰命名 last_name -> lastName
<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
typeAliases 类型命名
typeAliases
:可以批量设置别名这个包下的每一个类
别名不区分大小写
创建一个默认的别名,就是简单类名小写
typeAlias
:为某个java类型起别名
type
:指定要起别名的类型全类名;默认别名就是类名小写:employee
alias
:指定新的别名
package
:为某个包下的所有类批量起别名
name
:指定包名(为当前包下以及下面所有的后代包的每一个类都起一个默认的别名(类名小写))
存在的问题:
假设bean包下有一个类Employee,同时在bean包下有一个子包也有一个类叫Employee,此时这两个包的类名就会冲突,因此还可以使用注解的放上为类创建别名
@Alias("")
public class Employee{}
值得注意的是,MyBatis已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,我们在起别名的时候千万不要占用已有的别名。
environments 环境
mybatis可以配置多种环境 default指定使用某种环境,可以达到快速切换
environments
:配置一个具体的环境信息;必须有两个标签,id代表当前环境的唯一标识
transactionManager 事务管理器
type
:事务管理器的类型 [JDBC(使用了 JDBC 的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围。)|MANAGED
(不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如 JEE应用服务器的上下文))]
JDBC:JdbcTransactionFactory
自定义事务管理器 实现TransactionFactory接口即可
dataSource 数据源
type
:数据源的类型 [UNPOOLED
(不使用连接池)|POOLED
(使用连接池)|JNDI
(在EJB 或应用服务器这类容器中查找指定的数据源)]
自定义数据源 实现DataSourceFactory接口
实际开发中我们使用Spring管理数据源,并进行事务控制的配置来覆盖上述配置
databaseIdProvider 数据库厂商标识
databaseIdProvider: 可以根据不同的数据库厂商执行不同的语句。
type
:数据库类型 DB_VENDOR
作用就是得到数据库厂商标识(驱动自带的),mybatis就能根据数据库厂商标识来执行不同的sql
MYSQL Oracle SQL Server
value:为标识起一个别名,方便SQL语句使用databaseId属性引用
DB_VENDOR
会通过 DatabaseMetaData#getDatabaseProductName() 返回的字符串进行设置。由于通常情况下这个字符串都非常长而且相同产品的不同版本会返回不同的值,所以最好通过设置属性别名来使其
变短
MyBatis匹配规则如下:
- 如果没有配置databaseIdProvider标签,那么databaseId=null
- 如果配置了databaseIdProvider标签,使用标签配置的name去匹配数据库信息,匹配上设置databaseId=配置指定的值,否则依旧为null
- 如果databaseId不为null,他只会找到配置databaseId的sql语句
- MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库databaseId 属性的所有语句。如果同时找到带有 databaseId 和不带databaseId 的相同语句,则后者会被舍弃。
mappers 映射器
mapper:注册一个sql映射
注册配置文件
resource
:引用类路径下的sql映射文件
url:用网路路径下的或者磁盘路径下的sql映射文件
注册接口
class:引应用接口
- 接口映射文件,映射文件名必须和接口同名,并且放在同一个目录下
- 没有sql映射文件,所有的sql利用注解写在接口上
注解写在接口上
推荐:比较重要和复杂额Dao接口写sql映射文件,不重要的简单的为了开发快速可以使用注解
package:批量注册
sql映射文件
namespace
:名称空间;指定为接口的全类名
id
:唯一标识
resultType
:返回值类型
#{id}
:从传递过来的参数中取出id值
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="school.xauat.mybatis.dao.EmployeeMapper"> <select id="getEmpById" resultType="employee" > select * from tbl_employee where id = #{id} </select> <select id="getEmpById" resultType="employee" databaseId="mysql"> select * from tbl_employee where id = #{id} </select> <select id="getEmpById" resultType="employee" databaseId="oracle"> select * from tbl_employee where id = #{id} </select> </mapper>
总结
1、接口是编程
原生: Dao -----> DaoImpl
Mybatis: Mapper -----> xxMapper.xml
2、SqlSession代表和数据库的一次会话,用完必须关闭
3、SqlSession和connection一样,都是非线程安全的。每次使用都应该获取新的对象
4、mapper接口没有实现类,但是Mybatis会为这个接口生成一个代理对象(将接口和xml进行绑定)
EmployeeMapper empMapper
= SqlSession.getMapper(Employee.class)
;
5、两个重要的配置文件
mybatis的全局配置文件;包含数据库连接池信息,事务管理器信息,系统运行信息
sql映射文件:保存了每一个SQL语句的映射信息
将sql抽取出来