typeHandlers标签
无论是MyBatis在预处理语句(PreparedStatement)中设置一个参数时, 还是从结果集中取出一个值时, 都会用类型处理器对数据库中的字段类型以合适的方式和Java类型之间进行一个转换
-
其实就是对Java类型和数据库中的字段值要进行一个转换, 这个过程中要使用到类型处理器
-
如果是填充一个占位符时的我们是拿到了一个Java类型, 但是我们填充到占位符中比较的时候肯定是使用数据库中的某种类型值进行比较, 因为我们最终填充了占位符之后正真使用到这个sql语句的时候是在数据库中,会使用到类型处理器将对应的Java类型转为数据库中的类型, 我们查询操作中返回一个实体类类型的时候这个号时候就要将我们的数据库中的一条记录转为对应的一个Java实体类对象, 这时候就要将对应的数据库中的对应字段类型转为Java中的类型
我们的typeHandlers标签就是用来注册自定义类型处理器的
下表描述了一些默认的类型处理器(只是截取了一部分)
类型处理器 | Java类型 | JDBC类型 |
---|---|---|
BooleanTypeHandler | java.lang.Boolean, boolean | 数据库兼容的BOOLEAN |
ByteTypeHandler | java.lang.Byte , byte | 数据库兼容的numeric或byte |
ShortTypeHandler | java.lang.Short , short | 数据库兼容的numeric或short Integer |
IntegerTypeHandler | java.lang.Integer, int | 数据库兼容的numeric或Integer |
typeHandlers标签:
你可以重写类型处理器或者创建自己的类型处理器俩处理不支持的或者非标准的类型
- 具体做法为; 实现org.apache.ibatis.type.TypeHandler接口, 或者继承一个很方便的类, org.apache.ibatis.type.BaseTypeHandler, 然后就是创建了一个类型处理器, 我们就可以使用这个类型处理器方便的对Java中的数据类型和JDBC中的数据类型进行一个转换
- 例如需求: 一个Java中的Date数据类型, 我们想将之存储到数据库中的时候存成一个毫秒值(时间戳, 也就是从1970年至今的毫秒数), 我们如果将数据库中的对应毫秒值转换为Java中的数据类型的时候又要将其转换为Date类型
- 此时我们就是设置Java中的Date类型和数据库中的bigint类型之间进行一个转换
- 例如需求: 一个Java中的Date数据类型, 我们想将之存储到数据库中的时候存成一个毫秒值(时间戳, 也就是从1970年至今的毫秒数), 我们如果将数据库中的对应毫秒值转换为Java中的数据类型的时候又要将其转换为Date类型
默认是具有一个DataTypeHandler类型处理器的, 这个类型处理器会对Java中的Date类型和数据库中的Date类型进行一个转换, 但是此时我们是要对Java中和Date类型和数据库中的bigint类型进行一个转换
开发步骤:
- 定义转换类继承自类BaseTypeHandler< T>
- 泛型T就是你想转换的Java数据类型
- 重写其中的四个方法(其实按理讲我们只用实现两个即可, 但是我们测试为了讲解, 我们此时将所有的方法都进行一个实现), 其中setNonNullParameter()方法为Java程序设置到数据库时调用的回调方法, getNullableResult()为查询时Mysql中的数据类型转换为Java中的类型的回调方法
- 在MyBatis核心配置文件中进行注册
- 测试转换是否正确