在 JDBC 中,
jdbcType
用于指定数据库字段的数据类型,确保 Java 类型与数据库类型正确映射。MyBatis 等持久层框架常使用 jdbcType
处理参数和结果集的类型转换。以下是常见的 jdbcType
类型及其说明:JDBC 类型 | 对应 Java 类型 | 说明 | 常见数据库映射示例 |
---|---|---|---|
ARRAY |
java.sql.Array |
数据库数组类型 | PostgreSQL 的 ARRAY |
BIGINT |
Long |
长整数类型(8 字节) | MySQL 的 BIGINT 、Oracle 的 NUMBER(19) |
BINARY |
byte[] |
二进制数据(定长) | MySQL 的 BINARY |
BIT |
Boolean |
位类型(1 位) | MySQL 的 BIT |
BLOB |
byte[] 、Blob |
二进制大对象(存储大量二进制数据) | MySQL 的 BLOB 、Oracle 的 BLOB |
BOOLEAN |
Boolean |
布尔类型 | PostgreSQL 的 BOOLEAN |
CHAR |
String |
字符类型(定长) | MySQL 的 CHAR |
CLOB |
String 、Clob |
字符大对象(存储大量文本) | MySQL 的 TEXT 、Oracle 的 CLOB |
DATE |
java.sql.Date |
日期类型(仅包含年月日) | MySQL 的 DATE |
DECIMAL |
BigDecimal |
精确小数类型(可指定精度) | MySQL 的 DECIMAL 、Oracle 的 NUMBER(p,s) |
DOUBLE |
Double |
双精度浮点数(8 字节) | MySQL 的 DOUBLE |
FLOAT |
Float |
单精度浮点数(4 字节) | MySQL 的 FLOAT |
INTEGER |
Integer |
整数类型(4 字节) | MySQL 的 INT 、Oracle 的 NUMBER(10) |
JAVA_OBJECT |
任意 Java 对象 | 自定义 Java 对象类型 | 数据库自定义类型映射 |
LONGNVARCHAR |
String |
长 Unicode 字符串(不定长) | Oracle 的 NVARCHAR2 (大长度) |
LONGVARCHAR |
String |
长字符串(不定长) | MySQL 的 LONGTEXT |
NCHAR |
String |
Unicode 字符类型(定长) | Oracle 的 NCHAR |
NCLOB |
String 、NClob |
Unicode 字符大对象 | Oracle 的 NCLOB |
NVARCHAR |
String |
Unicode 字符串(不定长) | Oracle 的 NVARCHAR2 |
NULL |
无 | 空类型 | 表示字段值为 NULL |
NUMERIC |
BigDecimal |
精确数字类型(与 DECIMAL 类似) |
多数数据库的 NUMERIC |
OTHER |
任意类型 | 未被标准定义的数据库特有类型 | 如 MySQL 的 ENUM 、SET |
REAL |
Float |
单精度浮点数(数据库特定精度) | Oracle 的 REAL |
REF |
java.sql.Ref |
数据库引用类型(指向其他行的指针) | Oracle 的 REF 类型 |
ROWID |
String |
数据库行标识(如 Oracle 的物理地址) | Oracle 的 ROWID |
SMALLINT |
Short |
短整数类型(2 字节) | MySQL 的 SMALLINT |
SQLXML |
java.sql.SQLXML |
XML 数据类型 | 支持 XML 的数据库(如 SQL Server) |
STRUCT |
java.sql.Struct |
数据库结构类型(复合类型) | Oracle 的 OBJECT 类型 |
TIME |
java.sql.Time |
时间类型(仅包含时分秒) | MySQL 的 TIME |
TIMESTAMP |
java.sql.Timestamp |
时间戳类型(包含年月日时分秒毫秒) | MySQL 的 DATETIME 、TIMESTAMP |
TINYINT |
Byte |
微整数类型(1 字节) | MySQL 的 TINYINT |
VARBINARY |
byte[] |
二进制数据(不定长) | MySQL 的 VARBINARY |
VARCHAR |
String |
字符串类型(不定长) | MySQL 的 VARCHAR |
注意事项:
- 数据库兼容性:不同数据库对类型的支持可能有差异(如
BOOLEAN
在 MySQL 中常用TINYINT
模拟)。 - MyBatis 中使用:在 XML 映射文件中指定参数类型时需用
jdbcType
,例如:xml<insert id="insertUser">INSERT INTO user(name, age) VALUES(#{name, jdbcType=VARCHAR},#{age, jdbcType=INTEGER}) </insert>
- 避免类型不匹配:若 Java 类型与数据库类型差异较大(如用
String
接收BIGINT
),需显式指定jdbcType
确保转换正确。
正确使用
jdbcType
可减少类型转换错误,尤其在处理 NULL
值或数据库特有类型时更为重要。jdbcType 类型 java 类型
以下是 JDBC 类型(
jdbcType
)与对应的 Java 类型的详细映射关系,这在 MyBatis 等持久层框架中处理参数绑定和结果集映射时非常重要:JDBC 类型(jdbcType) | 对应的 Java 类型 | 说明与使用场景 |
---|---|---|
ARRAY |
java.sql.Array |
用于数据库数组类型(如 PostgreSQL 的 ARRAY ),较少直接使用 |
BIGINT |
Long |
8 字节长整数,对应数据库的 BIGINT 类型 |
BINARY |
byte[] |
定长二进制数据,如数据库的 BINARY 类型 |
BIT |
Boolean 、byte[] |
位类型,长度为 1 时映射 Boolean ,长度 > 1 时映射 byte[] |
BLOB |
byte[] 、java.sql.Blob |
二进制大对象,存储图片、文件等二进制数据 |
BOOLEAN |
Boolean |
布尔类型(true/false),部分数据库用 TINYINT(1) 模拟 |
CHAR |
String |
定长字符串,对应数据库 CHAR 类型 |
CLOB |
String 、java.sql.Clob |
字符大对象,存储长文本(如文章内容) |
DATE |
java.sql.Date |
仅包含年月日的日期类型(注意:与 java.util.Date 不同) |
DECIMAL |
java.math.BigDecimal |
高精度小数(可指定精度和小数位),适合金额等精确计算场景 |
DOUBLE |
Double |
8 字节双精度浮点数 |
FLOAT |
Float |
4 字节单精度浮点数 |
INTEGER |
Integer |
4 字节整数,对应数据库 INT 类型 |
JAVA_OBJECT |
任意自定义 Java 对象 | 用于数据库自定义类型与 Java 对象的映射 |
LONGNVARCHAR |
String |
长 Unicode 字符串(不定长) |
LONGVARCHAR |
String |
长字符串(不定长),如数据库 LONGTEXT 类型 |
NCHAR |
String |
定长 Unicode 字符串,支持多语言 |
NCLOB |
String 、java.sql.NClob |
Unicode 字符大对象,支持多语言长文本 |
NVARCHAR |
String |
不定长 Unicode 字符串,如 Oracle 的 NVARCHAR2 |
NULL |
无(通常用 null 表示) |
表示字段值为 NULL |
NUMERIC |
java.math.BigDecimal |
与 DECIMAL 类似,高精度数字类型 |
OTHER |
任意类型 | 数据库特有类型(如 MySQL 的 ENUM 、SET ) |
REAL |
Float |
数据库特定精度的单精度浮点数 |
SMALLINT |
Short |
2 字节短整数,对应数据库 SMALLINT 类型 |
SQLXML |
java.sql.SQLXML |
存储 XML 数据的类型 |
TIME |
java.sql.Time |
仅包含时分秒的时间类型 |
TIMESTAMP |
java.sql.Timestamp |
包含年月日时分秒毫秒的时间戳类型,对应数据库 DATETIME 、TIMESTAMP 等 |
TINYINT |
Byte |
1 字节微整数,如 MySQL 的 TINYINT (常用来表示状态值) |
VARBINARY |
byte[] |
不定长二进制数据,如数据库 VARBINARY 类型 |
VARCHAR |
String |
不定长字符串,最常用的字符串类型(如数据库 VARCHAR ) |
注意事项:
-
时间类型区分:
java.sql.Date
仅含日期(年月日)java.sql.Time
仅含时间(时分秒)java.sql.Timestamp
含完整时间戳(年月日时分秒毫秒)- 实际开发中常转换为
java.time.LocalDate
、LocalTime
、LocalDateTime
(Java 8+ 推荐)
-
MyBatis 中的使用:
当 Java 类型与数据库类型可能存在歧义时,需显式指定jdbcType
:xml<select id="getUser" resultType="User">SELECT * FROM user WHERE name = #{name, jdbcType=VARCHAR} AND balance = #{balance, jdbcType=DECIMAL} </select>
-
null 值处理:
对于可能为null
的参数,建议指定jdbcType
避免类型推断错误:xml#{param, jdbcType=INTEGER} <!-- 当 param 为 null 时,明确类型为 INTEGER -->
正确理解 JDBC 类型与 Java 类型的映射关系,能有效避免类型转换错误,尤其在处理复杂数据类型(如大对象、时间类型)时更为重要。