BaseTypeHandler 是个抽象类,需要子类去实现其定义的 4 个抽象方法,而它本身实现了 typeHandler 接口的 4 个方法。
可以对数据保存与查询时做出相应处理,类似操作数据库之间的一个拦截器
举栗子:把集合类型当string存起来,读取的时候映射为list集合
首先自定义handler 继承BaseTypeHandler重写他里边的四个方法
public abstract void setNonNullParameter(PreparedStatement var1, int var2, T var3, JdbcType var4) throws SQLException;
public abstract T getNullableResult(ResultSet var1, String var2) throws SQLException;
public abstract T getNullableResult(ResultSet var1, int var2) throws SQLException;
public abstract T getNullableResult(CallableStatement var1, int var2) throws SQLException;
代码如下
public class ListToStringHandler extends BaseTypeHandler<List> {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, List list, JdbcType jdbcType) throws SQLException {
preparedStatement.setString(i, JSON.toJSONString(list));
}
@Override
public List getNullableResult(ResultSet resultSet, String s) throws SQLException {
return JSONArray.parseArray(resultSet.getString(s));
}
@Override
public List getNullableResult(ResultSet resultSet, int i) throws SQLException {
return JSONArray.parseArray(resultSet.getString(i));
}
@Override
public List getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return JSONArray.parseArray(callableStatement.getString(i));
}
}
映射操作
mybaits-plus 方式
bean上添加
注解
@TableName(autoResultMap = true)
映射字段上添加如下注解,指定自定义的handler
@TableField(jdbcType = JdbcType.VARCHAR, typeHandler = ListToStringHandler.class)
mybaits的方式
<resultMap> 标签内 映射字段的handler 指定自定义的handler即可,保存的时候也要指定。
测试
这只是其一种简单的用法,其他的比如加密解密也适用。