zoukankan      html  css  js  c++  java
  • MyBatis Plus 自动类型转换之TypeHandler

    MyBatis Plus 自动类型转换之TypeHandler

    • 数据库表里有ids字段,存放的都是主键id,逗号分隔。
    • model里面是Set集合装Integer类型的 ids
    • 用MyBatis的TypeHandler做自动类型转换

    分三步:

    • 1.实体类需要加个注解
    @TableName(autoResultMap = true)
    
    • 2.对应对象的属性也需要加注解
    @TableField(typeHandler = SetTypeHandler.class)
    
    • 3.继承BaseTypeHandler实现其方法
    @MappedTypes(Set.class)
    @MappedJdbcTypes(JdbcType.VARCHAR)
    public class SetTypeHandler extends BaseTypeHandler<Set> {
    
        @Override
        public void setNonNullParameter(PreparedStatement ps, int i, Set parameter, JdbcType jdbcType)
                throws SQLException {
            String param = parameter.toString().replaceAll("\[|\]| ", "");
            ps.setString(i, param);
        }
    
        @Override
        public Set<Integer> getNullableResult(ResultSet rs, String columnName)
                throws SQLException {
            String sqlSet = rs.getString(columnName);
            return getSet(sqlSet);
        }
    
        @Override
        public Set<Integer> getNullableResult(ResultSet rs, int columnIndex)
                throws SQLException {
            String sqlSet = rs.getString(columnIndex);
            return getSet(sqlSet);
        }
    
        @Override
        public Set<Integer> getNullableResult(CallableStatement cs, int columnIndex)
                throws SQLException {
            String sqlSet = cs.getString(columnIndex);
            return getSet(sqlSet);
        }
    
        private Set<Integer> getSet(String sqlSet) {
            if (StringUtils.isNotBlank(sqlSet)) {
                return Arrays.asList(sqlSet.split(",")).stream()
                        .map(Integer::parseInt)
                        .collect(Collectors.toSet());
            }
            return new HashSet();
        }
    }
    

    解释以上代码:

    • 实体类要转换的类型:Set
    @MappedTypes(Set.class)
    
    • 对应数据库表的字段类型:varchar
    @MappedJdbcTypes(JdbcType.VARCHAR)
    
    • 参数set,用来给参数PreparedStatement对象对应的列设置参数,预编译SQL语句,在SQL语句执行之前改变语句。先去掉Set的“[]”就变成了类似“ 1,2,3,4”,然后替换进SQL语句,这是完成了Set到varchar的转换。
    public void setNonNullParameter(PreparedStatement ps, int i, Set parameter, JdbcType jdbcType)
    
    • 两个大方向get,从ResultSet和CallableStatement获取对应列的值,不同之处是一个是取第几个位置的值,一个是取具体列名所对应的值。
    public Set<Integer> getNullableResult(ResultSet rs, String columnName)
    public Set<Integer> getNullableResult(ResultSet rs, int columnIndex)
    

    上面两个方法是从ResultSet获取值,一个是通过列名,一个是第几个位置

    public Set<Integer> getNullableResult(CallableStatement cs, int columnIndex)
    
  • 相关阅读:
    Java使用google开源工具Thumbnailator实现图片压缩
    nginx基本配置
    CopyPropertis
    微服务(Microservices )简介
    jQuery ajax()使用serialize()提交form数据
    $.getJSON( )的使用方法简介
    理解 CSS 的 z-index 属性
    JS中的call()和apply()方法
    CSS文字换行详细解说
    如何实现JS函数的重载
  • 原文地址:https://www.cnblogs.com/zhou-shi-yuan-ISO8859-1/p/14001216.html
Copyright © 2011-2022 走看看