Mybatis 自定义类型处理器示例详解
前言
在某些情况下我们需要对类型做处理。
例如数据存储的是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"/>
到此这篇关于Mybatis 自定义类型处理器的文章就介绍到这了,更多相关Mybatis 自定义类型处理器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
ThreadPoolExecutor核心线程数和RocketMQ消费线程调整详解
这篇文章主要介绍了ThreadPoolExecutor核心线程数和RocketMQ消费线程调整详解,Rocketmq 消费者在高峰期希望手动减少消费线程数,通过DefaultMQPushConsumer.updateCorePoolSize方法可以调用内部的setCorePoolSize设置多线程核心线程数,需要的朋友可以参考下2023-10-10Java EasyExcel利用填充模版动态生成多个sheet页
这篇文章主要为大家详细介绍了Java EasyExcel如何利用填充模版动态生成多个sheet页,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下2023-12-12Java(JDK/Tomcat/Maven)运行环境配置及工具(idea/eclipse)安装详细教程
这篇文章主要介绍了Java(JDK/Tomcat/Maven)运行环境配置及工具(idea/eclipse)安装,本文给大家介绍的非常想详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-03-03
最新评论