Postgresql 金融类型
在金融系统中,PostgreSQL 通常使用 numeric 类型来存储高精度的数值数据,而在 Java 中推荐使用 java.math.BigDecimal 类来处理这类数据。本文将以一个具体的示例说明如何将 Java 中接收到的字符串 "20"
转换为 BigDecimal
对象,并存储到数据库中字段类型为 numeric 的表中,同时展示如何查询并验证存储的数据类型。
1. 数据类型映射关系
PostgreSQL 数据库
- numeric:用于存储高精度的金融数据,能够精确表示大数和小数,适合需要高精度计算的场景。
Java 数据类型
- java.math.BigDecimal:用于高精度数值计算的类,能精确表示和计算十进制数据,非常适合金融类数据的处理和存储。
2. 示例代码说明
下面提供的示例代码包含两个部分:
2.1 保存数据
该示例代码展示了如何:
- 通过
EnvUtils
加载环境配置并建立数据库连接。 - 模拟接收到字符串
"20"
后,将其转换为BigDecimal
对象。 - 构造
Row
对象(通过自动生成的 ID 和转换后的数值)并保存到表website_page_params
的字段page_cost
中。
package com.litongjava.website.config;
import java.math.BigDecimal;
import java.util.Map;
import org.junit.Test;
import com.litongjava.db.activerecord.Db;
import com.litongjava.db.activerecord.Row;
import com.litongjava.tio.boot.admin.config.TioAdminDbConfiguration;
import com.litongjava.tio.utils.environment.EnvUtils;
import com.litongjava.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 之间在金融数据存储方面的数据类型映射以及具体实现方法。