1.11、MyBatis核心配置文件深入
1.11.1、typeHandlers标签
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器(截取部分)。
类型处理器 | Java类型 | JDBC参数 |
---|---|---|
BooleanTypeHandler | java.lang.Boolean.boolean | 数据库兼容的Boolean |
ByteTypeHandler | java.lang.Byte.byte | 数据库兼容的Number或Byte |
ShortTypeHandler | java.lang.Short.short | 数据库兼容的Number或short integet |
IntegerTypeHandler | java.lang.Integer.int | 数据库兼容的Number或integet |
LongTypeHandler | java.lang.Long.long | 数据库兼容的Number或Long integer |
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。
具体做法为:实现org.apache.ibatis.type.TypeHandler
接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler
, 然后可以选择性地将它映射到一个JDBC类型。
例如需求:
一个Java中的Date数据类型,我想将之存到数据库的时候存成一个1970年至今的毫秒数,取出来时转换成java的Date,即java的Date与数据库的varchar毫秒值之间转换。
开发步骤:
- 定义转换类继承类
BaseTypeHandler<T>
- 覆盖4个未实现的方法,其中
setNonNullParameter
为java程序设置数据到数据库的回调方法,getNullableResult
为查询时 mysql的字符串类型转换成 java的Type类型的方法 - 在MyBatis核心配置文件中进行注册
- 测试转换是否正确
package com.spongebob.config;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.*;
/**
* @Author tutu
* @Date 2021/11/12
* @Version 1.0
*/
public class MyDateTypeHandler extends BaseTypeHandler<Date> {
//将java类型 转换成 数据库需要的类型
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
long time = date.getTime();
preparedStatement.setLong(i, time);
}
//将数据库中的类型 转换成 Java类型
//string参数 要转换的字段名称
//resultSet 查询出的结果集
@Override
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
return new Date(resultSet.getLong(s));
}
@Override
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
return new Date(resultSet.getLong(i));
}
@Override
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return new Date(callableStatement.getLong(i));
}
}
<!--注册类型处理器-->
<typeHandlers>
<typeHandler handler="com.spongebob.config.MyDateTypeHandler"/>
</typeHandlers>
@org.junit.Test
public void testHandler() throws IOException {
User user = new User(12,"cesshi","12345",new Date());
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.save(user);
System.out.println(user);
sqlSession.commit();
sqlSession.close();
}
参数正常,但是报错了,目前没有找到解决方案。
1.11.2、plugins标签
MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据。
开发步骤:
① 导入通用PageHelper的坐标
② 在mybatis核心配置文件中配置PageHelper插件
③ 测试分页数据获取
<!-- 分页助手 -->
<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>
<!-- 注意:分页助手的插件 配置在通用馆mapper之前 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 指定方言 -->
<property name="dialect" value="mysql"/>
</plugin>
</plugins>
@org.junit.Test
public void test1() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
PageHelper.startPage(1,3);
List<User> list = mapper.findAll();
for (User user : list) {
System.out.println(user);
}
//获得与分页相关参数
PageInfo<User> userPageInfo = new PageInfo<User>(list);
System.out.println("当前页:"+userPageInfo.getPageNum());
System.out.println("每页显示条数:"+userPageInfo.getPageSize());
sqlSession.close();
}
获得分页相关的其他参数:
//其他分页的数据
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());