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>
相关推荐
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei2 小时前
java的类加载机制的学习
java·学习
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7894 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java5 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
睡觉谁叫~~~5 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
毕业设计制作和分享5 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis