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

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();
    
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis在处理BigDecimal类型时,可能会出现科学计数法的问题。当数据库字段类型Decimal(32,8),值为0.00000000时,使用MyBatis进行查询并使用BigDecimal接收结果时,可能会得到科学计数法表示的结果0E-8。这是因为MyBatis在处理BigDecimal时并未对科学计数法进行转换。\[1\] 为了解决这个问题,可以在查询时使用一个String字段来接收decimal类型的值,并使用concat(columnName, '')函数将其转换为字符串。然后,在内存中对获取到的结果集进行操作,对BigDecimal字段进行转换。可以使用stripTrailingZeros()方法去除尾部的0,并使用toPlainString()方法将其转换为普通的字符串表示。这样就可以避免科学计数法的问题。\[2\] 需要注意的是,造成这个问题的主要原因是数据库字段格式。如果数据库字段类型为double,转换为BigDecimal时会出现科学计数法的问题。而如果数据库字段类型decimal,则不会出现这个问题。另外,如果对decimal字段使用了concat函数,也会导致科学计数法的出现。\[3\] #### 引用[.reference_title] - *1* *2* [Mybatis decimal映射Java BigDecimal类型 科学计数法](https://blog.csdn.net/qq_34369569/article/details/115750430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Mybatis映射BigDecimal时出现科学计数法](https://blog.csdn.net/gaoshan12345678910/article/details/128534911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值