文章目录
Mybatis核心配置文件
MyBatis 的配置文件包含了影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
元素节点必须按顺序排列,顺序不对会报错
1. properties 属性
属性配置方式:
在外部配置文件中配置然后引入
直接在properties的子元素property中配置
在 SqlSessionFactoryBuilder.build() 方法中传入属性值
属性加载优先级:
方法传参>外部引入>内部配置
- jdbc.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=root
< properties resource="jdbc.properties">
< property name="username" value="root"/>
< property name="password" value="root"/>
< /properties>
设置好的属性可以在整个配置文件中通过EL表达式取用
< dataSource type="POOLED">
< property name="driver" value="${driver}"/>
< property name="url" value="${url}"/>
< property name="username" value="${username}"/>
< property name="password" value="${password}"/>
< /dataSource>
2. settings 设置
- lazyLoadingEnabled
- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置
fetchType
属性来覆盖该项的开关状态。- 默认值为false
- cacheEnabled
- 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存
- 默认值为true
- logImpl
- 指定 MyBatis 所用日志的具体实现,未指定时将自动查找
配置完整的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>
3. typeAliases 类型别名
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,降低冗余的全限定类名书写
< typeAliases>
< typeAlias alias="User" type="ltd.lccyj.domain.User"/>
< /typeAliases>
也可以指定一个包名,Mybatis会在包名下面搜索需要的 Java Bean
在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名
< typeAliases>
< package name="ltd.lccyj.domain"/>
< /typeAliases>
若有注解,则别名为其注解值
@Alias("user")
public class User {
}
4. typeHandlers 类型处理器
- 无论设置一个参数还是从结果集中取出一个值,都会用类型处理器将获取的值以合适的方式转换为java类型
- 可以重写已有的类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型
5.objectFactory 对象工厂
- 每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作
- 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。
- 想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现
6. environments 环境配置
可配置多套Mybatis运行环境,将SQL映射至多个不同的数据库
必须用default指定默认运行环境
< environments default="development">
< environment id="development">
< transactionManager type="JDBC"/>
< dataSource type="POOLED">
< property name="driver" value="${driver}"/>
< property name="url" value="${url}"/>
< property name="username" value="${username}"/>
< property name="password" value="${password}"/>
< /dataSource>
< /environment>
< /environments>
子节点environment
具体的运行环境
1. transactionManager 事务管理器
有两种事务管理器类型 type="[JDBC|MANAGED]"
- JDBC: 使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接管理事务作用域
- MANAGED: 它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期
使用 Spring + MyBatis,则没有必要配置事务管理器
2.dataSource 数据源
必须配置
使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源
有三种数据源类型 type="[UNPOOLED|POOLED|JNDI]"
- UNPOOLED: 这个数据源的实现会每次请求时打开和关闭连接
- POOLED: 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来
- JNDI: 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用
7. mappers 映射器
映射器:定义映射SQL语句文件
每一个Mapper.xml都需要在Mybatis核心文件中注册
引入资源的方式:
< !-- 使用相对于类路径的资源引用 -->
< mappers>
< mapper resource="mapper/UserMapper.xml"/>
< /mappers>
< !-- 使用完全限定资源定位符(URL) -->
< mappers>
< mapper url="file:///var/mappers/UserMapper.xml"/>
< /mappers>
< !-- 使用映射器接口实现类的完全限定类名 -->
< !-- 需要配置文件与接口名称一致且位于同一目录下 -->
< mappers>
< mapper class="ltd.lccyj.mapper.UserMapper"/>
< /mappers>
< !-- 将包内的映射器接口实现全部注册为映射器 -->
< !-- 需要配置文件与接口名称一致且位于同一目录下 -->
< mappers>
< package name="ltd.lccyj.mapper"/>
< /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">
< !--namespace=Mapper接口类全限定名-->
< mapper namespace="ltd.lccyj.mapper.UserMapper">
< /mapper>
namespace: 命名空间
- 必须与某个mapper接口同名
- 接口中的方法与映射文件中sql语句的id应该一一对应
8. 作用域与生命周期
作用域与生命周期是至关重要的,错误的使用会导致非常严重的并发问题
Mybatis应用执行过程中的对象:
SqlSessionFactoryBuilder
- 该类用来建造SqlSessionFactory对象,建造完成后不再需要这个类
- 最佳作用域是方法作用域(局部方法变量)
SqlSessionFactory
- 该对象被创建后应该一直存在,避免重复创建
- 最佳作用域为应用作用域,使用单例模式或者静态单例模式
SqlSession
- SqlSession 的实例不是线程安全的,不能被共享的,最佳的作用域为请求或方法作用域
- 每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它
Mapper
- 映射器实例应该在调用它们的方法中被获取,使用完毕之后即可丢弃
- 最佳作用域为方法作用域