mybatis-plus之自动映射字段(typeHandler)的注意点及说明

 更新时间:2023年04月06日 09:32:34   作者:__WanG  
这篇文章主要介绍了mybatis-plus之自动映射字段(typeHandler)的注意点及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

有时间数据库存的字段是是一个文档型数据(例如: 直接在某个字段存了个json数据, 或者存了个list的数据), 存取的时候手动做一次转型太麻烦了, 而且手动转型后数据库存储的内容会经过转义

所以为了更加优雅的和数据库交互, 我们可以使用mybatis-plustypeHandler 进行自动的类型映射

使用方式

实体类注解

在实体类的字段上加上注解 @TableField

@TableField(value = "数据库字段名", typeHandler = ListToStringHandler.class)

注意:如果想要查询的时候自动将数据库字段映射成java对象需要在实体类上加上注解

@TableName(autoResultMap = true)

xml配置

        <result column="数据库字段名" property="java实体字段名"/>
                typeHandler="com.xxx.common.type.handler.base.ListToStringHandler 这里填写自己typehandler的实现类"/>

此时数据库的增删改操作应该都可以正确的将数据转型存储了

但是查询可能会出问题, 现象就是查询的时候这个字段一直是空的(把字段改成String并且typeHandler去掉却可以拿到数据)

解决typeHandler查询无数据显示问题

检查下项目配置application.properties是否包含自己定义的转换器路径

mybatis-plus.type-handlers-package=自己的包路径

如下: 

mybatis-plus.type-handlers-package=com.xxx.type.handler

提供2个基类的转换器

这两个是抽象类, 需要哪种类型直接继承并且注册一下数据类型即可

List 抽象类

public abstract class BaseMybatisList2JsonHandler<T> extends BaseTypeHandler<List<T>> {

	@Override
	public void setNonNullParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType) throws SQLException {
		ps.setString(i, JSON.toJSONString(parameter));
	}

	@Override
	public List<T> getNullableResult(ResultSet rs, String columnName)
			throws SQLException {
		String data = rs.getString(columnName);
		return StringUtils.isBlank(data) ? null : JSON.parseArray(data, (Class<T>) getRawType());
	}

	@Override
	public List<T> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
		String data = rs.getString(columnIndex);
		return StringUtils.isBlank(data) ? null : JSON.parseArray(data, (Class<T>) getRawType());
	}

	@Override
	public List<T> getNullableResult(CallableStatement cs, int columnIndex)
			throws SQLException {
		String data = cs.getString(columnIndex);
		return StringUtils.isBlank(data) ? null : JSON.parseArray(data, (Class<T>) getRawType());
	}

	@Override
	public List<T> getResult(ResultSet rs, String columnName) throws SQLException {
		return super.getResult(rs, columnName);
	}

	@Override
	public List<T> getResult(ResultSet rs, int columnIndex) throws SQLException {
		return super.getResult(rs, columnIndex);
	}

	@Override
	public List<T> getResult(CallableStatement cs, int columnIndex) throws SQLException {
		return super.getResult(cs, columnIndex);
	}
}

map 抽象类

public abstract class BaseMybatisMap2JsonHandler<T> extends BaseTypeHandler<HashMap<String, T>> {

	protected abstract TypeReference getType();
//	typeReference =  new InstructionBoHashMap();

	@Override
	public void setNonNullParameter(PreparedStatement ps, int i, HashMap<String, T> parameter, JdbcType jdbcType) throws SQLException {
		ps.setString(i, JSON.toJSONString(parameter));
	}

	@Override
	public HashMap<String, T> getNullableResult(ResultSet rs, String columnName)
			throws SQLException {
		String data = rs.getString(columnName);

		return StringUtils.isBlank(data) ? null : (HashMap<String, T>)JSON.parseObject(data, getType());
	}

	@Override
	public HashMap<String, T> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
		String data = rs.getString(columnIndex);
		return StringUtils.isBlank(data) ? null : (HashMap<String, T>)JSON.parseObject(data, getType());
	}

	@Override
	public HashMap<String, T> getNullableResult(CallableStatement cs, int columnIndex)
			throws SQLException {
		String data = cs.getString(columnIndex);
		return StringUtils.isBlank(data) ? null : (HashMap<String, T>)JSON.parseObject(data, getType());
	}

	@Override
	public HashMap<String, T> getResult(ResultSet rs, String columnName) throws SQLException {
		return super.getResult(rs, columnName);
	}

	@Override
	public HashMap<String, T> getResult(ResultSet rs, int columnIndex) throws SQLException {
		return super.getResult(rs, columnIndex);
	}

	@Override
	public HashMap<String, T> getResult(CallableStatement cs, int columnIndex) throws SQLException {
		return super.getResult(cs, columnIndex);
	}
}

使用方式

我这里用List<ClockingBo>举例

ClockingBo: 是我自己业务数据的格式(就正常的实体就好了)

@Slf4j
@MappedTypes({List.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ClockingBoJsonHandler extends BaseMybatisList2JsonHandler<ClockingBo> {

}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vert-x-通过异步的方式使用JDBC连接SQL

    Vert-x-通过异步的方式使用JDBC连接SQL

    在这篇文章中,我们将会看到怎样在vert.x应用中使用HSQL,当然也可以使用任意JDBC,以及使用vertx-jdbc-client提供的异步的API,这篇文章的代码在github
    2016-01-01
  • 简单了解Spring循环依赖解决过程

    简单了解Spring循环依赖解决过程

    这篇文章主要介绍了简单了解Spring循环依赖解决过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • java求三个数的最大值的示例分享

    java求三个数的最大值的示例分享

    这篇文章主要介绍了java求三个数的最大值的示例分享,需要的朋友可以参考下
    2014-03-03
  • java反射遍历实体类属性和类型,并赋值和获取值的简单方法

    java反射遍历实体类属性和类型,并赋值和获取值的简单方法

    下面小编就为大家带来一篇java反射遍历实体类属性和类型,并赋值和获取值的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • java中使用interrupt通知线程停止详析

    java中使用interrupt通知线程停止详析

    这篇文章主要介绍了java中使用interrupt通知线程停止详析,文章介绍的是使用interrupt来通知线程停止运行,而不是强制停止,详细内容需要的小伙伴可以参考一下
    2022-09-09
  • 优化常见的java排序算法

    优化常见的java排序算法

    这篇文章主要介绍了Java编程中快速排序算法的实现及相关算法优化,快速排序算法的最差时间复杂度为(n^2),最优时间复杂度为(n\log n),存在优化的空间,需要的朋友可以参考下
    2021-07-07
  • SpringBoot+ThreadLocal+AbstractRoutingDataSource实现动态切换数据源

    SpringBoot+ThreadLocal+AbstractRoutingDataSource实现动态切换数据源

    最近在做业务需求时,需要从不同的数据库中获取数据然后写入到当前数据库中,因此涉及到切换数据源问题,所以本文采用ThreadLocal+AbstractRoutingDataSource来模拟实现dynamic-datasource-spring-boot-starter中线程数据源切换,需要的朋友可以参考下
    2023-08-08
  • java代码块之简易qq登录界面及按钮颜色设置代码

    java代码块之简易qq登录界面及按钮颜色设置代码

    这篇文章主要介绍了java代码块之简易qq登录界面及按钮颜色设置代码,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • java Stream的聚合功能面试精讲

    java Stream的聚合功能面试精讲

    这篇文章主要为大家介绍了java Stream的聚合功能面试精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Springboot 2.x中server.servlet.context-path的运用详解

    Springboot 2.x中server.servlet.context-path的运用详解

    这篇文章主要介绍了Springboot 2.x中server.servlet.context-path的运用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论