当前位置: 首页 > news >正文

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

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)BITjava.lang.Boolean
BIT( > 1) (new in MySQL-5.0)BITbyte[]
TINYINTTINYINTjava.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.
BOOLBOOLEANTINYINTSee 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)]FLOATjava.lang.Float
DOUBLE[(M,B)]DOUBLEjava.lang.Double
DECIMAL[(M[,D])]DECIMALjava.math.BigDecimal
DATEDATEjava.sql.Date
DATETIMEDATETIMEjava.sql.Timestamp
TIMESTAMP[(M)]TIMESTAMPjava.sql.Timestamp
TIMETIMEjava.sql.Time
YEAR[(2|4)]YEARIf 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)CHARjava.lang.String (unless the character set for the column is BINARY, then byte[] is returned.
VARCHAR(M) [BINARY]VARCHARjava.lang.String (unless the character set for the column is BINARY, then byte[] is returned.
BINARY(M)BINARYbyte[]
VARBINARY(M)VARBINARYbyte[]
TINYBLOBTINYBLOBbyte[]
TINYTEXTVARCHARjava.lang.String
BLOBBLOBbyte[]
TEXTVARCHARjava.lang.String
MEDIUMBLOBMEDIUMBLOBbyte[]
MEDIUMTEXTVARCHARjava.lang.String
LONGBLOBLONGBLOBbyte[]
LONGTEXTVARCHARjava.lang.String
ENUM('value1','value2',...)CHARjava.lang.String
SET('value1','value2',...)CHARjava.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 SETjava.lang.String, java.io.InputStream, java.io.Reader, java.sql.Blob, java.sql.Clob
FLOAT, REAL, DOUBLE PRECISION, NUMERIC, DECIMAL, TINYINT, SMALLINT, MEDIUMINT, INTEGER, BIGINTjava.lang.String, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Double, java.math.BigDecimal
DATE, TIME, DATETIME, TIMESTAMPjava.lang.String, java.sql.Date, java.sql.Timestamp

 4. 总结

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

参考:

  • Java, JDBC and MySQL Types
  • Java 数据类型和 MySql 数据类型对应一览表
  • Mybatis源代码分析之类型转换

转载于:https://www.cnblogs.com/waterystone/p/6226356.html

相关文章:

  • bzoj3894: 文理分科
  • javascript的对象
  • 西门子200实现远程监控和程序调试
  • 简单提高数据库查询效率的办法
  • 记录:CentOS7.2配置LNMP环境记录
  • FLASH遮挡DIV浮动层解决方案兼容IE FF Chrome
  • Linux虚拟机中配置JDK环境变量
  • 常用的集合
  • 中文输入法与React文本输入框的问题与解决方案
  • 树莓派:光阴的故事
  • [转]MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN
  • 追踪记录每笔业务操作数据改变的利器——SQLCDC
  • JS读书心得:《JavaScript框架设计》——第12章 异步处理
  • 2017-1-6基础
  • nodejs npm常用命令
  • 深入了解以太坊
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 345-反转字符串中的元音字母
  • canvas 五子棋游戏
  • DOM的那些事
  • express.js的介绍及使用
  • java多线程
  • JAVA多线程机制解析-volatilesynchronized
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • MySQL主从复制读写分离及奇怪的问题
  • PHP变量
  • Windows Containers 大冒险: 容器网络
  • 成为一名优秀的Developer的书单
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 从重复到重用
  • 当SetTimeout遇到了字符串
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 免费小说阅读小程序
  • 前端设计模式
  • 时间复杂度与空间复杂度分析
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # 飞书APP集成平台-数字化落地
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (11)MATLAB PCA+SVM 人脸识别
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (规划)24届春招和25届暑假实习路线准备规划
  • (一)appium-desktop定位元素原理
  • (转)jdk与jre的区别
  • (转)Sublime Text3配置Lua运行环境
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转)树状数组
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .“空心村”成因分析及解决对策122344