- JDBC 驱动层(最底层、最核心的对应):这是 Java 程序通过 JDBC API 与 Oracle 数据库交互时,Java 数据类型和 Oracle SQL 数据类型之间的映射关系。
- ORM 框架层(如 JPA/Hibernate、MyBatis):这是在 JDBC 之上的抽象,它们会将 Java 语言类型(如
String,Integer,BigDecimal等)映射到 JDBC 类型,再最终映射到数据库类型。
JDBC 驱动层类型对应
这是最根本的对应关系,在 JDBC 中,数据库数据类型通过 java.sql.Types 枚举来表示。

| Oracle SQL 类型 | JDBC 类型 (java.sql.Types) |
Java 数据类型 (JDBC 方法) | 说明 |
|---|---|---|---|
VARCHAR2, NVARCHAR2 |
VARCHAR |
java.lang.String |
getString() / setString() |
CHAR, NCHAR |
CHAR |
java.lang.String |
getString() / setString() |
CLOB, NCLOB |
CLOB |
java.sql.Clob 或 java.lang.String |
getClob() / setClob(),对于 NCLOB,Oracle JDBC 驱动也将其映射为 CLOB,也可以直接读写大文本字符串,但 Clob 对象更规范。 |
BLOB |
BLOB |
java.sql.Blob |
getBlob() / setBlob(),用于存储二进制数据,如图片、文件等。 |
NUMBER(p, s) |
NUMERIC |
java.math.BigDecimal |
getBigDecimal() / setBigDecimal()。这是最精确、最推荐的方式,可以避免精度丢失。 |
NUMBER(p, 0) (整数) |
NUMERIC 或 INTEGER |
java.math.BigDecimal 或 java.lang.Long |
getBigDecimal() / setBigDecimal() 或 getLong() / setLong(),如果确定没有小数部分,可以使用 Long,但 BigDecimal 更安全。 |
NUMBER(10, -2) (如货币) |
NUMERIC |
java.math.BigDecimal |
强烈建议使用 BigDecimal 来处理货币,避免使用 double 或 float。 |
DATE |
DATE |
java.sql.Timestamp 或 java.sql.Date |
重要:Oracle 的 DATE 类型包含 日期和时间,JDBC 的 java.sql.Date 只包含日期部分,java.sql.Timestamp 包含日期和时间,通常使用 getTimestamp() / setTimestamp()。 |
TIMESTAMP |
TIMESTAMP |
java.sql.Timestamp |
getTimestamp() / setTimestamp(),包含年、月、日、时、分、秒、纳秒。 |
TIMESTAMP WITH TIME ZONE |
TIMESTAMP_WITH_TIMEZONE |
java.sql.Timestamp |
Oracle JDBC 驱动会自动处理时区转换,将其转换为 JVM 默认时区的 Timestamp。 |
TIMESTAMP WITH LOCAL TIME ZONE |
TIMESTAMP_WITH_TIMEZONE |
java.sql.Timestamp |
与上面类似,但存储的是本地时区的时间。 |
RAW |
BINARY |
byte[] |
getBytes() / setBytes(),用于存储二进制数据,但长度有限(最大 2000 字节)。 |
LONG RAW |
LONGVARBINARY |
byte[] |
getBytes() / setBytes(),用于存储更长的二进制数据(最大 2GB)。 |
FLOAT |
FLOAT |
java.lang.Double |
getDouble() / setDouble()。 |
BINARY_FLOAT |
REAL |
java.lang.Float |
getFloat() / setFloat()。 |
BINARY_DOUBLE |
DOUBLE |
java.lang.Double |
getDouble() / setDouble()。 |
ROWID |
ROWID |
java.lang.String |
getRowId() / setRowId() (JDBC 4.0+) 或直接作为 String 处理。 |
UROWID |
ROWID |
java.lang.String |
同上。 |
ORM 框架层类型对应
ORM 框架(如 JPA/Hibernate)简化了类型映射,通常直接使用 Java 语言类型。
JPA / Hibernate 实体属性类型
| Java 实体属性类型 | 对应的 Oracle SQL 类型 | 备注 |
|---|---|---|
java.lang.String |
VARCHAR2, CHAR, CLOB |
JPA 会根据 @Column 注解的 length 属性自动选择 VARCHAR2 或 CLOB。 |
java.lang.Integer, int |
NUMBER(10) |
JPA 默认为 NUMBER(10)。 |
java.lang.Long, long |
NUMBER(19) |
JPA 默认为 NUMBER(19)。 |
java.math.BigDecimal |
NUMBER(p, s) |
推荐用于精确数值。@Column 注解可以指定 precision 和 scale。 |
java.util.Date |
DATE, TIMESTAMP |
@Temporal 注解指定精度:TemporalType.DATE -> DATE, TemporalType.TIMESTAMP -> TIMESTAMP。 |
java.time.LocalDate |
DATE |
JPA 2.2+ 支持,对应 Oracle 的 DATE 类型(只存日期)。 |
java.time.LocalDateTime |
TIMESTAMP |
JPA 2.2+ 支持,对应 Oracle 的 TIMESTAMP 类型(存日期和时间)。 |
java.time.Instant |
TIMESTAMP WITH TIME ZONE |
JPA 2.2+ 支持,对应 Oracle 的 TIMESTAMP WITH TIME ZONE。 |
byte[] |
RAW, BLOB |
JPA 会根据 @Lob 注解和大小自动选择 RAW 或 BLOB。 |
java.sql.Blob |
BLOB |
用于处理大二进制对象。 |
java.sql.Clob |
CLOB |
用于处理大文本对象。 |
MyBatis 类型处理器 (TypeHandler)
MyBatis 使用 TypeHandler 来完成 Java 类型与 JDBC 类型的转换,默认提供了很多常用的 TypeHandler,你也可以自定义。
| Java 类型 | 默认 MyBatis TypeHandler |
对应的 Oracle SQL 类型 |
|---|---|---|
String |
StringTypeHandler |
VARCHAR2, CHAR, CLOB |
Integer, int |
IntegerTypeHandler |
NUMBER(10) |
Long, long |
LongTypeHandler |
NUMBER(19) |
BigDecimal |
BigDecimalTypeHandler |
NUMBER(p, s) |
Date |
DateTypeHandler |
DATE, TIMESTAMP |
java.util.Date |
DateOnlyTypeHandler (只处理日期) |
DATE |
java.sql.Timestamp |
TimestampTypeHandler |
TIMESTAMP |
byte[] |
ByteArrayTypeHandler |
RAW, BLOB |
最佳实践与注意事项
-
精确数值(尤其是货币):
- 永远不要使用
float或double来处理货币或需要精确计算的数值,因为它们是浮点数,存在精度问题。 - 始终使用
java.math.BigDecimal,这是处理财务和科学计算的标准,在数据库中也应使用NUMBER类型,并通过setBigDecimal()和getBigDecimal()来读写。
- 永远不要使用
-
日期时间处理:
(图片来源网络,侵删)- Oracle 的
DATE类型包含时间,如果你只需要日期,使用java.sql.Date;如果需要日期和时间,使用java.sql.Timestamp。 - 在现代 Java 应用中,优先使用
java.time包下的类(LocalDate,LocalDateTime,ZonedDateTime等),它们是线程安全的,API 更友好,JPA 2.2+ 和 MyBatis 3.5+ 都对它们提供了很好的支持。
- Oracle 的
-
大文本和二进制数据:
- 对于大文本(>4000 字节),使用
CLOB而不是VARCHAR2。 - 对于大二进制数据(>2000 字节),使用
BLOB而不是RAW。 - 在 JDBC 中,使用
Clob/Blob对象来流式处理大对象,避免内存溢出。
- 对于大文本(>4000 字节),使用
-
类型映射的一致性:
- 在整个项目中保持类型映射的一致性,一旦决定用
BigDecimal表示金额,那么所有相关的实体、DAO、Service 层都应使用BigDecimal。
- 在整个项目中保持类型映射的一致性,一旦决定用
总结表格(快速参考)
| Java / JDBC 类型 | 推荐的 Oracle SQL 类型 | 场景 |
|---|---|---|
String |
VARCHAR2(size) |
普通字符串、短文本 |
String (大文本) |
CLOB |
长文本、文章内容 |
Integer / Long |
NUMBER(10) / NUMBER(19) |
整数ID、计数器 |
BigDecimal |
NUMBER(p, s) |
价格、金额、税率等需要精确计算的数据 |
java.sql.Timestamp |
TIMESTAMP |
需要记录精确到秒的时间戳 |
java.sql.Date |
DATE |
只需要日期的场景(如生日) |
byte[] (小) |
RAW |
短二进制数据,如MD5哈希值 |
byte[] (大) |
BLOB |
图片、文件、大段二进制数据 |
希望这份详细的对应关系表能帮助你更好地进行 Java 和 Oracle 的数据交互开发!

