MyBatis核心配置文件深入_自定义DateTypeHandler实现
在Java文件夹下的com.ffyc包下创建一个handler包, 在handler包下创建一个自定义类DateTypeHandler, 要继承与我们的BaseTypeHandler< T>类
- 此时我们是对Java中的Date数据进行一个类型转换, 所以这里T泛型要设置为Date类型
- 这个转换器是用于将Java中的Date转到数据库中时转换为我们自己想转换的一种类型, 此时我们是转换为数据库中的bigInt类型
举例说明:
我们在user表中加一个birthday字段(bigint类型), 然后我们在User实体类中加入一个birthday属性(Date类型), 我们这里要将Java中的Date类型的数据和数据库中的bigint类型进行一个转换
给出DateTypeHandler类:
public class DateTypeHandler extends BaseTypeHandler<Date>{
//将Java类型转换为数据库中的bigint类型
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType)throw SQLException{
//将Date类型转为java中的long类型之后填充到占位符中
long time = date.getTime();
//这里其实就是执行了一个填充占位符的功能
preparedStatement.setLong(i,time);
}
//将数据库中的BigInt类型转换为Java中类型时转换为Date类型
public Date getNullableResult(ResultSet resultSet , String s)throws SQLException{
long time = resultSet.getLong(s);
Date date = new Date(time);
returrn date;
}
//注意: 对于数据库中的数据转Java类型时我们的BaseTypeHandler类中还提供了两个重载方法:
public Date getNullableResult(ResultSet resultSet, int i)throws SQLException{
long time = resultSet.getLong(i);
Date date = new Date(time);
return date;
}
public Date getNullableResult(CallableStatement callableStatement, int i)throws SQLException{
long time = resultSet.getLong(i);
Date date = new Date(time);
return date;
}
}
关于setNonNullParameter()方法的小结:
-
形参i 是我们要填充的占位符的索引位置
-
我们形参中的date就是我们Java中要转换的Date类型的数据, 我们要将这个date转为我们想要的BigInt类型, 填充到占位符中即可
关于getNullableResult()方法的小结:
- 我们一共提供了三种getNullableResult()重载方法
- 第一个重载方法和第二个重载方法中形参中都提供了ResultSet接口类型的对象, 也就是结果集对象, 而第三个重载方法中提供的则是CallableStatement接口类型的对象
- 之所以提供CallableStatement接口类型的对象也可以就是因为我们的CallableStatement接口中还定义有获取结果集数据的方法, 而PreparedStatement接口中则没有
- 第一个重载方法中提供了形参String类型的s是要转换的字段名称, 而第二个和第三个重载方法中则是提供了int类型的i 表示的是要转换的字段在结果集中的索引位置
注册类型处理器:
核心配置文件中:
<typeHandlers>
<typeHandler handler = "com.ffyc.handler.DateTypeHandler"></typeHandler>
</typeHandlers>
- typeHandlers标签是定义在configuration标签中的子标签, 在configuration标签中的子标签都是有顺序的, 所以我们一定要注意typeHandler标签的位置
最后我们编写一个测试类进行一个测试:
- 我们先进行一个添加操作, 将Java中某个实体类中的Date类型的属性值存储到数据库中, 看看是否变换为了数据库中的bigInt类型
- 再编写一个插叙操作, 将数据库中的对应记录查询出来封装到Java实体类中之后看看在数据库中的类型为biging的字段是否变为了Date类型的属性
补充:
-
我们的填充占位符的时候的占位符索引和获取结果集中某个索引位置的字段值时的索引都是从1开始的, 这个索引并不是Java中的索引
-
填充占位符的时候我们只能是通过索引定位到要填充的位置, 所以我们上面的setLong()方法中要传入的只能是要填充的占位符的索引和要填充的占位符的值, 而我们如果是获取结果集中某个字段的值的时候, 这个时候结果集中不仅仅我们可以通过索引位置来定位到某个字段, 还可以使用字段名来定位到某个字段, 所以我们使用结果集获得某个字段值的时候我们就可以使用索引来获取, 也可以通过字段名来获取
单词积累:
non-null : 不为空
nullable : 可为空