一、配置解析
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
configuration(配置):
properties(属性)
settings(设置)
typeAliases(类型别名)
environments(环境配置)
environment(环境变量):
transactionManager(事务管理器)
dataSource(数据源)
mappers(映射器)
1.1 、properties(属性)
这些属性可以在外部进行配置,并可以进行动态替换。你既可以,也可以在 properties 元素的子元素中设置。
方式一:外部资源配置:创建 jdbc.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名称?serverTimezone=UTC&useSSL=false
username=root
password=123456
使用properties 标签加载外部资源
<properties resource="jdbc.properties">
</properties>
在environment 设置中加载properties 读取的属性
<environment id="test">
<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>
方式二 直接在environment 中写,动态替换
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
1.2、settings(设置)
暂时掌握以下:
cacheEnabled:全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。默认为true
lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。默认为false
logImpl:指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING 。未设置
1.3、typeAliases(类型别名)
- 类型别名可为 Java 类型设置一个缩写名字。
- 它仅用于 XML 配置,意在降低冗余的全限定类名书写
方式一:对于一个包实体类数目较少时,建议使用
// type 指定具体的实体类的相对路径
<typeAliases>
<typeAlias type="com.chen.pojo.User" alias="User"/>
<typeAlias type="com.chen.pojo.Role" alias="Role"/>
....
</typeAliases>
方式二:对于一个包,实体类数目较多时,建议使用
// name 指定一个包名,MyBatis 会在包名下面搜索需要的实体类
<typeAliases>
<package name="com.chen.pojo"/>
</typeAliases>
在没有注解的情况下,会使用每个实体类的首字母小写的类名来作为别名。
若有注解,则别名为其注解值,例如
@Alias("Hello")
public class User{
...
}
1.4、环境配置(environments)
- MyBatis 可以配置成适应多种环境
- 不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
根据id选择不同的环境
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<environment id="test">
<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>
1.4.1、事务管理器(transactionManager)
MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"),默认为JDBC
JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域
MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期
1.4.2、数据源(dataSource)
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]"):默认为POOLED
UNPOOLED– 这个数据源的实现会每次请求时打开和关闭连接。
POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。
1.5、mappers(映射器)
作用:就是告诉MyBatis 到哪里去找到这些语句
建议使用
<mappers>
<mapper resource="com/chen/UserDao/UserMapper.xml"/>
...
</mappers>
<mappers>
<mapper class="com.chen.UserDao.UserMapper"/>
.....
</mappers>
<mappers>
<package name="com.chen.UserDao"/>
</mappers>
1.6、作用域(Scope)和生命周期
作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder: 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了
1.最佳作用域是方法作用域(也就是局部方法变量)
2.保证不占用资源
SqlSessionFactory:一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
1.可以想象为数据库连接池
2.最佳作用域是应用作用域
3.最简单的就是使用单例模式或者静态单例模式创建(只有一个)
SqlSession:每个线程都应该有它自己的 SqlSession 实例
1.SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
2. 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。(必须关闭)