1、typeHandlers 元素
typeHandlers
元素标签主要用于类型处理器的定义。
在 MyBatis 中,无论是在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。MyBatis 中内置的一部分类型处理器:
类型处理器 | Java类型 | JDBC类型 |
---|---|---|
BooleanTypeHandler | Boolean,boolean | 任何兼容的布尔值 |
ByteTypeHandler | Byte,byte | 任何兼容的数字或字节类型 |
ShortTypeHandler | Short,short | 任何兼容的数字或短整型 |
IntegerTypeHandler | Integer,int | 任何兼容的数字和整型 |
LongTypeHandler | Long,long | 任何兼容的数字或长整型 |
FloatTypeHandler | Float,float | 任何兼容的数字或单精度浮点型 |
DoubleTypeHandler | Double,double | 任何兼容的数字或双精度浮点型 |
BigDecimalTypeHandler | BigDecimal | 任何兼容的数字或十进制小数类型 |
StringTypeHandler | String | CHAR和VARCHAR类型 |
ClobTypeHandler | String | CLOB和LONGVARCHAR类型 |
NStringTypeHandler | String | NVARCHAR和NCHAR类型 |
绝大多数的类型转换 Mybatis 的内置的类型处理器都可以处理,但某些情况下,内置的类型处理器无法满足我们的需求,那么可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 如果想自定义类型处理器,有两种方法:
- 继承BaseTypeHandler类
- 实现TypeHandler接口
使用继承 BaseTypeHandler<T>
类完成自定义类型处理器的创建:
public class MyDateTypeHandler extends BaseTypeHandler<Date> {
//将 java类型 转换为 数据库需要的数据类型
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType type) {
preparedStatement.setString(i,date.getTime()+"");
}
//将数据库中的类型 转换为 java类型
//String 表示数据库中要转换的字段名
//ResultSet 表示结果集
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
return new Date(resultSet.getLong(s));
}
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
return new Date(resultSet.getLong(i));
}
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return callableStatement.getDate(i);
}
}
BaseTypeHandler<T>
类中的泛型表示需要转换的 java 类型setNonNullParameter
方法用于将内部的java类型的数据转为数据库需要的数据,而数据库需要什么数据就通过方法进行实现getNullableResult
方法用于在查询数据时将数据库的字符串或数字类型转换为指定的 java 类型。
在创建完自定义类型处理器之后,我们还需要在配置文件中通过typeHandlers
元素标签进行注册:
<!--注册类型自定义转换器-->
<typeHandlers>
<typeHandler handler="com.***.MyDateTypeHandler"></typeHandler>
</typeHandlers>
2、settings 元素
settings
是 MyBatis 中调整设置的元素,它们会改变 MyBatis 的运行时行为。具体的设置有很多种,我们只列举其中比较重要的:
属性名称 | 简单描述 | 设置值 | 默认值 |
---|---|---|---|
cacheEnabled | 对在此配置文件下的所有cache 进行全局性开/关设置 | true 或 false | true |
lazyLoadingEnabled | 全局性设置懒加载。如果设为 false ,则所有相关联的都会被初始化加载。 | true或false | true |
aggressiveLazyLoading | 当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 | true或 false | true |
multipleResultSetsEnabled | 是否允许单条语句返回多个数据集 | true 或 false | true |
defaultStatementTimeout | 数据库驱动连接数据库响应时间 | 正整数 | 未设置 |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | 未设置 |
其实大部分都用不到,所以这里只是列举了很少的一部分!
3、objectFactory 对象工厂
在了解对象工厂之后,我们先去了解一个问题。在映射文件中,我们定义一条映射语句:
<select id="selectPerson" resultType="com.***.User">
SELECT * FROM USER
</select>
然后通过List<User> userList = sqlSession.selectList("userMapper.selectPerson");
就直接得到了对象。
这些 User 对象是由谁创建的呢?
由这个对象工厂——objectFactory
。 MyBatis 中默认的对象工厂是DefaultObjectFactory
类,当然我们也可以自定义一个工厂对象,实现ObjectFactory接口 或者 继承 DefaultObjectFactory 来创建自己的对象工厂改写相关的四个方法:
public class MyObjectFactory implements ObjectFactory {
@Override
public <T> T create(Class<T> type) {
return null;
}
@Override
public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
return null;
}
@Override
public <T> boolean isCollection(Class<T> type) {
return false;
}
@Override
public void setProperties(Properties properties) {
}
}
自定义对象工厂创建完成之后,我们需要通过objectFactory
元素进行定义:
<objectFactory type="com.***.MyObjectFactory ">
</objectFactory>
4、plugins 插件
MyBatis 允许在映射语句执行过程中通过插件的某一点进行拦截调用。 因为插件可能会影响 MyBatis 的行为,所以我们很少使用。在这里只举例一个第三方插件——分页插件 PageHelper
:
-
导入 jar 包:想要使用分页插件就必须导入 jar 包:
<!-- 分页助手 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>3.7.5</version> </dependency> <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>0.9.1</version> </dependency>
-
配置:在核心配置文件中通过
plugins
元素标签配置 PageHelper 插件<plugins> <!-- 注意:分页助手的插件 --> <plugin interceptor="com.github.pagehelper.PageHelper"> <!-- 指定方言,使用不同的数据库结构化查询不同 --> <property name="dialect" value="mysql"/> </plugin> </plugins>
-
具体使用:
@Test public void testPageHelper(){ //设置分页参数,设置的两个参数分别是 当前页和每页显示条数 PageHelper.startPage(1,10); //还可以根据返回的结果集获得分页相关的其他参数 // PageInfo 由插件提供 // User 表示当前结果集返回 java类型 // select 表示返回的结果集 //这只是参数的一部分 PageInfo<User> pageInfo = new PageInfo<User>(select); System.out.println("总条数:"+pageInfo.getTotal()); System.out.println("总页数:"+pageInfo.getPages()); System.out.println("当前页:"+pageInfo.getPageNum()); System.out.println("每页显示长度:"+pageInfo.getPageSize()); System.out.println("是否第一页:"+pageInfo.isIsFirstPage()); System.out.println("是否最后一页:"+pageInfo.isIsLastPage()); }
5、databaseIdProvider 数据库厂商标识
在使用不同数据库时,数据库的 SQL 语句可能会有一些不同,所以根据需要可以通过databaseIdProvider
元素置来设置多种数据库。
<!-- DB_VENDOR 属性值是固定属性 -->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql" />
<property name="Oracle" value="oracle" />
</databaseIdProvider>
在映射文件中就可以根据需要选择不同的数据库:
<select id="getUser" resultType="User" databaseId="mysql">
SELECT * FROM user
</select>
6、总结
所有的核心标签大概的解了一遍,有些标签可以完全忽略,有些需要深入了解。在编写核心配置文件时需要特别注意的是:可以省略其中的某些元素标签,但元素标签的顺序一定不能改变,必须按照图中顺序!