本系列文章为观看【狂神说Java】的 Mybatis 学习笔记
1. 配置文件
- MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
- configuration(配置)
1.1 环境
- Mybatis 可以设置成配置多种环境,但每个 SqlSessionFactory 实例只能选择一种环境。
- Mybatis 默认的事务管理器是 JDBC , 连接池是 POOLED。
1.2 属性
-
属性可以在外部进行配置,并可以进行动态替换。既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
-
属性文件配置
-
路径
子模块目录 \ src \ main \ resources \ db.properties
-
文件代码
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8 username=root password=981030
-
xml 配置文件中的标签是有顺序要求的
<properties>
><settings>
><typeAliases>
><typeHandlers>
><objectFactory>
><objectWrapperFactory>
><reflectorFactory>
> plugin ><environments>
><databaseIdProvider>
><mappers>
-
引入外部配置文件
-
路径
子模块目录 \ src \ main \ resources \ mybatis-config.xml
-
引入配置文件代码
<properties resource="db.properties"/>
-
-
-
<properties>
元素的子元素<property>
标签配置。<properties resource="db.properties"> <property name="username" value="root"/> <property name="password" value="981030"/> </properties>
-
外部配置文件的优先级要高于 .xml 文件的动态引入(很好理解,因为先执行
<properties>
标签,后执行<property>
标签嘛,(* ̄︶ ̄))。
1.3 别名
-
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
-
自定义别名
<typeAliases> <typeAlias type="com.why.pojo.User" alias="user"/> </typeAliases>
-
扫描包,默认别名为首字母小写的类名。
<!--com.why.pojo.User 别名为 user--> <typeAliases> <package name="com.why.pojo"/> </typeAliases>
-
注解起别名
@Alias("user") public class User { ... }
1.4 设置
- 设置是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为,详情请参照官方文档(太多了,我不想写了 ╮(╯▽╰)╭)。
1.5 映射器
-
告诉 MyBatis 到哪里去找到 sql 语句。
-
方式一: 使用相对于类路径的资源引用【建议使用】
<mappers> <mapper resource="包路径/mapper/UserMapper.xml"/> </mappers>
-
方式二:使用映射器接口实现类的完全限定类名
<!-- 接口和 mapper 配置文件必须同名 接口和 mapper 配置文件必须在同一个包下 --> <mappers> <mapper class="包名.mapper.UserMapper"/> </mappers>
-
方式三:将包内的映射器接口实现全部注册为映射器
<!-- 接口和 mapper 配置文件必须同名 接口和 mapper 配置文件必须在同一个包下 --> <mappers> <package name="包名.mapper"/> </mappers>
2. Mybatis 生命周期和作用域
-
生命周期和作用域是至关重要的,因为错误的使用会导致严重的并发问题,Mybatis 的执行流程如下图所示。
-
SqlSessionFactoryBuilder
- 一旦创建了 SqlSessionFactory,就不再需要它了。
- 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
-
SqlSessionFactory
- 相当于数据库连接池
- SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
- 因此 SqlSessionFactory 的最佳作用域是应用作用域。
- 最简单的就是使用单例模式或者静态单例模式。
-
SqlSession
- 相当于请求
- 每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的。
- 它的最佳的作用域是请求或方法作用域。
- 用完就关闭,否则资源被占用。
-
下图为一个简单 Mybatis 执行时序图,其中每一个 Mapper 就相当于一个业务。