MyBatis-Plus 之 typeHandler 的使用

一、typeHandler 的使用
1、存储json格式字段

如果字段需要存储为json格式,可以使用JacksonTypeHandler处理器。使用方式非常简单,如下所示:

在domain实体类里面要加上,两个注解

@TableName(autoResultMap = true) 表示自动映射resultMap


@TableField(typeHandler = JacksonTypeHandler.class)表示将UserInfo对象转为json对象入库

java 复制代码
    /**
     * 物料分类
     */
    @TableField(typeHandler = SupplierMaterialCategoryTypeHandler.class)
    private List<MaterialCategory> materialCategory;

2、自定义 typeHandler 实现类

例如当我们 某个字段存储的类型为List或者Map时,我们可以自定义一个TypeHandler,以 list 为例,我们想存储一个字段类型为 list ,在数据库中的存储的格式是 多条数据以逗号分割,当查询时会自动根据逗号分割成列表格式。

需要实现BaseTypeHandler抽象类:

java 复制代码
package com.mdgyl.hussar.basic.handler;

import com.mdgyl.common.util.vo.ChangeInfoVO;
import com.mdgyl.data.mybatis.plus.typehandler.ListTypeHandler;
import com.mdgyl.hussar.basic.supplier.masterdata.domain.SupplierDO;

/**
 * @author shuquanlin
 */
public class SupplierMaterialCategoryTypeHandler extends ListTypeHandler<SupplierDO.MaterialCategory> {

    @Override
    protected SupplierDO.MaterialCategory specificType() {
        return new SupplierDO.MaterialCategory();
    }
}

在mybaits中的xml文件中

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mdgyl.hussar.basic.supplier.changeorder.dao.ChangeOrderMapper">

    <resultMap id="BaseResultMap" type="com.mdgyl.hussar.basic.supplier.changeorder.domain.SupplierChangeOrderDo">
        <id column="id" property="id" jdbcType="BIGINT" />
        <result column="tenant_id" property="tenantId" jdbcType="BIGINT" />
        <result column="supplier_id" property="supplierId" jdbcType="BIGINT" />
        <result column="code" property="code" jdbcType="BIGINT" />
        <result column="els_account" property="elsAccount" jdbcType="VARCHAR" />
        <result column="name" property="name" jdbcType="VARCHAR" />
        <result column="external_code" property="externalCode" jdbcType="VARCHAR" />
        <result column="material_category" property="materialCategory" typeHandler="com.mdgyl.hussar.basic.handler.ChangeOrderMaterialCategoryTypeHandler" />
        <result column="status" property="status" jdbcType="VARCHAR" />
        <result column="audit_status" property="auditStatus" jdbcType="VARCHAR" />
        <result column="source_scene" property="sourceScene" jdbcType="VARCHAR" />
        <result column="score" property="score" jdbcType="DECIMAL" />
        <result column="contact_information" property="contactInformation" jdbcType="VARCHAR" />
        <result column="inquiry_type" property="inquiryType" jdbcType="VARCHAR" />
        <result column="route" property="route" jdbcType="VARCHAR" />
        <result column="transaction_currency" property="transactionCurrency" jdbcType="VARCHAR" />
        <result column="payment_currency" property="paymentCurrency" jdbcType="VARCHAR" />
        <result column="payment_condition" property="paymentCondition" jdbcType="VARCHAR" />
        <result column="open_account_condition" property="openAccountCondition" jdbcType="VARCHAR" />
        <result column="operating_start_time" property="operatingStartTime" jdbcType="DATE" />
        <result column="taxpayer_identity_number" property="taxpayerIdentityNumber" jdbcType="VARCHAR" />
        <result column="unified_social_credit_code" property="unifiedSocialCreditCode" jdbcType="VARCHAR" />
        <result column="belong_company_id" property="belongCompanyId" jdbcType="BIGINT" />
        <result column="purchaser_head_id" property="purchaserHeadId" jdbcType="BIGINT" />
        <result column="create_user_id" property="createUserId" jdbcType="BIGINT" />
        <result column="create_user_name" property="createUserName" jdbcType="VARCHAR" />
        <result column="update_user_id" property="updateUserId" jdbcType="BIGINT" />
        <result column="update_user_name" property="updateUserName" jdbcType="VARCHAR" />
        <result column="update_time" property="updateTime" jdbcType="TIMESTAMP" />
        <result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
        <result column="delete_flag" property="deleteFlag" jdbcType="VARCHAR" />
        <result column="legal_representative" property="legalRepresentative" jdbcType="VARCHAR" />
        <result column="supplier_data_id" property="supplierDataId" jdbcType="BIGINT" />
    </resultMap>

    <select id="groupByStatus" parameterType="com.mdgyl.hussar.basic.param.changeOrder.SupplierChangeOrderPageQueryParam" resultType="com.mdgyl.hussar.basic.model.common.StatusGroupModel">
        SELECT status AS status,
        count(id) AS count
        FROM `t_supplier_change_order`
        WHERE tenant_id = #{tenantId} AND delete_flag = '0'
        <if test="code != null and code != ''">
            AND code = #{code}
        </if>
        <if test="elsAccount != null and elsAccount != ''">
            AND els_account = #{elsAccount}
        </if>
        <if test="name != null and name != ''">
            AND name = #{name}
        </if>
        <if test="supplierId != null and supplierId != ''">
            AND supplier_id = #{supplierId}
        </if>
        GROUP BY status
    </select>
</mapper>

如果要查找json中的字段,可以在domain类里面加上虚拟字段

java 复制代码
    @TableField(exist = false)
    public static final String materialCategoryUserIdQuery = "JSON_CONTAINS(material_category, JSON_OBJECT('materialCategoryUserId', {0}))";

在xml文件中加上

XML 复制代码
       <if test="name != null and name != ''">
            AND JSON_CONTAINS(material_category, JSON_OBJECT('materialCategoryName', #{name}))
        </if>
相关推荐
AI人工智能+电脑小能手2 分钟前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
juniperhan16 分钟前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
ID_1800790547318 分钟前
Python 实现亚马逊商品详情 API 数据准确性校验(极简可用 + JSON 参考)
java·python·json
c++之路38 分钟前
C++23概述
java·c++·c++23
专注API从业者2 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
摇滚侠2 小时前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql
keep one's resolveY2 小时前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
天空属于哈夫克33 小时前
企业微信API常见的错误和解决方案
java·数据库·企业微信
摇滚侠4 小时前
VMvare 虚拟机 Oracle19c 安装步骤,远程连接 Oracle19c,百度网盘安装包
java·oracle
梁萌4 小时前
idea报错找不到XX包的解决方法
java·intellij-idea·启动报错·缺少包