使用方式 实体类注解有时间数据库存的字段是是一个文档型数据(例如: 直接在某个字段存了个json数据, 或者存了个list的数据), 存取的时候手动做一次转型太麻烦了, 而且手动转型后数据库存储的内容会经过转义
所以为了更加优雅的和数据库交互, 我们可以使用mybatis-plus 的 typeHandler 进行自动的类型映射
在实体类的字段上加上注解 @TableField
@TableField(value = "数据库字段名", typeHandler = ListToStringHandler.class)xml配置
typeHandler="com.xxx.common.type.handler.base.ListToStringHandler 这里填写自己typehandler的实现类"/>
解决typeHandler查询无数据显示问题此时数据库的增删改操作应该都可以正确的将数据转型存储了
但是查询可能会出问题, 现象就是查询的时候这个字段一直是空的(把字段改成String并且typeHandler去掉却可以拿到数据)
检查下项目配置application.properties
是否包含自己定义的转换器路径
mybatis-plus.type-handlers-package=自己的包路径 如下: mybatis-plus.type-handlers-package=com.xxx.type.handler提供2个基类的转换器
这两个是抽象类, 需要哪种类型直接继承并且注册一下数据类型即可
List 抽象类public abstract class BaseMybatisList2JsonHandlermap 抽象类extends BaseTypeHandler > { @Override public void setNonNullParameter(PreparedStatement ps, int i, List
parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, JSON.toJSONString(parameter)); } @Override public List getNullableResult(ResultSet rs, String columnName) throws SQLException { String data = rs.getString(columnName); return StringUtils.isBlank(data) ? null : JSON.parseArray(data, (Class ) getRawType()); } @Override public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String data = rs.getString(columnIndex); return StringUtils.isBlank(data) ? null : JSON.parseArray(data, (Class ) getRawType()); } @Override public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String data = cs.getString(columnIndex); return StringUtils.isBlank(data) ? null : JSON.parseArray(data, (Class ) getRawType()); } @Override public List getResult(ResultSet rs, String columnName) throws SQLException { return super.getResult(rs, columnName); } @Override public List getResult(ResultSet rs, int columnIndex) throws SQLException { return super.getResult(rs, columnIndex); } @Override public List getResult(CallableStatement cs, int columnIndex) throws SQLException { return super.getResult(cs, columnIndex); } }
public abstract class BaseMybatisMap2JsonHandler使用方式extends BaseTypeHandler > { protected abstract TypeReference getType(); // typeReference = new InstructionBoHashMap(); @Override public void setNonNullParameter(PreparedStatement ps, int i, HashMap parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, JSON.toJSONString(parameter)); } @Override public HashMap getNullableResult(ResultSet rs, String columnName) throws SQLException { String data = rs.getString(columnName); return StringUtils.isBlank(data) ? null : (HashMap )JSON.parseObject(data, getType()); } @Override public HashMap getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String data = rs.getString(columnIndex); return StringUtils.isBlank(data) ? null : (HashMap )JSON.parseObject(data, getType()); } @Override public HashMap getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String data = cs.getString(columnIndex); return StringUtils.isBlank(data) ? null : (HashMap )JSON.parseObject(data, getType()); } @Override public HashMap getResult(ResultSet rs, String columnName) throws SQLException { return super.getResult(rs, columnName); } @Override public HashMap getResult(ResultSet rs, int columnIndex) throws SQLException { return super.getResult(rs, columnIndex); } @Override public HashMap getResult(CallableStatement cs, int columnIndex) throws SQLException { return super.getResult(cs, columnIndex); } }
我这里用List
- ClockingBo: 是我自己业务数据的格式(就正常的实体就好了)
@Slf4j
@MappedTypes({List.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ClockingBoJsonHandler extends BaseMybatisList2JsonHandler {
}



