Mybatis decimal映射到Java BigDecimal类型 科学计数法

环境:数据库使用的mysql,jdbcType为Decimal(32,8), 字段值为 0.00000000,在使用mybatis进行查询时,java类型使用BigDecimal接收,不幸的是它变为了科学计数法 0E-8,于是我很不解,mybatis的类型处理器难道不对BigDecimal 科学计数法做转换吗?带着疑惑,向下开始探索。

源码分析

阅读过mybatis的源码应该知道,mybatis内部有四大组件,四大组件创建时有拦截器可以让使用人员在外部干预mybatis核心流程。四大组件包括StatementHandler、Executor、ParameterHandler、ResultSetHandler,顾名思义,其中用于处理JDBC结果集的是ResultSetHandler,那我们就从这里作为入口,先贴一下源码阅读笔记,也可以视作是大纲,再一点一点向下看

ResultSetHandler#handleResultSets
	DefaultResultSetHandler#handleResultSets()#handleResultSet()#handleRowValues()#handleRowValuesForSimpleResultMap()#getRowValue()#applyPropertyMappings()#getPropertyMappingValue()
		TypeHandler#getResult()
			BaseTypeHandler#getResult()#getNullableResult()	
				BigDecimalTypeHandler#getNullableResult()
					ResultSet#getBigDecimal()
						DruidPooledResultSet#getBigDecimal()
							ResultSetImpl#getBigDecimal(String columnName)#getBigDecimal(int columnIndex)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
问题至此就浮出水面了,mybatis 并未作后续处理,直接返回了,我们拿到处理好的结果集List后,T中BigDecimal类型的字段可能会变成科学计数法

解决方法
  1. 查询的时候,再使用一个String字段来接收decimal,sql 使用concat(columnName, ‘’)
  2. 查询后在内存操作,列表查询出数据后对BigDecimal字段做一下转换(转换为string)
    BigDecimal target = ....
     // 额度科学计数法转换
    String result = target.stripTrailingZeros().toPlainString();
    
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐