前言
在某些情况下我们需要对类型做处理。
例如数据存储的是Long
。程序里是BigDecimal
,那么我们出库入库都需要做处理。此时就可以使用类型处理器
我们从@TableFiel
入手,其中有一个字段typeHandler
如下图
对于注释上的建议事实也确实如此,如果我们在
xml
中没有定义这个实体的ResultMap
那么需要将autoResultMap
赋值为ture
要求类型是TypeHandler
的实现类即可。
我们看到实际上已经有很多的类型处理器了
它们都是一些默认的类型处理器,下面是官网的解释
mybatis – MyBatis 3 | 配置
BaseTypeHandler
我们可以继承BaseTypeHandler
,来自定义一个类型处理器。
/**
* @author YinShangwen
* @since 2023/10/16 9:36
*/
// 指定 Java 类型
@MappedTypes({String.class})
// 指定 jdbc 类型
@MappedJdbcTypes({JdbcType.VARCHAR})
public class StringTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
// 设置值
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
// 获得值
return null;
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
// 获得值
return null;
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
// 获得值
return null;
}
}
假设我们这里给入库的字符串的末尾加上.ysw
的后缀
出库的时候去除添加的后缀,完整代码如下:
/**
* @author YinShangwen
* @since 2023/10/16 9:36
*/
@MappedTypes({String.class})
@MappedJdbcTypes({JdbcType.VARCHAR})
public class StringTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
if (StringUtils.isNotBlank(parameter)) {
ps.setString(i, parameter + ".ysw");
}
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
String ret = rs.getString(columnName);
return ret != null ? ret.substring(0, ret.length() - 4) : null;
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String ret = rs.getString(columnIndex);
return ret != null ? ret.substring(0, ret.length() - 4) : null;
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String ret = cs.getString(columnIndex);
return ret != null ? ret.substring(0, ret.length() - 4) : null;
}
}
AbstractJsonTypeHandler
AbstractJsonTypeHandler
是对于json类型的处理器,继承该类可以很方便的完成
具体代码如下:
/**
* @author YinShangwen
* @since 2023/10/16 8:55
*/
@MappedTypes({Map.class})
@MappedJdbcTypes({JdbcType.JAVA_OBJECT})
public class LongMapJsonTypeHandler extends AbstractJsonTypeHandler<Map<Long, List<Demo>>> {
@Override
protected Map<Long, List<Demo>> parse(String json) {
return JSON.parseObject(json, new TypeReference<Map<Long, List<RangeConfigDTO>>>() {
});
}
@Override
protected String toJson(Map<Long, List<Demo>> obj) {
return JSON.toJSONString(obj);
}
}
使用
⚠️注意:必须开启@TableName(autoResultMap = true)
@TableField(typeHandler = StringTypeHandler.class)
<result column="demo_config" property="demoConfig" typeHandler="com.ysw.type_handler.LongMapJsonTypeHandler"/>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/195210.html