美文网首页工作生活
MyBatis TypeHandler自定义类型转换器

MyBatis TypeHandler自定义类型转换器

作者: 我离大佬只差这么一点 | 来源:发表于2019-07-04 20:03 被阅读0次

    当您的项目处在以下情况的时候,我觉得这篇文章对您有一些帮助

    1. 使用Springboot 1.5.4 及以上 (本人没有用过更低版本)
    2. 实体类属性数据类型与数据库表的列数据类型不一致

    TypeHandler是MyBatis负责Java数据类型和Jdbc数据类型之间的映射和转换的核心部件,当MyBatis自带的类型转换器不能满足我们的需求的时候,我们可以通过

    1. 继承BaseTypeHandler<T>类
    2. 实现更上一层 TypeHandler<T> 接口

    来自定义我们自己的类型转换器。

    例子:实体类中有一属性是一个数组,而在数据库中存的是逗号分隔的字符串。

    @Column(name = "ORDER_TYPE")
    @ApiModelProperty(value="订单类型")
    private String[] orderType;
    

    假设orderType是uuid的数组,实现一个数组和字符串互相转换的类型转换器。

    // 指定实体类属性数据类型
    @MappedTypes({String[].class})
    // 指定Jdbc数据类型
    @MappedJdbcTypes({JdbcType.VARCHAR})
    // BaseTypeHandler<T>跟着的实体类属性的数据类型我们这里是Array 和 String 相互转换
    public class StringArrayTypeHandler extends BaseTypeHandler<String[]> {
    
         //  给 PreparedStatement 对象设置参数 i是SQL的下标 strings是实体类属性的值 是我们要设置的参数
         // 这里是插入数据库中的操作
        @Override
        public void setNonNullParameter(PreparedStatement preparedStatement, int i, String[] strings, JdbcType jdbcType) throws SQLException {
            preparedStatement.setString(i, String.join(",", strings));
        }
        // 从Jdbc的结果集中获取数据进行类型转换 可以使用列名 也可以使用下标(Jdbc的基本过程)
        // 从数据库中读取的操作
        @Override
        public String[] getNullableResult(ResultSet resultSet, String s) throws SQLException {
            String str = resultSet.getString(s);
            if (resultSet.wasNull()){
                return null;
            }
            return str.split(",");
        }
    
        @Override
        public String[] getNullableResult(ResultSet resultSet, int i) throws SQLException {
            String str = resultSet.getString(i);
            if (resultSet.wasNull()){
                return null;
            }
            return str.split(",");
        }
        
        //  存储过程专用
        @Override
        public String[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
            String str = callableStatement.getString(i);
            if (callableStatement.wasNull()){
                return null;
            }
            return str.split(",");
        }
    }
    

    在ResultMap中说明该属性需要类型转换

    <resultMap id="BaseResultMap" type="com.xxx.xxx.xxx.entity.BasePickRule">
      <result column="ORDER_TYPE" jdbcType="VARCHAR" property="orderType" typeHandler="com.xxx.xxx.xxx.util.StringArrayTypeHandler" />
    </resultMap>
    

    配置文件中增加自定义类型转换器的包

    mybatis.type-handlers-package = com.xxx.xxx.xxx.util
    

    以上均为个人理解,如有不足之处,欢迎在评论区留言。

    相关文章

      网友评论

        本文标题:MyBatis TypeHandler自定义类型转换器

        本文链接:https://www.haomeiwen.com/subject/syzlhctx.html