赵云个人博客

愿居于一城,与卿所见美好......

推荐文章

MyBatis Plus数组list存入数据库之TypeHanlder类转换器

    MyBatis Plus数组list存入数据库之TypeHanlder类转换器

    入参:字段String[] 直接存入数据库
      TypeHandler概念
        MyBatis 中的 TypeHandler 类型处理器用于 JavaType 与 JdbcType 之间的转换
    1.数据库字段类型更改为json, mysql版本需要5.7.1以上


    自定义转换器

    import com.fasterxml.jackson.databind.ObjectMapper;
    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 java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.Set;
    
    /*
       <columnOverride column="urls" javaType="java.lang.String[]" typeHandler="JsonStringArrayTypeHandler"/>
     */
    @MappedJdbcTypes({JdbcType.VARCHAR})
    public class JsonStringArrayTypeHandler extends BaseTypeHandler<String[]> {
        private static final ObjectMapper mapper = new ObjectMapper();
    
        @Override
        public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) throws SQLException {
            ps.setString(i,toJson(parameter));
        }
    
        @Override
        public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
            return this.toObject(rs.getString(columnName));
        }
    
        @Override
        public String[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
            return this.toObject(rs.getString(columnIndex));
        }
    
        @Override
        public String[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
            return this.toObject(cs.getString(columnIndex));
        }
    
        private String toJson(String[] params) {
            try {
                return mapper.writeValueAsString(params);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "[]";
        }
    
        private String[] toObject(String content) {
            if (content != null && !content.isEmpty()) {
                try {
                    return (String[]) mapper.readValue(content, String[].class);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            } else {
                return null;
            }
        }
    }

    实体类加上以下2个注释.
      遇到autoResultMap 无法识别, 去官网看了下最新版本Ok了 我只能告诉你<version>3.4.1</version>支持
        @TableName(autoResultMap = true,value="tb_post")
        @TableField(typeHandler = JsonStringArrayTypeHandler.class)
      官方对这个字段的解释,新版本的也不需要去xml配置
    !!! 不加autoResultMap = true会报错

    @Data
    @TableName(autoResultMap = true,value="tb_post")
    public class Post implements Serializable {
        private static final long serialVersionUID = 321216665472999991L;
        /**
         * 帖子id
         */
        @TableId
        private Long id;
      
        /**
         * 图片路径 一对多
         */
        @TableField(typeHandler = JsonStringArrayTypeHandler.class)
        private String[] imgUrl;
    
       
    }


    阅读全文>>

作者:赵云分类:【javaEE浏览(837评论(0

2021-09-17 20:59:57