【测试开发】知识点-mybatis,全局配置文件介绍
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
具体学习可以结合官方文档:https://mybatis.org/mybatis-3/zh/configuration.html
一、属性(properties)
mybatis 可以通过 properties 标签来引入外部 properties 配置文件里的内容。
最常见的就是引入外部配置文件里的数据库连接信息,在之前的 mybatis 配置文件里是写死的,现在来引入我们项目配置文件application.properties
里的数据库信息.
那么 mybatis 配置文件现在可以这么写:
<?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>
<properties resource="application.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${spring.datasource.driver-class-name}"/>
<property name="url" value="${spring.datasource.url}"/>
<property name="username" value="${spring.datasource.username}"/>
<property name="password" value="${spring.datasource.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
在标签<<properties>
中:
- 如果使用
resource
:读取类路径下属性文件 - 如果使用
url
:指定的路径读取属性文件,并覆盖之前读取过的同名属性
引入配置文件application.properties
之后就可以使用${}
来使用配置文件里的属性名了。
二、设置(settings)
这是 MyBatis 中极为重要的设置,会改变 MyBatis 运行时的行为。文档里的设置项很多,可以逐个看下混个脸熟,以后使用到的时候知道哪里找。
比如mapUnderscoreToCamelCase
,作用是: 是否开启驼峰命名自动映射,即从经典数据库列名A_COLUMN
映射到经典 Java 属性名aColumn
。
举个栗子:
数据库字段:user_name,开启配置后,就可以映射 java 属性名 userName
配置文件这样写:
...
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
...
三、类型别名(typeAliases)
1. 单个起别名
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,方便引用的时候使用。
比如在 xml 文件UserMapper.xml
中:
<mapper namespace="com.pingguo.bloomtest.dao.UserMapper">
<select id="getUserById" resultType="com.pingguo.bloomtest.pojo.User">
select * from user where id = #{id}
</select>
</mapper>
返回类型resultType
是com.pingguo.bloomtest.pojo.User
,全类名有点长,给它起个别名。
回到全局配置文件mybatis-config.xml
中:
<typeAliases>
<typeAlias type="com.pingguo.bloomtest.pojo.User" alias="user" />
</typeAliases>
type
: 写上全类名alias
: 不写的话默认是类名小写
然后引用的时候就可以使用别名:
<mapper namespace="com.pingguo.bloomtest.dao.UserMapper">
<select id="getUserById" resultType="user">
select * from user where id = #{id}
</select>
</mapper>
2. 批量起别名
标签<typeAlias>
一次只可以给一个类型起别名,如果要起别名的很多,可以进行批量处理。
使用package
标签:
<typeAliases>
<!--<typeAlias type="com.pingguo.bloomtest.pojo.User" alias="user" />-->
<package name="com.pingguo.bloomtest.pojo" />
</typeAliases>
name
:指定包名,为这个包以及下面的所有后代包的每一个类都起一个默认别名(类名小写)
如果引用的时候resultType="User"
我换成大写开头,运行也是OK的,别名不区分大小写。
3. @Alias 给类指定别名
假如com.pingguo.bloomtest.pojo
包下还有一个子包,而这个子包下面也有一个类叫User
,这时候就是别名冲突了,mybatis 运行报错。
可以使用@Alias
给类指定别名:
@Alias("User2")
public class User {
@TableId(type = IdType.ID_WORKER)
private Long id;
private String username;
private String password;
...
4. 内置别名
mybatis 有为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,采取了特殊的命名风格。
我们自定义别名的时候不要与内置的重复。
不过不用别名,就用全类名也有好处。比如在用 idea编辑器,可以直接按住ctrl+左击
类名跳过去,很方便。
四、类型处理器(typeHandlers)
类型处理器的作用,简单来说就是架起了java 类型和数据库类型一一映射的桥梁。
比如 java 对象中的 String 类型的变量,保存到数据库兼容的 varchar 或者 char。
这部分就先混个脸熟先,后续涉及到对应知识点再进一步学习。
五、插件(plugins)
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed),执行器,常见的增删改查
- ParameterHandler (getParameterObject, setParameters),参数处理,sql语句预编译设置参数
- ResultSetHandler (handleResultSets, handleOutputParameters),结果集处理,查询到结果后拿到结果集并封装成Javabean对象
- StatementHandler (prepare, parameterize, batch, update, query),sql语句处理器
这4个对象里有很多各自的方法(括号里),通过插件可以在方法执行之前做一些自定义的处理,来改变一些默认行为。
这里同样混脸熟,后续学习了mybatis 运行机制和原理的时候,再进一步学习。
六、环境配置(environments)
MyBatis 可以配置多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中。
在之前已经用过这个标签<environments>
:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${spring.datasource.driver-class-name}"/>
<property name="url" value="${spring.datasource.url}"/>
<property name="username" value="${spring.datasource.username}"/>
<property name="password" value="${spring.datasource.password}"/>
</dataSource>
</environment>
</environments>
其中<environment>
可以配置一个具体的环境信息,id
代表当前环境的唯一标识,可以通过default
动态的指定当前我要使用的环境。
另外,里面还有2个不可或缺的标签:transactionManager
和 dataSource
。
transactionManager
transactionManager
事务管理器,type
是管理器的类型。
在 MyBatis 中有两种类型的事务管理器:
- JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
- MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
如果我们使用Spring + MyBatis
,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
dataSource
dataSource
数据源,type
是数据源的类型。有三种内建的数据源类型:
UNPOOLED
: 这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢,但对那些数据库连接可用性要求不高的简单应用程序来说,是一个很好的选择。 性能表现则依赖于使用的数据库,对某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形POOLED
: 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。JNDI
: 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。
七、数据库厂商标识(databaseIdProvider)
MyBatis 可以根据不同的数据库厂商执行不同的语句,databaseIdProvider
这个标签其实就是 mybatis 在一致性方面的作为。
你只需要告诉 mybatis 你写的 sql 是属于哪个数据库厂商下的,那么它就可以动态的根据数据库厂商标识,来发送不同的sql语句。
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider>
这个DB_VENDOR
,作用就是得到数据库厂商的标识(驱动自带获取厂商标识的方法)。
name
设置不同的数据库标识,value
可以设置别名。
最后,需要在 sql映射文件里告诉mybatis 这条 sql 是又哪个厂商去执行:
<mapper namespace="com.pingguo.bloomtest.dao.UserMapper">
<select id="getUserById" resultType="com.pingguo.bloomtest.pojo.User" databaseId="mysql">
select * from user where id = #{id}
</select>
</mapper>
这里databaseId
里的值就是上面配置的别名。
八、映射器(mappers)
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。
mappers
标签就是将 sql 映射注册到全局配置文件中去,比如之前写的:
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
每个<mapper>
注册一个 sql映射,其中又会涉及到如下几个属性:
resource
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
url
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
class
上面2个是注册配置文件的,而这个是用来注册接口的,里面写接口全类名
<!-- 使用映射器接口实现类的全类名 -->
<mappers>
<mapper class="com.pingguo.bloomtest.dao.UserMapper"/>
</mappers>
但是要注意:sql映射文件必须和接口同名,并且放在同一目录下。
另外,注册接口的情况下,也是可以不写 sql 映射文件的,所有的sql都利用注解写在接口上。
public interface UserMapper {
@Select("select * from user where id = #{id}")
User getUserById(Integer id);
}
感觉写注解很方便啊?可以mybatis好不容易让sql与代码分离这不又回去了?
没关系,混合用就好了。可以把比较重要的、复杂的用来写 sql映射文件,简单的可以写注解里,方便快速开发。
批量注册
上面是单个的注册,现在同样也可以批量进行注册:
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
name
写包名。