mybatis-config.xml
<?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>
</configuration>
configuration
Mybatis
配置文件的最外层节点为 <configuration></configuration>
,内部结构如下:
- configuration (配置)
- properties (属性)
- settings (设置)
- typeAliases (类型别名)
- typeHandlers (类型处理器)
- objectFactory (对象工厂)
- plugins (插件)
- environments (环境配置)
- environment (环境变量)
- transactionManager (事务管理器)
- datasource (数据源)
- environment (环境变量)
- databaseIdProvider (数据库厂商标识)
- mappers (映射器)
properties (属性)
属性设置有三种方式,按加载顺序依次为:子元素、外部属性文件、方法参数,后加载的属性会覆盖先加载的同名属性
子元素
通过 properties
的子元素 property
进行设置
<properties>
<property name="username" value="root"/>
<property name="password" value="root123"/>
</properties>
设置好的属性可以在整个配置文件中用来替换需要动态配置
的属性值。比如常用的数据源配置:
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
外部属性文件
在 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
属性引入
<properties resource="db.properties" />
或
<properties url="db.properties" />
方法参数
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
开始,可以为占位符指定一个默认值,这个特性是默认关闭的,需要手动开启
<properties>
<!-- 开启默认值特性 -->
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
</properties>
<dataSource type="POOLED">
<!-- 如果没有配置 username 属性,就会使用 root -->
<property name="username" value="${username:root}"/>
</dataSource>
设置默认值的分隔符默认是 :
,如果属性名称中使用了 :
(如:db:username
),或使用了带有 :
的表达式(如三元表达式 ${username != null ? username : 'root'}
),就需要修改默认的分隔符
<properties>
<!-- 修改默认值的分隔符 -->
<property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/>
</properties>
这样就可以使用 ?:
来作为分隔符了
<dataSource type="POOLED">
<property name="username" value="${db:username?:root}"/>
</dataSource>
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
类型设置缩写,
<typeAliases>
<!-- 为User类设置别名 -->
<typeAlias type="com.entity.User" alias="user"/>
</typeAliases>
// UserMapper.xml
<select id="findUserById" resultType="user">
select * from tb_user where id = #{id}
</select>
也可以指定包名来对包下的所有Java Bean
设置别名,默认是使用类名首字母小写作为别名
<typeAliases>
<package name="com.entity"/>
</typeAliases>
如果类上使用了注解设置别名,则会使用注解中的别名
@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可以设置多个环境,但是在运行时只能选择一种环境
<!-- 默认使用dev环境 -->
<environments default="dev">
<!-- dev环境配置 -->
<environment id="prod">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED"></dataSource>
</environment>
<!-- test环境配置 -->
<environment id="test">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED"></dataSource>
</environment>
</environments>
environment (环境变量)
environment
配置具体的环境信息,包括 transactionManager(事务管理器)
和datasource(数据源)
<environment id="prod">
<!-- 事务管理器 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据源 -->
<dataSource type="POOLED"></dataSource>
</environment>
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
– 最大活跃连接数,默认值:10 -
poolMaximumIdleConnections
– 最大空闲连接数。 -
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
可以根据不同的数据库厂商执行不同的语句(没用过)
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider>
mappers (映射器)
通过mappers
来引入映射文件,引入方式有四种:resource、url、class、package
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
方式 | 标签样式 | mapper文件类型 | 路径类型 |
---|---|---|---|
resource | <mapper resource=""/> | xml | 类路径相对路径 |
url | <mapper url=""/> | xml | 本地文件路径 |
class | <mapper class=""/> | 接口 | 实现类的完全限定类名 |
package | <package name=""/> | 接口 | 包名 |
实际开发中由于mapper
文件一般会有很多,所以常用策略是都放在一个包下,然后通过package
方式进行引入。resource
和class
适合mapper
文件较少的情况,url
方式基本不会用到
网友评论