MyBatis 的持久化离不开 SqlSessionFactory 对象,这个对象是整个数据库映射关系经过编译后的内存镜像。SqlSessionFactory 能够打开 SqlSession 对象,而 SqlSessionFactory 由 SqlSessionFactoryBuilder 加载 MyBatis 的配置文件产生。
我们先来看一下上篇笔记中我们配置文件 mybatis.cfg.xml 中的内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 为JavaBean起类别名 -->
<typeAliases>
<!-- 指定一个包名起别名,将包内的 Java 类的类名作为类的类别名 -->
<package name="com.gler.mybatis.model" />
</typeAliases>
<!-- 配置mybatis运行环境 -->
<environments default="development">
<environment id="development">
<!-- type="JDBC" 代表直接使用 JDBC 的提交和回滚设置 -->
<transactionManager type="JDBC" />
<!-- POOLED 表示支持JDBC数据源连接池 -->
<!-- 数据库连接池,由 Mybatis 管理,数据库名是 mybatis,MySQL 用户名 root,密码 root -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 通过 mapper 接口包加载整个包的映射文件 -->
<package name="com/gler/mybatis/mapper" />
</mappers>
</configuration>
MyBatis 配置文件的 configuration 标签主要包括:
- configuration 配置
- properties 属性
- settings 设置
- typeAliases 类型命名
- typeHandlers 类型处理器
- objectFactory 对象工厂
- plugins 插件
- environments 环境
- environment 环境变量
- transactionManager 事务管理器
- databaseIdProvider 数据库厂商标识
- mappers 映射器
在上面的示例配置文件中,值包含了最基本的 typeAliases 类型命名、 environments 环境和 mappers 映射器。
1.properties 属性
这些属性是可外部配置且动态替换的,例如在上篇笔记的基础上在目录 /Java Resources/src
下建立了 Java 属性文件 config.properties
,用于配置一些数据库的信息,内容如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=root
在配置文件中配置 <properties…/> 属性:
<properties resource="config.properties"/>
同样可以通过 properties 元素的子元素来传递值,如在这里设置 username
和 password
的值:
<properties resource="config.properties">
<property name="username" value="root"/>
<property name="password" value="123"/>
</properties>
在配置文件中使用这些属性值:
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
注:MyBatis 加载属性的顺序如下(引用自MyBatis中文文档——properties):
- 首先读取 properties 元素体内指定的属性
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性
- 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性
2.settings 设置
settings 是 MyBatis 极为重要的设置,它们会改变 MyBatis 的运行时行为,如开启二级缓存、开启延迟加载等。
settings 设置的详细情况可参考MyBatis中文文档——settings 。
3. typeAliases 类型命名
同样来看上篇笔记的 mybatis.cfg.xml ,可以看到我们为 Java 类型设置了一个短的名字取代了类型的全路径。
同时在映射文件 UserMapper.xml 中存在类似如下的语句:
<update id="updateUser" parameterType="User">
update user set
address=#{address} where
id=#{id}
</update>
<select id="selectUserById" parameterType="int" resultType="User">
select * from user where id=#{id}
</select>
typeAliases 只和 XML 配置有关,用来减少类完全限定名的冗余,如:
<typeAliases>
<typeAliase alias="User" type="com.gler.mybatis.model.User"/>
</typeAliases>
这里将全路径的 com.gler.mybatis.model.User
起一个别名 User
。在映射文件中 parameterType
和 resultType
就可以直接使用别名 User
,无需使用全路径。
除了上述方法,还可以指定一个包名起别名, MyBatis 会在包名下面搜索需要的 JavaBean,将 Java 类的类名作为类的类别名,如:
<typeAliases>
<package name="com.gler.mybatis.model" />
</typeAliases>
MyBatis 中内建的别名,来自MyBatis中文文档——typeAliases:
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
4.typeHandlers 类型处理器
typeHandlers 的作用是实现 JDBC 类型和 Java 类型的之间的转换,MyBatis 中默认的类型处理器基本能满足日常需求。
类型处理器 | Java 类型 | JDBC 类型 |
---|---|---|
BooleanTypeHandler | java.lang.Boolean, boolean | 数据库兼容的 BOOLEAN |
ByteTypeHandler | java.lang.Byte, byte | 数据库兼容的 NUMERIC 或 BYTE |
ShortTypeHandler | java.lang.Short, short | 数据库兼容的 NUMERIC 或 SHORT INTEGER |
IntegerTypeHandler | java.lang.Integer, int | 数据库兼容的 NUMERIC 或 INTEGER |
LongTypeHandler | java.lang.Long, long | 数据库兼容的 NUMERIC 或 LONG INTEGER |
FloatTypeHandler | java.lang.Float, float | 数据库兼容的 NUMERIC 或 FLOAT |
DoubleTypeHandler | java.lang.Double, double | 数据库兼容的 NUMERIC 或 DOUBLE |
BigDecimalTypeHandler | java.math.BigDecimal | 数据库兼容的 NUMERIC 或 DECIMAL |
StringTypeHandler | java.lang.String | CHAR, VARCHAR |
ClobReaderTypeHandler | java.io.Reader | - |
ClobTypeHandler | java.lang.String | CLOB, LONGVARCHAR |
NStringTypeHandler | java.lang.String | NVARCHAR, NCHAR |
NClobTypeHandler | java.lang.String | NCLOB |
BlobInputStreamTypeHandler | java.io.InputStream | - |
ByteArrayTypeHandler | byte[] | 数据库兼容的字节流类型 |
BlobTypeHandler | byte[] | BLOB, LONGVARBINARY |
DateTypeHandler | java.util.Date | TIMESTAMP |
DateOnlyTypeHandler | java.util.Date | DATE |
TimeOnlyTypeHandler | java.util.Date | TIME |
SqlTimestampTypeHandler | java.sql.Timestamp | TIMESTAMP |
SqlDateTypeHandler | java.sql.Date DATE | |
SqlTimeTypeHandler | java.sql.Time TIME | |
ObjectTypeHandler | Any | OTHER 或未指定类型 |
EnumTypeHandler | Enumeration Type | VARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引) |
EnumOrdinalTypeHandler | Enumeration Type | 任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的索引(而不是名称) |
5. environments 环境
MyBatis 的环境配置实际是数据源的配置。MyBatis 可以配置多个环境,帮助你将 SQL 映射对应到多种数据库。
注:尽管可以配置多个环境,每个 SqlSessionFactory 实例只能对应一个数据库,有几个数据库就需要创建几个 SqlSessionFactory 实例。
接受环境配置的两个方法:
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, environment,properties);
如果忽略了环境参数,默认环境将会被加载:
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader,properties);
(1) transactionManager 事务管理器
MyBatis 中的两种事务管理器,即 type="[JDBC|MANAGED]":
- JDBC:直接使用 JDBC 的提交和回滚设置
- MANAGED:让容器来管理事务的整个生命周期
(2)dataSource 数据源
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。MyBatis 三种內建的数据源类型,即 type="[UNPOOLED|POOLED|JNDI]",这里只详细介绍 UNPOOLED
:
1> UNPOOLED
UNPOOLED 不支持 JDBC 数据源连接池,实现的只是每次被请求时打开和关闭连接。其包含的属性:
- driver:JDBC 驱动的 Java 类的完全限定名,如 MySQL 的
com.mysql.jdbc.Driver
- url:数据库的 JDBC URL 地址
- username:数据库的用户名
- password:数据库的密码
- defaultTransactionIsolationLevel:默认的连接事务隔离级别。
2> POOLED
POOLED 支持 JDBC 数据源连接池,利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。除了有 UNPOOLED 的属性外还有包括 poolMaximumActiveConnections 、 poolMaximumIdleConnections 等属性。
3> JNDI
JNDI 支持外部数据源连接池,它的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。其包含的属性:
- initial_context:用来在 InitialContext 中寻找上下文
- data_source:引用数据源实例位置的上下文的路径
6. mappers 映射器
mappers 用于引用已经定义好的映射文件,告诉 MyBatis 去哪寻找映射 SQL 的语句。常见的方法:
(1)通过 resource 加载单个映射文件
<mappers>
<mapper resource="com/gler/mybatis/mapper/UserMapper.xml"/>
</mappers>
(2)通过完全限定资源定位符(绝对路径前加上"file:///")加载单个映射文件
<mappers>
<mapper url="file:///home/gler/workspace/MyBatisTest/src/com/gler/mybatis/mapper/UserMapper.xml"/>
</mappers>
(3)通过 mapper 接口对象加载单个映射文件
<mappers>
<mapper class="com.gler.mybatis.mapper.UserMapper"/>
</mappers>
(4)通过 mapper 接口包加载整个包的映射文件
<mappers>
<package name="com/gler/mybatis/mapper" />
</mappers>
注:(3)和(4)中需要将 mapper 接口类名和 mapper.xml 映射文件名称保持一致,且在一个目录中。
参考链接