使用Mybatis的TypeHandler优雅的存取自定义对象

引言

  1. 接到一个需求,在原有的对象基础上,加了20多个新属性,对于这些数据仅仅只有查看的用途,所以打算在数据库新增一个base字段,存入这20多个新属性
  2. 按以往的做法,就是将20多个属性的新对象通过代码转成json字符串后保存,读取的时候将json转为对象返回前端,每次保存和查询都要类似操作
  3. 于是想到了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可以更简便的达到目的。

你可能感兴趣的:(mybatis-plus,mybatis,java,开发语言)