引言
- 接到一个需求,在原有的对象基础上,加了20多个新属性,对于这些数据仅仅只有查看的用途,所以打算在数据库新增一个base字段,存入这20多个新属性
- 按以往的做法,就是将20多个属性的新对象通过代码转成json字符串后保存,读取的时候将json转为对象返回前端,每次保存和查询都要类似操作
- 于是想到了Mybatis的TypeHandle,让自定义对象优雅的存取
这里提供2个方案实现:
方案1:
1、新建一个类,继承BaseTypeHandler
@MappedTypes(BaseInfo.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class BaseInfoTypeHandler extends org.apache.ibatis.type.BaseTypeHandler<BaseInfo> {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, BaseInfo BaseInfo, JdbcType jdbcType) throws SQLException {
preparedStatement.setString(i, JsonUtils.toJson(BaseInfo));
}
@Override
public BaseInfo getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
return JSON.parseObject(resultSet.getString(columnName), BaseInfo.class);
}
@Override
public BaseInfo getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
if(StringUtils.isEmpty(resultSet.getString(columnIndex))){
return null;
}
return JSON.parseObject(resultSet.getString(columnIndex), BaseInfo.class);
}
@Override
public BaseInfo getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
if(StringUtils.isEmpty(callableStatement.getString(columnIndex))){
return null;
}
return JSON.parseObject(callableStatement.getString(columnIndex), BaseInfo.class);
}
2、在数据库的PO对象上和对应的数据库字段上,加上注解,设置autoResultMap=true
//数据库PO类上
@TableName(value = "test_one", autoResultMap = true)
//PO类中对应的对象字段
@TableField(value = "base_info", typeHandler = BaseInfoTypeHandler .class)
private BaseInfo baseInfo;
3、在对应的mapper.xml中配置属性
<resultMap id="BaseResultMap" type="com.***.po.XXXBasePO">
<id column="id" jdbcType="BIGINT" property="id" />
...
...
<result column="base_info" jdbcType="VARCHAR" property="baseInfo" typeHandler="com.****.BaseInfoTypeHandler"/>
resultMap>
4、在注册中心配置mybatisplus的配置,路径是你新建的BaseInfoTypeHandler的路径,用于启动扫描该类,实现对象的转换
type-handlers-package: com.*
方案2:
利用Mybatisplus自带的FastjsonTypeHandler实现
1、在数据库的PO对象上和对应的数据库字段上,加上注解,设置autoResultMap=true
//数据库PO类上
@TableName(value = "test_one", autoResultMap = true)
//PO类中对应的对象字段
@TableField(value = "base_info", typeHandler = FastjsonTypeHandler.class)
private BaseInfo baseInfo;
2、如果是手写的XML,切记一定要用resultMap,不可用resultType,否则不能转成需要的对象
<select id="???" resultMap="BaseResultMap">
综上得:
利用Mybatis-Plus的FastjsonTypeHandler可以更简便的达到目的。