Version: Next
配置解析
1. 核心配置文件
- mybatis-config.xml
2. 环境配置(environments)
Mybatis可以适应多种环境,不过要记住,每个SqlSessionFactory实例只能选择一种环境
- Mybatis默认的事务管理器 -> JDBC | MANAGED
- Mybatis默认的连接池: POOLED | UNPOOLED | JNDI
- 配置多套环境
<environments default="test">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
3. 属性(properties)
可以通过properties属性实现引用配置文件
编写一个数据库配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=root
在核心配置文件中引入
<!-- 引入外部配置文件-->
<properties resource="db.properties"/>
<environments default="test">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"></transactionManager>
<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>
- 可以直接引入外部文件
- 可以在其中增加一些属性配置
- 外部引入配置文件优先级高于内部配置的
4. 类型别名(typeAliases)
类型别名时Java类型设置一个短的名字。它之和XML配置有关,存在的意义仅在于减少类完全限定名的冗余
- 方式一:在
mybatis-config.xml
中添加typeAliases
标签,设置typeAlias
标签
<!-- 可以给实体类起别名-->
<typeAliases>
<typeAlias type="com.bsx.pojo.User" alias="User"/>
</typeAliases>
mapper.xml
<select id="getUserList" resultType="User">
SELECT * FROM USER;
</select>
测试通过。
- 方式二:在
mybatis-config.xml
中添加typeAliases
标签,设置package
标签 指定一个包名,Mybatis会在包名下面搜索需要的Java Bean
在没有注解的情况下,会使用Bean的首字母小写的非限定类名来作为它的别名。若有注解,则别名为其注解值
<!-- 可以开启包扫描-->
<typeAliases>
<package name="com.bsx.pojo"/>
</typeAliases>
扫描实体类的报名,默认别名为就为这个类的类名首字母小写
@Alias("user")
public class User{...}
<select id="getUserList" resultType="user">
SELECT * FROM USER;
</select>
测试通过
实体类比较少时,使用第一种方式,否则建议使用第二种
第一种可以自定义别名,第二种则要通过注解自定义别名
Mybatis内建了一些基本别名:
byte -> _byte
int -> _int
double -> _double
Double -> double
Integer -> int
HashMap -> hashmap
Boolean -> boolean
Short -> short
.... 以此类推
5. 设置(Settings)
这是Mybatis种极为重要的调整设置,他们会改边MyBaits的运行时行为。
设置名 | 描述 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 全局的开启或关闭配置文件中的所有映射器以配置的任何缓存 | true/false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载,特定关联关系中可通过设置fetchType 属性来覆盖该项的开关状态 | true/false | false |
useGenerateKeys | 允许JDBC支持自动生成主键,需要驱动支持。如果设置为true则这个设置强制使用自动生成主键,尽管一些驱动不能支持但仍可正常工作 | true/false | false |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则映射,即从经典数据库列名A_COLUMN到经典Java属性aCoulumn的类似映射 | true/false | false |
logImpl | 指定Mybatis所有日志的具体实现,未指定时将自动查找 | SLF4J、LOG4J、 LOG4J2、JDK_LOGGING、 COMMONS_LOGGING、 STDOUT_LOGGING、 NO_LOGGING | 未设置 |
6. 其他设置
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- Mybatis Generator Core -> 自动生成mybatis代码
- Mybatis plus -> 互补插件,提升Mybatis效率
- 通用mapper
7. 映射器(Mapper)
MapperRegistry: 注册绑定我们的Mapper.xml文件
四种方式
- 方式一:推荐使用
<!--使用相对路径的资源引用-->
<mappers>
<mapper resource="com/bsx/dao/UserMapper.xml"/>
</mappers>
方式二 <!--使用完全限定资源定位符URL--> 不推荐使用
- 方式三:使用class文件绑定注册
<!--使用映射器接口实现类的完全限定类名-->
<mappers>
<mapper class="com.bsx.dao.UserMapper"/>
</mappers>
warning
接口和mapper.xml文件名字必须一致
接口和mapper.xml文件必须在同一包内
- 方式四:将包内的映射器接口实现全部注册为映射器
<mappers>
<package name="com.bsx.dao"/>
</mappers>
warning
接口和mapper.xml文件名字必须一致
如果希望mapper.xml和接口文件分离,可以在resource目录下建与接口一样的包路径,编译后的文件会出现在同一路径
8. 生命周期
生命周期是至关重要的,因为错误的使用会导致非常严重的并发问题
- SqlSessionFactoryBuilder
- 一旦创建了
SqlSessionFactory
,就不再需要它了 - 局部变量
- 一旦创建了
- SqlSessionFactory
- 相当于数据库连接池
- 一旦被创建应该在应用的运行期间一直存在,没有任何理由丢弃它或者重新创建另一个实例。多次重建
SqlSessionFactroy
会被视为一种不良操作。因此SqlSessionFactory
的最佳作用域是应用作用域Application - 最简单的就是使用单例模式或者静态单例模式
- SqlSession
- 每个线程都应该有它自己的SqlSession实例。
- 连接到连接池的一个请求
SqlSession
实例不是线程安全的,因此不能被共享- 需要开启和关闭
- 最佳作用域是方法作用域
每一个mapper代表一个具体的业务