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类型的对应及转换相关推荐

  1. Java JDBC中,MySQL字段类型到JAVA类型的转换

    转载自:https://www.cnblogs.com/waterystone/p/6226356.html 1. 概述 在使用Java JDBC时,你是否有过这样的疑问:MySQL里的数据类型到底该 ...

  2. 总结java数据类型和mysql、oracle、pgsql数据类型对应关系,附数据库字段类型转java类型代码

    java的基本数据类型有八种: byte.short.int.long.float.double.char.boolean 总结java和mysql.oracle.pgsql数据类型对应关系 java ...

  3. 数据库字段类型、JDBC类型、Java类型映射关系

    数据库字段类型:指的就是数据库字段设置的类型. JDBC类型:java database connector的缩写. 不同的数据库为了能让Java 程序链接并使用数据库, 各个数据库厂商自己提供的驱动 ...

  4. java和jdbc对应关系,JDBC类型与JAVA类型对应关系

    最近在做代码生成工具,通过数据库表生成代码半成品,其中就有JDBC类型与JAVA类型对应的问题. 我的做法看看别人是怎么对应的,JDBC驱动里面一定有,我们就postgresql数据,通过搜索解压后的 ...

  5. MYSQL类型与JAVA类型对应表

    类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) VARCHAR L+N VARCHAR java.lang.String 12 CHAR N CHAR java.lang.S ...

  6. java b 类型_什么类型的Java类型是“[B”?

    我试图通过Java代码(Hibernate)从MySQL DB获取MD5加密传递.但我不能得到字符串或任何合理的Java类型. 我唯一得到的是这个无益的信息: java.lang.ClassCastE ...

  7. Mybatis:数据库的类型与java类型对应

                                   Mybatis与数据库的类型对应 1:Java数据类型与MySql数据类型对照表 类型名称 显示长度 数据库类型 JAVA类型 JDBC类 ...

  8. 数据库类型与Java类型对照表

    数据库类型 Java类型 JDBC类型索引(int) tinyint java.lang.Integer -6 bigint java.math.BigInteger -5 blob longblob ...

  9. mysql字段是自动增长类型结果却不是连续的

    今天建了一张表,设置其"id"属性为自动增加类型,但是在查看所有数据的时候,却发现"id"的值不是连续增加的.建表的语法如下: mysql> create ...

最新文章

  1. 如何使用 UserAccountControl 标志操纵用户帐户属性
  2. 07- Firmware Update (FWU)
  3. SpringMVC +Hibernate 学习实例
  4. 方立勋_30天掌握JavaWeb_数据库表设计
  5. 卷积神经网络的结构_射击训练:卷积神经网络识别解剖结构标志位点
  6. [css] 说说响应式设计(responsive design)和自适应设计(adaptive design)的区别?
  7. Android开发实现HttpClient工具类
  8. UltraEdit v17.10.0,注册机,注册码
  9. 信息安全系统设计基础实验二:固件设计
  10. 关于opencv标定的一些疑问,首先声明这篇文章转载于纸异兽,由于暂时联系不到他本人,只好请教各位了。有些问题想请教,各位大神可以留下联系方式帮我解决,万分感谢...
  11. 小型数控雕刻机制作Arduino_微型CNC制作基于开源项目GRBL
  12. 图像处理之常见二值化方法汇总
  13. CRC校验关键点说明(内附C语言CRC校验库)
  14. 2022-07微软漏洞通告
  15. 货郎问题java_动态规划----货郎担问题
  16. tns:无监听 解决之一:由于 linstener.log 贮存过满导致
  17. 「Python开发者」公号招内容编辑
  18. ios Mac下的SVN工具:Cornerstone与Versions和使用subversion管理iOS源代码
  19. 阿里云服务器被检测到有wa kuang程序
  20. aaa服务器显示认证失败,华为aaa认证案例-电信华为机顶盒50%通路故障或AAA认证失败怎么回...

热门文章

  1. R语言epiDisplay包的kap函数计算Kappa统计量的值(总一致性、期望一致性)、对多个评分对象的结果进行一致性分析、评分的类别为多个类别、如果评分中包含缺失值则标准误及其相关统计量则无法计算
  2. 网络设置及其修改配置文件全程实操,可跟做
  3. Python数据攻略-Pandas数据可视化
  4. python现状与背景
  5. 本草纲目pdf彩图版下载_实用本草纲目彩色图鉴彩图版
  6. weui-master中的lrz实现移动端图片文件压缩(参:localResizeIMG4)
  7. idea配置数据库之后schema内没有表数据
  8. 如何实现 Paypal 取现?
  9. 风控模型中特征重要度的两种筛选方法
  10. Fiddler 网页采集抓包利器__手机app抓包