文章目录
MyBtis从入门到入土
4 配置解析
在上一篇博客实操的项目中,一开始需要在mybatis-config.xml文件中配置各种信息,这一次我们来深入解析这个配置文件
当然,最好的方式是结合MyBatis的官方文档来Configuration
4.1 核心配置文件
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
4.2 environments环境配置
首先我们从环境配置开始,以上一篇博客项目的mybatis-config.xml为例:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- xml中需要用 & 转义表示 & -->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="mysql"/>
</dataSource>
</environment>
</environments>
- 我们可以配置多个环境,也就是多个
<enviroment></enviroment>,每个环境可以连接到一个数据库。(连接多个数据库的作用可以是用于生产和测试)
展示两个环境
<!-- dafault选择环境 -->
<environments default="test">
<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>
<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>
- 官网加粗了的一句话
One important thing to remember though: While you can configure multiple environments, you can only choose ONE per SqlSessionFactory instance.*
一件很重要的事情需要去记住:虽然你可以配置多个环境,但每个SqlSessionFactory实例只能选择一个环境。
- MyBatis的默认的
transactionManager是JDBC,默认的dataSource是POOLED,如果要了解和使用其他的可以直接上官网查询。
4.3 properties属性配置
- 在resources编写配置文件
db.properties,这个文件含有数据库连接的配置信息
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=mysql
注意在配置文件里直接用
&,不需要跟原来xml文件中的&这样的转义写法了
- 接着在mybatis-config.xml配置文件中添加
properties配置,注意,我们添加的这些配置是有顺序的,如果你不按照顺序的话,那么会报下面这个错误:
The content of element type “configuration” must match “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)”.
这个错误表示mybatis-config.xml中的<configuration></configuration>标签中元素位置不能随意,必须匹配其顺序要求。
- 这样我们就可以在环境中直接引用属性中的值了 ,采用
${value}的格式:
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<!-- xml中需要用 & 转义表示 & -->
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
4.4 typeAliases别名配置
A type alias is simply a shorter name for a Java type. It’s only relevant to the XML configuration and simply exists to reduce redundant typing of fully qualified classnames.
别名是Java类名的简短名字。它对XML配置唯一的意义和存在是去减少冗余的全限定类名的输入。
- 方式一:指定类名
在mybatis-config.xml中使用<typeAliases></typeAliases>配置别名信息
<typeAliases>
<typeAlias type="com.cap.pojo.User" alias="user"></typeAlias>
</typeAliases>
起好别名后,就可以直接在UserMapping.xml中使用了
<select id="getUserById" resultType="user" parameterType="int">
SELECT * FROM mybatis.user
WHERE id = #{id};
</select>
<update id="updateUser" parameterType="user" >
UPDATE mybatis.user
SET name=#{name},pwd=#{pwd}
WHERE id=#{id};
</update>
- 方式二:指定包名
<typeAliases>
<package name="com.cap.pojo"/>
</typeAliases>
指定包名的话,MyBatis会去扫描包下类别名注解@Alias("alias_name"),如果没有指明注解别名的话,MyBatis会默认使用小写首字母的类名作为别名,相当于:
@Alias("user")
public class User{
...
}
- 这里还有一些默认的内置名称,可以直接使用

4.5 settings设置配置
These are extremely important tweaks that modify the way that MyBatis behaves at runtime. 这是MyBatis中极为重要的调整设置,他们会改变MyBatis在运行时的行为。
下面列举比较重要的几个设置,其余可以见官网


4.6 Mapping映射器配置
映射器的作用是告诉MyBatis去哪里找我们定义的SQL映射语句。
官网提到的映射器配置有四种方式,下面列举三种最常用的方式,其中首推使用第一种方式,因为它最通用,也不像第二、第三种一样注意点多。
- 方式一:使用相对于类路径的资源引用
<mappers>
<mapper resource="com/cap/dao/UserMapping.xml"/>
</mappers>
- 方式二:使用映射器接口实现类的完全限定类名
<mappers>
<mapper class="com.cap.dao.UserMapping" />
</mappers>
注意点:
- 接口和它的配置文件必须同名:
UserMapper接口和UserMapper.xml - 接口和它的配置文件必须在同一包下
- 方式三:将包内的映射器接口实现全部注册为映射器
<mappers>
<package name="com.cap.dao"/>
</mappers>
注意点和方式二一样
4.7 其他配置
其他配置不常用,这里不展开描述
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
5 生命周期和作用域
我们知道MyBatis框架中持久层的流程大约如下:
那么我们来解析一下SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession这三个类的生命周期和作用域,如果你不了解他们的话,那么后期可能会造成严重的并发问题
SqlSessionFactoryBuilder- 一次性,使用它创建完SqlSessionFactory就可以抛弃
- 它最好的作用域是存在于方法的局部变量
SqlSessionFactory- 存在于程序运行的整个周期
- 最好的作用域是作为全局作用域(即类变量/静态变量)
There should be little or no reason to ever dispose of it or recreate it. 没有理由丢弃它再去重新创建该实例。
- 它的实现方式有多种,最简单的可以使用单例模式或者静态单例模式创建它
SqlSession- 每个线程应该有自己的
SqlSession实例。SqlSession线程不安全,所以线程间不要共享。 - 最好的作用域是一个请求或者方法的局部变量。
- 用完之后必须关闭
- 每个线程应该有自己的
MapperMapper是一些绑定映射语句的接口。Mapper的实例可以从SqlSession实例中获取Mapper实例最好的作用域是方法内的局部变量,并且你不需要显式地关闭它。
尽管在整个请求作用域保留映射器实例不会有什么问题,但是你很快会发现,在这个作用域上管理太多像 SqlSession 的资源会让你忙不过来。 因此,最好将映射器放在方法作用域内。
本文详细解析MyBatis配置文件的各个部分,包括环境配置、属性配置、别名配置、设置配置、映射器配置等,帮助理解MyBatis的工作原理。

被折叠的 条评论
为什么被折叠?



