• Mybatis-Plus——ListTypeHandler处理类型为list<T>字段的增改查


    Mybatis-Plus——ListTypeHandler处理类型为list字段的增改查

    在后端处理数据时难免会遇到类型为List的字段,为了方便(优雅)地处理这个列表类型字段的存储与读取,我们可以自定义Mybatis-Plus提供的BaseTypeHandler类,从而对任意类型的列表数据进行数据库相关处理

    一、继承BaseTypeHandler类,自定义ListTypeHandler抽象类

    List表示任意对象的列表类型,即以下自定义配置可以处理任意类型对象的列表类型,例如:ListList等等(其中User为自定义的对象)

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.TypeReference;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType;
    import org.apache.ibatis.type.MappedJdbcTypes;
    import org.apache.ibatis.type.MappedTypes;
    import org.springframework.util.StringUtils;
    
    import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    @Slf4j
    @MappedJdbcTypes(JdbcType.VARCHAR)  //数据库类型
    @MappedTypes({List.class})          //java数据类型
    public abstract class ListTypeHandler<T> extends BaseTypeHandler<List<T>> {
        @Override
        public void setNonNullParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType) throws SQLException {
            String content = StringUtils.isEmpty(parameter) ? null : JSON.toJSONString(parameter);
            ps.setString(i, content);
        }
        @Override
        public List<T> getNullableResult(ResultSet rs, String columnName) throws SQLException {
            return this.getListByJsonArrayString(rs.getString(columnName));
        }
    
        @Override
        public List<T> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
            return this.getListByJsonArrayString(rs.getString(columnIndex));
        }
    
        @Override
        public List<T> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
            return this.getListByJsonArrayString(cs.getString(columnIndex));
        }
    
        private List<T> getListByJsonArrayString(String content) {
            return StringUtils.isEmpty(content) ? new ArrayList<>() : JSON.parseObject(content, this.specificType());
        }
    
        /**
         * 具体类型,由子类提供
         * @return 具体类型
         */
        protected abstract TypeReference<List<T>> specificType();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    二、继承ListTypeHandler抽象类,实现具体的类型列表处理

    这边以String类型为例

    import com.alibaba.fastjson.TypeReference;
    
    import java.util.List;
    
    public class StringTypeHandler extends ListTypeHandler<String> {
    	// 将ListTypeHandler(T为任意对象),具体为特定的对象String
        @Override
        protected TypeReference<List<String>> specificType() {
            return new TypeReference<List<String>>() {
            };
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    三、在实体类对应字段上添加注解

    List为例,添加@TableField注解,表示该字段需要进行对应的转化

    @ApiModelProperty("售后人员")
    @TableField(typeHandler = StringTypeHandler.class)
    private List<String> afterSaleList;
    
    • 1
    • 2
    • 3

    通过以上操作后,可以实现List列表类型的添加修改

    四、实现实体类列表字段的查找(读取)

    在实体类表头添加注解@TableName,一定要配置属性autoResultMap = true

    @TableName(value = "base_knowledge", autoResultMap = true)
    
    • 1

    添加以上配置后,即可完成对List列表类型字段的读取

    五、补充

    当使用mybatis-plus的select方法时,是直接使用其提供的autoResultMap生成的resultMap。但是当我们使用mybatis@select注解自定义查询语句时,只会生产普通resultMap,注解@TableField(typeHandler = StringTypeHandler.class)并不会生效,对应的字段查询出来为null,所以为了支持mybatis@select注解,我们还需要手动添加注解@ResultMap,具体写法如下:

    import static com.baomidou.mybatisplus.core.toolkit.Constants.MYBATIS_PLUS;
    import static com.baomidou.mybatisplus.core.toolkit.StringPool.UNDERSCORE;
    
    @ResultMap(MYBATIS_PLUS + UNDERSCORE + "Person")
    // 或者
    @ResultMap("com.example.mappers.PersonMapper" + "." + MYBATIS_PLUS + UNDERSCORE + "Person")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    //@Select自定义查询写法如下
    @Select("select * from base_knowledge where deleted=1 limit #{pageNum}, #{pageSize}")
    // 添加@ResultMap注解
    @ResultMap(MYBATIS_PLUS + UNDERSCORE + "Knowledge")
    public List<Knowledge> selectDeletedKnowledgePage(int pageNum, int pageSize);
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    iLogtail 2.0 重大升级,端上支持 SPL
    详解 TCP 原理
    Kali 基础命令(一)
    京东平台数据分析:2023年9月京东空气净化器行业品牌销售排行榜
    多线程详解
    【JavaScript】聊一聊js中的浅拷贝与深拷贝与手写实现
    web前端学习笔记三
    Windows 11 版本介绍
    【springboot】自动整合Tomcat原理
    Tomcat长轮询原理与源码解析
  • 原文地址:https://blog.csdn.net/weixin_43977534/article/details/127775847