mybatis将mysql decimal正确映射到bigdecimal需三处协同:数据库建表用decimal(n,m)明确定义精度,java实体类声明private bigdecimal并提供getter/setter,mybatis映射中显式配置jdbctype="decimal"和javatype="java.math.bigdecimal",同时jackson序列化需配置转字符串避免科学计数法。

Java中MyBatis将MySQL的DECIMAL字段正确映射到BigDecimal,核心在于三处配置协同:数据库建表精度定义、实体类类型声明、MyBatis映射层显式声明。缺一不可,否则容易出现精度截断、空指针或科学计数法前端展示异常。
数据库字段必须用 DECIMAL(N,M) 明确精度
不能只写 DECIMAL 或 NUMERIC,必须指定总位数和小数位数。例如:
-
推荐写法:
amount DECIMAL(15,6)—— 表示最多15位数字,其中6位小数 -
避免写法:
amount DECIMAL或amount NUMERIC(MySQL 8.0+虽允许,但驱动可能默认按(10,0)处理,导致小数丢失) - 建表时若精度不足(如
DECIMAL(10,2)),后续存123.4567会被四舍五入为123.46,这不是MyBatis的问题,而是数据库层截断
实体类属性必须声明为 BigDecimal 类型
Java端必须严格使用java.math.BigDecimal,不可用Double或Float替代:
- 字段声明:
private BigDecimal amount; - 务必提供 public 的 getter/setter 方法(MyBatis通过反射调用)
- 构造时建议用字符串初始化:
new BigDecimal("123.4567"),避免new BigDecimal(123.4567)因double二进制精度引入误差
MyBatis映射文件需显式指定 jdbcType 和 javaType
在<resultmap></resultmap>或<result></result>中,不能依赖自动推断:
- 查询映射示例:
<result column="amount" property="amount" jdbctype="DECIMAL" javatype="java.math.BigDecimal"></result> - 插入/更新参数示例:
<insert id="insert" parametertype="YourEntity"> INSERT INTO t (...) VALUES (#{amount,jdbcType=DECIMAL}) </insert> - 全局统一配置(推荐):在
mybatis-config.xml中注册类型处理器:<typehandlers><br><typehandler handler="org.apache.ibatis.type.BigDecimalTypeHandler" jdbctype="DECIMAL"></typehandler><br></typehandlers>
额外注意 Jackson 序列化环节
MyBatis映射本身完成,但返回给前端时可能出问题:
- 如果后端用
@ResponseBody或RestController直接返回对象,Jackson默认会把BigDecimal转成科学计数法(如"0E-8") - 解决方法:在Spring Boot中添加配置
spring.jackson.math-big-decimal-conversion=string
或自定义ObjectMapper注册BigDecimalSerializer,确保输出为普通字符串格式(如"0.00000000")
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











