MyBatis核心配置文件深入
typeHandlers标签
typeHandlers,类型处理器标签,无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器(截取部分)。
通过typeHandlers标签,你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。
具体做法为:
- 实现
org.apache.ibatis.type.TypeHandler
接口, 或继承一个很便利的类org.apache.ibatis.type.BaseTypeHandler
, - 然后可以选择性地将它映射到一个JDBC类型。
例如需求:一个Java中的Date数据类型,我想将之存到数据库的时候存成一个1970年至今的毫秒数,取出来时转换成java的Date,即java的Date与数据库的varchar毫秒值之间转换。
开发步骤:
1、定义转换类继承类BaseTypeHandler<T>
,泛型即使需要转换的java类型
2、覆盖4个未实现的方法,其中setNonNullParameter
为java程序设置数据到数据库的回调方法,getNullableResult
为查询时 mysql的字符串类型转换成 java的Type类型的方法
public class DateTypeHandler extends BaseTypeHandler<Date> {
//负责将java类型转换成数据库需要的类型
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
//将date转换成数字
long time = date.getTime();
//通过PreparedStatement设置参数
//int i表示参数的位置
preparedStatement.setLong(i,time);
}
//将数据库中的类型转换成Java类型
//String参数是数据库表中要转换的字段名称
//resultSet查询出的结果集
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
//获取结果集中需要的数据(long)转换成Date类型并返回
long aLong = resultSet.getLong(s);
Date date = new Date(aLong);
return date;
}
//将数据库中的类型转换成Java类型
//i表示字段的位置
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
//获取结果集中需要的数据(long)转换成Date类型并返回
long aLong = resultSet.getLong(i);