• 首页
  • 邻居
  • 关于
  • 归档
  • 搜索
  • 夜间模式
    ©2020-2026  我的学习笔记 Theme by OneBlog

    我的学习笔记博客

    搜索
    标签
    # 随笔 # Java # 教程 # openwrt # Mysql # SQL # 爬虫 # post # Js调优 # MAVEN
  • 首页>
  • Java>
  • 正文
  • mybatis 自定义转换器 ListTypeHandler

    2022年12月07日 2.2 k 阅读 0 评论 4169 字

    mybatis 自定义转换器 ListTypeHandler
    实现存库 list->string

    读库 string->list
    
    package com.jeesite.modules.handler;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.TypeReference;
    import com.jeesite.common.lang.ObjectUtils;
    import com.jeesite.common.lang.StringUtils;
    import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType;
    import org.apache.ibatis.type.MappedJdbcTypes;
    import org.apache.ibatis.type.MappedTypes;
    <!--more-->
    import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    /**
     * @author liuxin
     * @version 1.0
     * @date 2022/8/23 12:25
     */
    @MappedJdbcTypes(JdbcType.VARCHAR)
    @MappedTypes({List.class})
    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 = ObjectUtils.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.isBlank(content)
            ? new ArrayList<>()
            : JSON.parseObject(content, this.specificType());
      }
    
      /**
       * 具体类型,由子类提供
       *
       * @return 具体类型
       */
      protected abstract TypeReference<List<T>> specificType();
    }
    
     Java 泛型 如果在 ListTypeHandler 类中直接提供 TypeReference<List<T>> 这种类型,那就等效于TypeReference<List<Object>> 这种类型,后续 fastjson 在转换时无法确定具体的 Java 类型,转换后的类型最终就会是 List<JSONObject> ;同理,如果使用 Jackson 作为 JSON 转换工具,不确定具体类型时,最总会被转换为LinkedHashMap 类型,都需要再使用 TypeReference 来转换一次。
    
    自定义TypeHandler的使用笔记 可通过自定义的TypeHandler实现某个属性在插入数据库以及查询时的自动转换。
    package com.jeesite.modules.handler;
    
    /**
     * @author liuxin
     * @version 1.0
     * @date 2022/8/23 12:33
     */
    
    import com.alibaba.fastjson.TypeReference;
    import com.pdd.pop.sdk.http.api.pop.response.PddGoodsListGetResponse;
    
    import java.util.List;
    
    public class SkuListItemSpecDetailsTypeHandler
            extends ListTypeHandler<PddGoodsListGetResponse.GoodsListGetResponseGoodsListItemSkuListItemSpecDetailsItem> {
        @Override
        protected TypeReference<List<PddGoodsListGetResponse.GoodsListGetResponseGoodsListItemSkuListItemSpecDetailsItem>> specificType() {
            return new TypeReference<List<PddGoodsListGetResponse.GoodsListGetResponseGoodsListItemSkuListItemSpecDetailsItem>>() {
            };
        }
    }
    

    实体类上直接用注解:

     typeHandler = ListTypeHandler.class,
     javaType = PddGoodsListGetResponse.GoodsListGetResponseGoodsListItemSkuListItemSpecDetailsItem.class

    mapper.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.jeesite.modules.pdd.dao.PddGoodsSkuListDao">
    
        <resultMap type="com.jeesite.modules.pdd.entity.PddGoodsSkuList" id="PddGoodsSkuListMap">
            <!--column需要和数据库字段名对应,当实体上面设置了属性名则和属性名对应-->
            <result column="specDetails" property="specDetails"
                    javaType="java.util.List" typeHandler="com.jeesite.modules.handler.SkuListItemSpecDetailsObjectTypeHandler"/>
        </resultMap>
        <select id="findList" resultMap="PddGoodsSkuListMap">
            SELECT ${sqlMap.column.toSql()}
            FROM ${sqlMap.table.toSql()}
            <where>
                ${sqlMap.where.toSql()}
            </where>
            ORDER BY ${sqlMap.order.toSql()}
        </select>
    </mapper>
    本文著作权归作者 [ admin ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    取消回复

    发表留言
    回复

    首页邻居关于归档
    Copyright©2020-2026  All Rights Reserved.  Load:0.023 s
    京ICP备18019712号
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。