工作生活

MyBatis TypeHandler自定义类型转换器

2019-07-04  本文已影响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

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

上一篇下一篇

猜你喜欢

热点阅读