当您的项目处在以下情况的时候,我觉得这篇文章对您有一些帮助
- 使用Springboot 1.5.4 及以上 (本人没有用过更低版本)
- 实体类属性数据类型与数据库表的列数据类型不一致
TypeHandler是MyBatis负责Java数据类型和Jdbc数据类型之间的映射和转换的核心部件,当MyBatis自带的类型转换器不能满足我们的需求的时候,我们可以通过
- 继承BaseTypeHandler<T>类
- 实现更上一层 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
以上均为个人理解,如有不足之处,欢迎在评论区留言。
网友评论