MyBatis-Plus通过注解使⽤TypeHandler
在使⽤MyBatis时,我们与数据表中字段映射的java中的bean的属性字段,往往包含了⾃定义复杂类型,⽐如⼀个varchar保存的json字符串映射到的java字段是Person类型的时候,就需要⽤到 “字段类型处理器了”,也就是TypeHandler.
使⽤MyBatis的TypeHandler的时候,⾃定义实现起来还是⽐较⿇烦,需要统⼀配置,⾃动识别java字段类型,然后匹配了才处理。
这样在开发的时候并不好控制,⽽且不是很直观。
在新版本的MyBatis-Plus中提供了⼀种新的配置 “字段处理器” 的⽅法,通过在javaBean中加⼊对应的注解即可实现。
下⾯我们先看⼀下MyBatis-Plus官⽅⽂档中的使⽤说明:
官⽅⽰例
类型处理器,⽤于 JavaType 与 JdbcType 之间的转换,⽤于 PreparedStatement 设置参数值和从 ResultSet 或
CallableStatement 中取出⼀个值,本⽂讲解 mybaits-plus 内置常⽤类型处理器如何通过TableField注解快速注⼊到 mybatis 容器中。
⽰例⼯程:
mybatis-plus-sample-typehandler
JSON 字段类型
@Data
@Accessors(chain =true)
@TableName(autoResultMap =true)
public class User {
private Long id;
...
/**
* 注意!!必须开启映射注解
*
* @TableName(autoResultMap = true)
*
* 以下两种类型处理器,⼆选⼀也可以同时存在
*
* 注意!!选择对应的 JSON 处理器也必须存在对应 JSON 解析依赖包
*/
@TableField(typeHandler = JacksonTypeHandler.class)
// @TableField(typeHandler = FastjsonTypeHandler.class)
private OtherInfo otherInfo;
}
该注解对应了 XML 中写法为
<result column="other_info"jdbcType="VARCHAR"property="otherInfo"typeHandler="sion.handlers.JacksonTypeHandle r"/>
下⾯我们参照官⽅给出的案例,⽤kotlin实现⼀个具体的:
Kotlin案例
⾸先是kotlin实体类:
@TableName(autoResultMap =true)
data class Policy(
...
/**
* 策略内容,json格式,规则参考⽂档
*/
@TableField(typeHandler = PolicyBodyTypeHandler::class)
var content: PolicyBody?=null,
...
)
然后是对应TypeHandler的实现,主要就是json序列化规则,因为我们再数据库存的就是json字符串。
class PolicyBodyTypeHandler : BaseTypeHandler<PolicyBody>(){
override fun getNullableResult(p0: ResultSet?, p1: String?): PolicyBody?{
val result = p0?.getString(p1)?:return null
return JSON.parseObject(result, PolicyBody::class.java)
}
override fun getNullableResult(p0: ResultSet?, p1: Int): PolicyBody?{
val result = p0?.getString(p1)?:return null
return JSON.parseObject(result, PolicyBody::class.java)
}
override fun getNullableResult(p0: CallableStatement?, p1: Int): PolicyBody?{
val result = p0?.getString(p1)?:return null
return JSON.parseObject(result, PolicyBody::class.java)
}
override fun setNonNullParameter(statement: PreparedStatement?, index: Int, javaObj: PolicyBody?, jdbcType: JdbcType?){        statement?.setString(index, JSONString(javaObj))
}
fastjson忽略属性
}
下⾯是xml中的使⽤:
<!-- 通⽤查询映射结果 -->
<resultMap id="BaseResultMap"type="com.inooy.ity.Policy">
<id column="id"property="id"/>
<result column="code"property="code"/>
<result column="name"property="name"/>
<result column="description"property="description"/>
<result column="content"property="content"typeHandler="com.inooy.write.ucenter.policy.PolicyBodyTypeHandler"/> <result column="deleted"property="deleted"/>
<result column="createTime"property="createTime"/>
<result column="updateTime"property="updateTime"/>
<result column="version"property="version"/>
</resultMap>
参考链接:
baomidou/guide/typehandler.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。