MyBatis配置解析
1、核心配置文件
- mybatis-config.xml
- MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
<!-- 注意元素节点的顺序!顺序不对会报错 -->
2、属性(properties)
我们可以通过properties属性来实现引用配置文件
数据库的属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。【db.properties】
-
编写一个配置文件db.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?useSLL=true&useUnicode=true&characterEncoding=utf-8 jdbc.user=root jdbc.password=123456
-
在mybatis-config.xml中引入properties 配置文件
<!-- 引入外部配置文件 -->
<properties resource="db.properties">
<property name="jdbc.password" value="1111"/>
</properties>
- 可以直接引用外部配置文件
- 也可以在其中增加一些属性配置
- 默认优先引用外部配置文件的信息
- 更多信息请看官网文档
3、环境配置(environments)
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</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>
配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default指定)
尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境
-
子元素节点:environment
-
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源
-
数据源是必须配置的
-
有三种内建的数据源类型
type="[UNPOOLED|POOLED|JNDI]")
- UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接
- POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式
- JNDI:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用
-
-
子元素节点:transactionManager - [ 事务管理器 ]
-
语法
<!-- 语法 --> <transactionManager type="[ JDBC | MANAGED ]"/>
-
这两种事务管理器类型都不需要设置任何属性
-
-
子元素节点:数据源(dataSource)
- 数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等....
具体的一套环境,通过设置id进行区别,id保证唯一!
4、类型别名(typeAliases)
- 类型别名可为 Java 类型设置一个缩写名字
- 它仅用于 XML 配置,意在降低冗余的全限定类名书写
给单个实体类起别名
<!-- 给单个实体类起别名 -->
<typeAliases>
<typeAlias alias="user" type="com.jh.domain.User"/>
</typeAliases>
当这样配置时,user
可以用在任何使用 com.jh.domain.User
的地方
为整个包下的实体类起别名
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean
<!-- 为整个包下的实体类起别名 -->
<typeAliases>
<package name="com.jh.domain"/>
</typeAliases>
在没有注解的情况下,com.jh.domain
包下的每个Java Bean的别名都会使用 Bean 的首字母小写的非限定类名来作为它的别名
如何选择使用:
- 当类比较少时可以第一种方式单独设置
- 当类比较多时可以第二种方式为整个包设置别名
- 第一种方式的别名可以自定义DIY别名
- 第二种方式必须使用其规定的别名
- 也可以使用注解实现第二种方式的DIY
@Alias("user")
public class User {
...
}
常见的 Java 类型内建的类型别名
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integet | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
5、设置(settings)
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
我们常用的设置有:
- 缓存开启关闭
- 懒加载
- 日志功能
设置名 | 描述 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存 | true | false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态 |
true | false | false |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未设置 |
一个配置完整的 settings 元素的示例如下:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
6、映射器(mappers)
映射器 : 定义映射SQL语句文件
MapperRegistry:注册绑定我们的Mapper文件
引入资源的方式
方式一:
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/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配置文件必须同名
- 接口和它的Mapper配置文件必须在同一个包下
如果xml文件命名规范,也可使用通配符*
进行统一配置
<mappers>
<mapper resource="org/mybatis/builder/*Mapper.xml"/>
</mappers>
Mapper文件
<?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="com.jh.mapper.UserMapper">
...
</mapper>
namespace中文意思:命名空间,作用如下:
- namespace的命名必须跟某个接口同名
- 接口中的方法与映射文件中sql语句id应该一一对应
- namespace和子元素的id联合保证唯一 , 区别不同的mapper
- 绑定DAO接口
- namespace命名规则 : 包名+类名
MyBatis 的真正强大在于它的映射语句,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 为聚焦于 SQL 而构建,以尽可能地为你减少麻烦。
7、其他不常用配置
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- mybatis-generator-core
- mybatis-plus
- 通用mapper
- databaseIdProvider(数据库厂商标识)