我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MyBatis-Plus如何通过注解使用TypeHandler

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MyBatis-Plus如何通过注解使用TypeHandler

通过注解使用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-typehandlerJSON 字段类型 

@Data
@Accessors(chain = true)
@TableName(autoResultMap = true)
public class User {
    private Long id;
    ...
    
    @TableField(typeHandler = JacksonTypeHandler.class)
    // @TableField(typeHandler = FastjsonTypeHandler.class)
    private OtherInfo otherInfo;
}

该注解对应了 XML 中写法为

<result column="other_info" jdbcType="VARCHAR" property="otherInfo" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />

下面我们参照官方给出的案例,用kotlin实现一个具体的:

Kotlin案例

首先是kotlin实体类:

@TableName(autoResultMap = true)
data class Policy  (
    ...
    
    @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, JSON.toJSONString(javaObj))
    }
}

下面是xml中的使用:

<!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.inooy.write.ucenter.entity.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>

自定义TypeHandler使用

可通过自定义的TypeHandler实现某个属性在插入数据库以及查询时的自动转换,本例中是要将Map类型的属性转化成CLOB,然后存入数据库。由于是复杂的Map,mp自带的json转换器会丢失部分信息。

类型转换器还可以通过注解配置 java 类型和 jdbc 类型:

  • @MappedTypes:注解配置 java 类型
  • @MappedJdbcTypes:注解配置 jdbc 类型

定义:

@Slf4j
@MappedTypes({Object.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class WeightListTypeHandler  extends AbstractJsonTypeHandler<Object> {
    private static Gson gson = new Gson();
    private final Class<?> type;
    public WeightListTypeHandler(Class<?> type) {
        if (log.isTraceEnabled()) {
            log.trace("WeightListTypeHandler(" + type + ")");
        }
        Assert.notNull(type, "Type argument cannot be null");
        this.type = type;
    }
    @Override
    protected Object parse(String json) {
        Type type1 = new TypeToken<Map<String, List<WeightItem>>>(){}.getType();
        return gson.fromJson(json, type1);
    }
    @Override
    protected String toJson(Object obj) {
        return gson.toJson(obj);
    }
    public static void setGson(Gson gson) {
        Assert.notNull(gson, "Gson should not be null");
        WeightListTypeHandler.gson = gson;
    }
}

使用:

注意@TableName 注解 autoResultMap 属性

@Data
@NoArgsConstructor
@TableName(value = "mix_target",autoResultMap = true)
public class MixTarget extends Model<MixTarget> {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    
    @TableField("description")
    private String description;
    
    @TableField("name")
    private String name;
    
    @TableField("property_name")
    private String propertyName;
    
    @TableField("source_type")
    private String sourceType;
    
    @TableField(value = "weight_list",typeHandler = WeightListTypeHandler.class,jdbcType = JdbcType.CLOB)
    private Map<String, List<WeightItem>> weightList;
    
    @TableField("status")
    private Integer status;
    
    @TableField("enable")
    private Integer enable;
    @TableField("create_time")
    private LocalDateTime createTime;
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MyBatis-Plus如何通过注解使用TypeHandler

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Mybatis-plustis-plus如何使用注解 @TableField(exist = false)

本篇内容介绍了“Mybatis-plustis-plus如何使用注解 @TableField(exist = false)”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望
2023-06-14

如何使用mybatis的typeHandler对clob进行流读写

这篇文章主要介绍“如何使用mybatis的typeHandler对clob进行流读写”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用mybatis的typeHandler对clob进行流读写”
2023-06-26

MyBatis-Plus中ActiveRecord(AR)如何使用

这期内容当中小编将会给大家带来有关MyBatis-Plus中ActiveRecord(AR)如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.什么是ActiveRecord(AR)?ActiveR
2023-06-20

MyBatis-Plus动态表名如何使用

本篇内容介绍了“MyBatis-Plus动态表名如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MyBatis-Plus实现动态表名M
2023-07-05

SpringBoot如何通过注解注入Bean

这篇文章主要为大家展示了“SpringBoot如何通过注解注入Bean”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot如何通过注解注入Bean”这篇文章吧。1、背景我们谈到Sp
2023-06-29

Mybatis-Plus接口BaseMapper与Services如何使用

这篇文章主要介绍“Mybatis-Plus接口BaseMapper与Services如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Mybatis-Plus接口BaseMapper与Servi
2023-06-30

MyBatis通用Mapper@Table注解使用的注意点分析

本篇内容介绍了“MyBatis通用Mapper@Table注解使用的注意点分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MyBatis通
2023-06-21

mybatis plus如何实现在Spring boot上使用

mybatis plus如何实现在Spring boot上使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。maven依赖
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录