跳到主要内容

类型支持

下表给出常用字段的 Java 属性类型建议;可空字段使用包装类型。Java/JDBC 类型见 Java/JDBC 类型关系;枚举见枚举映射

类型映射

数据库字段类型Java 类型说明
TINYINTByte覆盖此有符号整数类型的范围。
SMALLINTShort覆盖此有符号整数类型的范围。
INTInteger覆盖此有符号整数类型的范围。
BIGINTLong覆盖此有符号整数类型的范围。
REALFloat近似数值;不用于要求十进制精确计算的金额。
DOUBLEDouble近似数值;不用于要求十进制精确计算的金额。
DECIMAL(10, 2)BigDecimal保留十进制数值;写入受列精度与小数位限制。
NUMERIC(20)BigInteger / BigDecimal无小数的整数业务可用 BigInteger;统一十进制模型可用 BigDecimal。
BITBoolean使用布尔语义,不作为普通整数属性。
BOOLEANBoolean使用布尔语义,不作为普通整数属性。
CHAR(1)String文本内容;字符长度由列定义约束。
VARCHAR(255)String文本内容;字符长度由列定义约束。
NVARCHAR(255)String文本内容;字符长度由列定义约束。
VARBINARY(1000)byte[]二进制内容;不经字符编码转换。
BLOBbyte[]二进制内容;不经字符编码转换。
DATEjava.sql.Date仅日期;不用于保留完整时间戳。
TIMEjava.sql.Time仅时间;文本存储时须使用可解析的时间格式。
TIMESTAMPjava.sql.Timestamp保留日期和时间,精度以数据库列定义为准。
VARCHAR(2000)Map / List / Bean保存 JSON 文本时,实体属性配置见JSON 字段映射
INT ARRAYInteger[]数组元素与数据库元素类型一致,按需显式配置处理器。
VARCHAR ARRAYString[]数组元素与数据库元素类型一致,按需显式配置处理器。
REAL ARRAYFloat[]数组元素与数据库元素类型一致,按需显式配置处理器。

数组类型

CREATE TABLE array_example (id INTEGER PRIMARY KEY, values_col INTEGER ARRAY);
import java.sql.Types;
import net.hasor.dbvisitor.types.SqlArg;
import net.hasor.dbvisitor.types.handler.array.ArrayTypeHandler;

Integer[] values = { 10, 20, 30 };
jdbcTemplate.executeUpdate("INSERT INTO array_example (id, values_col) VALUES (?, ?)",
new Object[] { 1, new SqlArg(values, Types.ARRAY, new ArrayTypeHandler()) });
Integer[] loaded = jdbcTemplate.queryForObject(
"SELECT values_col FROM array_example WHERE id = ?",
new Object[] { 1 }, Integer[].class);

时间类型:历史日期

使用 H2 JDBC 2.2.224,且 JVM 时区为 Asia/Shanghai 时,将 1900-01-01 读为 java.sql.Date 可能得到 1899-12-31。数据库保存的日期没有改变,偏移发生在 JDBC 日期转换中。

这类历史日期使用 JDBC 的类型化读取,避免经过 java.sql.Date

import java.time.LocalDate;

LocalDate date = jdbcTemplate.queryForObject(
"SELECT DATE '1900-01-01'",
(rs, rowNum) -> rs.getObject(1, LocalDate.class));
// date 为 1900-01-01

使用限制

  • TIMESTAMP 不保留时区;时间精度以字段定义和 JDBC 驱动实际返回值为准。