zoukankan      html  css  js  c++  java
  • 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配置
     
    @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;
    
       
    }

      

    配置是结束, 直接使用就行

  • 相关阅读:
    TSQL 字符串前加 N 是什么意思
    SQL语句修改字段默认值
    Clustering Technologies On Windows Server 2008 R2
    sql 修改列名及表名
    Capture screenshots on Mac 在Mac下截图
    极限编程(XP,eXtreme Programming)
    zookeeper安装(单机版)
    linux备份用户权限
    Dubbo管控台安装(zookeeper单机版)
    linux查看IP
  • 原文地址:https://www.cnblogs.com/jiuya/p/14049696.html
Copyright © 2011-2022 走看看