当前位置: 首页 > wzjs >正文

动态网站的建设及综合设计建网站的流程

动态网站的建设及综合设计,建网站的流程,商城的网站建设,江西网站备案要求前言 在使用 MyBatis Plus 操作 PostgreSQL 数据库时,我们可能会遇到一个棘手的问题:BigDecimal类型的数据在存储或查询时精度丢失。这不仅会影响数据的准确性,还可能导致一些难以察觉的错误。本文将详细介绍这个问题的背景、排查过程以及最…

前言

在使用 MyBatis Plus 操作 PostgreSQL 数据库时,我们可能会遇到一个棘手的问题:BigDecimal类型的数据在存储或查询时精度丢失。这不仅会影响数据的准确性,还可能导致一些难以察觉的错误。本文将详细介绍这个问题的背景、排查过程以及最终的解决方案。

1.项目场景

在我的项目中,使用了 PostgreSQL 数据库,并且在表中定义了 NUMERIC 类型的字段来存储高精度数值。例如,我们有一个 data_cover 表,其中的 xy 字段被定义为 NUMERIC 类型,用于存储坐标值:

CREATE TABLE data_cover (id BIGINT NOT NULL,parking_id BIGINT,timestamp BIGINT,x NUMERIC,y NUMERIC,floor VARCHAR(255)
);

Java 实体类中,我们使用 BigDecimal 来映射这些字段:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;@TableName("data_cover")
public class DataCover {@TableField("id")private Long id;@TableField("parking_id")private Long parkingId;@TableField("timestamp")private Long timestamp;@TableField("x")private BigDecimal x;@TableField("y")private BigDecimal y;@TableField("floor")private String floor;
}

然而,在插入或查询数据时,我们发现 xy 字段的精度丢失了,只保留了整数部分。这显然不符合我们的预期。

2.排查过程

  • 检查数据库字段定义 没问题
  • 检查 SQL 插入语句 没问题
  • 检查 MyBatis Plus 配置

在插入数据之前打印了 BigDecimal 的值,结果显示,BigDecimal的值在插入之前是正确的,但插入数据库后精度丢失。这表明问题可能出现在 MyBatis Plus 的类型处理逻辑中

3.原因分析

最终排查到,MyBatis Plus 默认的类型处理器可能没有正确处理 BigDecimal 的精度。默认情况下,MyBatis Plus 使用 JdbcType.NUMERIC 来处理 BigDecimal,但可能在某些场景下(如批量操作)导致精度丢失。

4.解决方案

创建了一个自定义的 BigDecimalTypeHandler 类,覆盖了 MyBatis 的默认行为:

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;@MappedTypes(BigDecimal.class)
@MappedJdbcTypes(JdbcType.NUMERIC)
public class BigDecimalTypeHandler extends BaseTypeHandler<BigDecimal> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, BigDecimal parameter, JdbcType jdbcType) throws SQLException {ps.setBigDecimal(i, parameter); // 直接设置,避免精度丢失}@Overridepublic BigDecimal getNullableResult(ResultSet rs, String columnName) throws SQLException {return rs.getBigDecimal(columnName);}@Overridepublic BigDecimal getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return rs.getBigDecimal(columnIndex);}@Overridepublic BigDecimal getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return cs.getBigDecimal(columnIndex);}
}

然后,我们在 MyBatis Plus 的配置中注册了这个自定义类型处理器:

import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisConfig {@Beanpublic ConfigurationCustomizer configurationCustomizer() {return configuration -> {configuration.getTypeHandlerRegistry().register(BigDecimal.class, BigDecimalTypeHandler.class);};}
}

通过自定义类型处理器,成功解决了 BigDecimal 精度丢失的问题。自定义类型处理器确保了在插入和查询时,BigDecimal 的精度不会被截断或修改。

5.总结

在使用 MyBatis Plus 操作 PostgreSQL 数据库时,BigDecimal 精度丢失的问题可能是由于默认的类型处理器没有正确处理高精度数值。通过自定义类型处理器,我们可以覆盖默认行为,确保精度不会丢失。

如果你在项目中遇到类似的问题,可以尝试以下步骤:

1.检查数据库字段定义,确保字段类型和精度设置正确。
2.检查 SQL 插入语句,确保 BigDecimal 的值在插入之前是正确的。
3.检查 MyBatis Plus 的配置,确保没有对 BigDecimal 进行不必要的处理。
4.使用自定义类型处理器来确保精度不会丢失。

希望这篇文章能帮助你解决类似的问题。如果你有任何疑问或建议,欢迎在评论区留言!

http://www.dtcms.com/wzjs/141397.html

相关文章:

  • 一个网站不兼容ie怎么做上海网络推广公司
  • 做网站需要监事吗北京网站优化指导
  • 专业做网文的网站有哪些数据平台
  • 线上购物网站建设的可行性搜索引擎优化seo方案
  • 大庆做网站找谁手机百度推广怎么打广告
  • 网站单页在线怎样做百度推广网页
  • 无锡网站建设专注千客云网络网店代运营正规公司
  • google网站管理员工具 下载关于华大18年专注seo服务网站制作应用开发
  • 高效的网站建设直播营销策略有哪些
  • 富阳网站建设报价宁波网站优化
  • 网站上的logo怎么做软件发布网
  • 优质外贸网站免费自制app软件
  • 百度开户做网站2400seo运营经理
  • 网站网页制作公司电商大数据查询平台
  • 无锡网站制作需要多少钱中文搜索引擎排名
  • 自己的网站怎么制作百度收录网站
  • 建站员工网站做seo如何赚钱
  • 北京网站建设飞沐软文发布平台哪个好
  • 网站中弹出广告怎么做色盲测试图第六版及答案大全
  • 网站建设如何实现检索功能综合性b2b电子商务平台网站
  • 开发网站网络公司排行周口seo推广
  • 如何进行外贸网站建设医疗器械龙头股
  • 海南百度网站建设浏览器地址栏怎么打开
  • 网站建设就业方向王通seo
  • 武汉网站建设哪家强抖音视频seo霸屏
  • 珠宝网站制作的理念外包seo公司
  • 网站页脚怎么做能好看点百度怎么发布自己的广告
  • 大学网站开发模板免费下载网推公司干什么的
  • 企业做网站哪个最好sem优化技巧
  • 企业网站建设的思路游戏推广赚佣金