Skip to content

Postgresql 金融类型 ​

在金融系统中,PostgreSQL 通常使用 numeric 类型来存储高精度的数值数据,而在 Java 中推荐使用 java.math.BigDecimal 类来处理这类数据。本文将以一个具体的示例说明如何将 Java 中接收到的字符串 "20" 转换为 BigDecimal 对象,并存储到数据库中字段类型为 numeric 的表中,同时展示如何查询并验证存储的数据类型。


1. 数据类型映射关系 ​

  • PostgreSQL 数据库

    • numeric:用于存储高精度的金融数据,能够精确表示大数和小数,适合需要高精度计算的场景。
  • Java 数据类型

    • java.math.BigDecimal:用于高精度数值计算的类,能精确表示和计算十进制数据,非常适合金融类数据的处理和存储。

2. 示例代码说明 ​

下面提供的示例代码包含两个部分:

2.1 保存数据 ​

该示例代码展示了如何:

  1. 通过 EnvUtils 加载环境配置并建立数据库连接。
  2. 模拟接收到字符串 "20" 后,将其转换为 BigDecimal 对象。
  3. 构造 Row 对象(通过自动生成的 ID 和转换后的数值)并保存到表 website_page_params 的字段 page_cost 中。
java
package nexus.io.website.config;

import java.math.BigDecimal;
import java.util.Map;
import org.junit.Test;
import nexus.io.db.activerecord.Db;
import nexus.io.db.activerecord.Row;
import nexus.io.tio.boot.admin.config.TioAdminDbConfiguration;
import nexus.io.tio.utils.environment.EnvUtils;
import nexus.io.tio.utils.snowflake.SnowflakeIdUtils;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class NumericTest {

  @Test
  public void testSave() {
    // 连接数据库
    EnvUtils.load();
    new TioAdminDbConfiguration().config();

    // 模拟接收到的字符串 "20"
    String amountStr = "20";

    // 将字符串转换为 BigDecimal 对象
    BigDecimal amount = new BigDecimal(amountStr);

    // 构造 Row 对象并保存数据
    Row row = Row.by("id", SnowflakeIdUtils.id()).set("page_cost", amount);
    Db.save("website_page_params", row);
  }

  @Test
  public void listType() {
    // 连接数据库
    EnvUtils.load();
    new TioAdminDbConfiguration().config();

    // 查询一条记录
    Row row = Db.findFirst("select * from website_page_params limit 1");
    Map<String, Object> map = row.toMap();
    for (Map.Entry<String, Object> e : map.entrySet()) {
      if (e.getValue() != null) {
        log.info("{},{},{}", e.getKey(), e.getValue(), e.getValue().getClass().toString());
      }
    }
    // 日志输出示例: page_cost,20.00,class java.math.BigDecimal
  }
}

2.2 查询并验证数据类型 ​

在 listType 方法中,通过查询数据库中一条记录并遍历其字段,可以验证字段 page_cost 的值和对应的数据类型。日志中将输出字段名、数据值以及数据的 Java 类型,验证存储到数据库中的数据类型为 java.math.BigDecimal。


3. 关键点解析 ​

  • 字符串转换

    • 将字符串 "20" 转换为 BigDecimal 非常简单,只需调用 new BigDecimal(amountStr)。这种转换确保了数据在存储过程中不会丢失精度,并符合金融数据的要求。
  • 数据库操作

    • 使用 EnvUtils 和 TioAdminDbConfiguration 完成环境加载与数据库连接配置。
    • 通过 Db.save 方法将构造好的 Row 对象保存到数据库中,此处 Row 对象中的 page_cost 字段正是存储转换后的 BigDecimal 对象。
  • 数据验证

    • 通过 Db.findFirst 查询记录,并将结果转换为 Map 后,遍历输出各字段的信息,验证 page_cost 的值为 20.00 且其 Java 类型为 java.math.BigDecimal。

4. 总结 ​

  • PostgreSQL 的 numeric 类型与 Java 的 BigDecimal 类型在高精度数据存储中具有天然的对应关系。
  • 当 Java 接收到字符串 "20" 时,通过 new BigDecimal("20") 进行转换,可以确保精度不丢失,并正确存储到数据库的 numeric 字段中。
  • 通过示例代码,可以清晰地看到数据的保存与查询过程,同时验证了存储数据类型的正确性。

希望本文档能帮助您深入理解 Java 与 PostgreSQL 之间在金融数据存储方面的数据类型映射以及具体实现方法。

MIT Licensed