MySQL字段类型到JAVA类型的对应及转换

本文介绍了MySQL JDBC中各类数据类型的映射关系,包括MySQL数据类型到JDBC类型及Java类型的映射,并讨论了类型转换的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 概述

  在使用Java JDBC时,你是否有过这样的疑问:MySQL里的数据类型到底该选择哪种Java类型与之对应?本篇将为你揭开这个答案。

2. 类型映射

   java.sql.Types定义了常用数据库(MySQL、Oracle、DB2等)所用到的数据类型,官名也叫JDBC类型。每个数据库产品的数据类型定义各不相同,但都有JDBC类型与之对应,如MySQL的BIGINT-->JDBC的BIGINT。

  而每个JDBC类型,都有默认的Java类型与之对应,即ResultSet.getObject()返回Object的具体类型,如JDBC的BIGINT-->Java的java.lang.Long;JDBC的BIGINT UNSIGNED-->Java的 java.math.BigInteger。

  我们可以通过ResultSet.getMetaData().getColumnTypeName(columnIndex)获取字段的JDBC类型,通过ResultSet.getMetaData().getColumnClassName(columnIndex)获取字段的Java类型。

  下图展示了MySQL类型类型、JDBC类型、Java类型的映射关系(源自:5.3 Java, JDBC and MySQL Types)。

MySQL数据类型 JDBC类型(getColumnTypeName) 默认返回的Java类型(getColumnClassName)
BIT(1) (new in MySQL-5.0) BIT java.lang.Boolean
BIT( > 1) (new in MySQL-5.0) BIT byte[]
TINYINT TINYINT java.lang.Boolean if the configuration property tinyInt1isBit is set to true (the default) and the storage size is 1, or java.lang.Integer if not.
BOOLBOOLEAN TINYINT See TINYINT, above as these are aliases for TINYINT(1), currently.
SMALLINT[(M)] [UNSIGNED] SMALLINT [UNSIGNED] java.lang.Integer (regardless of whether it is UNSIGNED or not)
MEDIUMINT[(M)] [UNSIGNED] MEDIUMINT [UNSIGNED] java.lang.Integer (regardless of whether it is UNSIGNED or not)
INT,INTEGER[(M)] [UNSIGNED] INTEGER [UNSIGNED] java.lang.Integer, if UNSIGNED java.lang.Long
BIGINT[(M)] [UNSIGNED] BIGINT [UNSIGNED] java.lang.Long, if UNSIGNED java.math.BigInteger
FLOAT[(M,D)] FLOAT java.lang.Float
DOUBLE[(M,B)] DOUBLE java.lang.Double
DECIMAL[(M[,D])] DECIMAL java.math.BigDecimal
DATE DATE java.sql.Date
DATETIME DATETIME java.sql.Timestamp
TIMESTAMP[(M)] TIMESTAMP java.sql.Timestamp
TIME TIME java.sql.Time
YEAR[(2|4)] YEAR If yearIsDateType configuration property is set to false, then the returned object type is java.sql.Short. If set to true (the default), then the returned object is of type java.sql.Datewith the date set to January 1st, at midnight.
CHAR(M) CHAR java.lang.String (unless the character set for the column is BINARY, then byte[] is returned.
VARCHAR(M) [BINARY] VARCHAR java.lang.String (unless the character set for the column is BINARY, then byte[] is returned.
BINARY(M) BINARY byte[]
VARBINARY(M) VARBINARY byte[]
TINYBLOB TINYBLOB byte[]
TINYTEXT VARCHAR java.lang.String
BLOB BLOB byte[]
TEXT VARCHAR java.lang.String
MEDIUMBLOB MEDIUMBLOB byte[]
MEDIUMTEXT VARCHAR java.lang.String
LONGBLOB LONGBLOB byte[]
LONGTEXT VARCHAR java.lang.String
ENUM('value1','value2',...) CHAR java.lang.String
SET('value1','value2',...) CHAR java.lang.String

 

3. 类型转换

  上面我们看到MySQL的BIGINT默认转为Java的java.lang.Long,那是不是就不能转为String或其他数值类型了?答案是否定的!MySQL的JDBC(Connector/J)在字段类型与Java类型之间的转换是比较灵活的。一般来说,任何字段类型都可以转换为java.lang.String,任何数值字段类型都可以转换为Java的数据类型(当然会出现四舍五入、溢出、精度丢失的问题)。

  下图展示了MySQL JDBC允许的跨类型相互转换。 

MySQL数据类型 可以被转换的Java类型
CHAR, VARCHAR, BLOB, TEXT, ENUM, and SET java.lang.String, java.io.InputStream, java.io.Reader, java.sql.Blob, java.sql.Clob
FLOAT, REAL, DOUBLE PRECISION, NUMERIC, DECIMAL, TINYINT, SMALLINT, MEDIUMINT, INTEGER, BIGINT java.lang.String, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Double, java.math.BigDecimal
DATE, TIME, DATETIME, TIMESTAMP java.lang.String, java.sql.Date, java.sql.Timestamp

 4. 总结

  MySQL JDBC对每种字段类型,都有相应的Java类型与之对应,也可以转换为其他Java类型。但这种转换还不够灵活,如TIMESTAMP与java.util.Date就转换不了,只能人工转换。这里推荐使用MyBatis,它内置了许多TypeHander,支持各种基础数据类型间的转换(xxxTypeHandler),也支持自定义数据类型转换。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

### MySQL字段类型Java数据类型的映射 在开发基于Java的应用程序并与MySQL数据库交互时,理解两者间的数据类型映射至关重要。这不仅有助于提高编码效率,还能减少因类型不匹配引发的问题。 #### 基本数值类型映射 对于整数类别的映射如下: - `TINYINT` 对应Java 中的 `Byte` 或者 `byte` 类型[^1]。 - `SMALLINT` 映射至 `Short` 或 `short` [^1]。 - `INT`, 通常被映射成 `Integer` 或 `int` 。 - 更大范围的整数则由 `BIGINT` 表达,在Java里推荐使用 `Long` 或 `long` 来表示以覆盖其全部取值区间。 浮点数方面有: - `FLOAT` 和 `DOUBLE` 分别对应Java 的 `Float` 及 `Double` 数据类型。 布尔逻辑值通过以下方式处理: - `BOOLEAN` 被认为是 `Boolean` (注意大小写敏感),尽管实际上 MySQL 存储的是 TINYINT(1)[^2]。 字符序列可以按需选用不同的容器: - 单个字符适用 `Char`;字符串常量或变量长度较短的文字串适合采用 `String` 进行封装; - 针对可变长文本内容,则建议利用 `VARCHAR` 并将其关联到 Java 的 `String` 上[^3]。 日期时间戳管理上存在多种选择: - `DATE` 应该映射给 java.util.Date 或者 LocalDate(如果应用 JDK8+ 特性)[^4]。 - 时间单位单独记录可用 `Time` ,它同样继承自 java.sql.Time。 - 组合形式的时间标记如 `DATETIME` / `TIMESTAMP` 宜选取 Timestamp 或 LocalDateTime 结构来承载。 二进制大数据集支持: - 大对象存储可通过 BLOB/CLOB 实现,分别对应于 byte[]/InputStream (BLOB),以及 String/Reader (CLOB)。这些结构允许高效读取和保存大量非结构化资料。 精确度高的算术运算需求场合下: - 当涉及到高精度计算场景时,应当考虑将 DECIMAL/FIXED 类型映射为 BigDecimal,从而确保不会丢失任何有效位数。 ```java // 示例代码片段展示部分常见的类型转换方法 public class TypeMappingExample { public static void main(String args[]) throws SQLException{ Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { // 获取连接... // 创建PreparedStatement并执行查询语句... while(rs.next()){ Byte tinyIntValue = rs.getByte("tiny_int_column"); Short smallintValue = rs.getShort("smallint_column"); Integer intValue = rs.getInt("int_column"); Long bigIntValue = rs.getLong("bigint_column"); Float floatValue = rs.getFloat("float_column"); Double doubleValue = rs.getDouble("double_column"); Boolean booleanValue = rs.getBoolean("boolean_column"); String charValue = Character.toString(rs.getString("char_column").charAt(0)); String stringValue = rs.getString("varchar_column"); Date dateValue = rs.getDate("date_column"); Time timeValue = rs.getTime("time_column"); Timestamp timestampValue = rs.getTimestamp("datetime_column"); InputStream blobStream = rs.getBinaryStream("blob_column"); Reader clobReader = rs.getCharacterStream("clob_column"); BigDecimal decimalValue = rs.getBigDecimal("decimal_column"); System.out.println(tinyIntValue); // 打印其他获取的结果... } } finally { if(conn != null && !conn.isClosed()) { /* 关闭资源 */ } if(pstmt != null) {/* ... */} if(rs != null) {/* ... */} } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值