mybatis-config.xml
configuration
Mybatis
配置文件的最外层节点为
,内部结构如下:
- configuration (配置)
- properties (属性)
- settings (设置)
- typeAliases (类型别名)
- typeHandlers (类型处理器)
- objectFactory (对象工厂)
- plugins (插件)
- environments (环境配置)
- environment (环境变量)
- transactionManager (事务管理器)
- datasource (数据源)
- environment (环境变量)
- databaseIdProvider (数据库厂商标识)
- mappers (映射器)
properties (属性)
属性设置有三种方式,按加载顺序依次为:子元素、外部属性文件、方法参数,后加载的属性会覆盖先加载的同名属性
子元素
通过 properties
的子元素 property
进行设置
设置好的属性可以在整个配置文件中用来替换需要动态配置
的属性值。比如常用的数据源配置:
外部属性文件
在 resources
目录下建一个 properties
文件 db.properties
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
db.username=root
db.password=root123
在 properties
标签中通过 resources
或 url
属性引入
或
方法参数
Mybatis
的配置文件是通过 SqlSessionFactoryBuilder的build()
方法加载的,这个方法还可以传入一个 Properties
类型的参数用来加载属性
// 方法名
public SqlSessionFactory build(InputStream inputStream, Properties properties)
// 使用
String configPath = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(configPath)
String propPath = "db.properties";
Properties properties = new Properties();
properties.load(Resources.getResourceAsStream(propPath));
// 传入属性对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, properties);
默认值
从 MyBatis 3.4.2
开始,可以为占位符指定一个默认值,这个特性是默认关闭的,需要手动开启
设置默认值的分隔符默认是 :
,如果属性名称中使用了 :
(如:db:username
),或使用了带有 :
的表达式(如三元表达式 ${username != null ? username : 'root'}
),就需要修改默认的分隔符
这样就可以使用 ?:
来作为分隔符了
settings (设置)
设置是配置文件中极为重要的部分,关系到 Mybatis 运行时的行为,这里只选取部分常用的设置,完整版请移步Mybatis官网
cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 | true | false | true |
---|---|---|---|
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 |
true | false | false |
aggressiveLazyLoading | 开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods )。 |
true | false | false (在 3.4.1 及之前的版本中默认为 true) |
useGeneratedKeys | 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。 | true | false | False |
autoMappingBehavior | 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集(无论是否嵌套)。 | NONE, PARTIAL, FULL | PARTIAL |
defaultStatementTimeout | 设置超时时间,它决定数据库驱动等待数据库响应的秒数。 | 任意正整数 | 未设置 (null) |
mapUnderscoreToCamelCase | 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 | true | false | False |
returnInstanceForEmptyRow | 当返回行的所有列都是空时,MyBatis默认返回 null 。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集(如集合或关联)。(新增于 3.4.2) |
true | false | false |
logPrefix | 指定 MyBatis 增加到日志名称的前缀。 | 任何字符串 | 未设置 |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未设置 |
typeAliases (类型别名)
在设置类型时需要使用类的全限定名,名称比较长,typeAliases
可以为Java
类型设置缩写,
// UserMapper.xml
也可以指定包名来对包下的所有Java Bean
设置别名,默认是使用类名首字母小写作为别名
如果类上使用了注解设置别名,则会使用注解中的别名
@Alias("myUser")
public class User {}
typeHandlers (类型处理器)
在对SQL
语句设置参数或从结果集中取字段时,typeHandlers
可以 处理Java
类型和SQL
类型之间的转换。
objectFactory (对象工厂)
在将结果集映射成对象时,都会使用objectFactory
进行实例化工作。
plugins (插件)
Mybatis允许在执行过程中对一些方法进行拦截,默认可通过插件进行拦截的方法有
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
environments (环境配置)
Mybatis可以设置多个环境,但是在运行时只能选择一种环境
environment (环境变量)
environment
配置具体的环境信息,包括 transactionManager(事务管理器)
和datasource(数据源)
transactionManager (事务管理器)
transactionManager
有两种:JDBC
和MANAGED
。
JDBC:使用了
JDBC
的提交和回滚机制来管理事务。基本都用这个MANAGED:把事务交给容器来管理,从不提交或回滚一个连接。几乎不用
datasource (数据源)
datasource
有三种:UNPOOLED
、POOLED
、JNDI
,这里只对常用的POOLED
进行具体说明。
UNPOOLED:每次请求是都会打开和关闭连接,效率相对较低。
POOLED:使用”池“的概念来管理连接,复用空闲连接来提升效率。(常用)
JNDI: 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。
POOLED
可以设置的属性有:
driver
– JDBC 驱动的 Java 类全限定名。(常用)url
– 数据库的 JDBC URL 地址。(常用)username
– 数据库用户名。(常用)password
– 数据库密码。(常用)defaultTransactionIsolationLevel
– 默认的连接事务隔离级别。defaultNetworkTimeout
– 等待数据库操作完成的默认网络超时时间(单位:毫秒)。driver.encoding=UTF8
– 给数据库驱动设置编码.poolMaximumActiveConnections
– 最大活跃连接数,默认值:10poolMaximumIdleConnections
– 最大空闲连接数。poolMaximumCheckoutTime
– 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)poolTimeToWait
– 从连接池中获取连接的等待时间,默认值:20000 毫秒(即 20 秒)。poolMaximumLocalBadConnectionTolerance
– 最大坏连接容忍度。 如果获取到的是一个坏的连接,那么数据源允许尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过poolMaximumIdleConnections
与poolMaximumLocalBadConnectionTolerance
之和。 默认值:3(新增于 3.4.5)poolPingQuery
– 发送到数据库的侦测查询。默认是“NO PING QUERY SET”。poolPingEnabled
– 是否启用侦测查询,默认值:false。poolPingConnectionsNotUsedFor
– 配置 poolPingQuery 的频率,默认值:0(即所有连接每一时刻都被侦测 )。
实际开发中很少会使用默认的数据库连接池,比如常用阿里的druid
连接池,所以只做简单了解即可。
databaseIdProvider (数据库厂商标识)
MyBatis
可以根据不同的数据库厂商执行不同的语句(没用过)
mappers (映射器)
通过mappers
来引入映射文件,引入方式有四种:resource、url、class、package
方式 | 标签样式 | mapper文件类型 | 路径类型 |
---|---|---|---|
resource | xml | 类路径相对路径 | |
url | xml | 本地文件路径 | |
class | 接口 | 实现类的完全限定类名 | |
package | 接口 | 包名 |
实际开发中由于mapper
文件一般会有很多,所以常用策略是都放在一个包下,然后通过package
方式进行引入。resource
和class
适合mapper
文件较少的情况,url
方式基本不会用到