Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系
【1】常见的映射关系表
常见的映射对应关系如下表所示:
Hibernate映射类型 | Java类型 | 标准SQL类型 | 字节大小 |
---|---|---|---|
integer/int | java.lang.Integer/int | INTEGER | 4Byte |
long | java.lang.Long/long | BIGINT | 8Byte |
short | java.lang.Short/short | SMALLINT | 2Byte |
byte | java.lang.Byte/byte | TINYINT | 1Byte |
float | java.lang.Float/float | FLOAT | 4Byte |
double | java.lang.Double/double | DOUBLE | 8Byte |
big_decimal | java.math.BigDecimal | NUMERIC | |
character | java.lang.Character/java.lang.String/char | CHAR | 定长字符 |
string | java.lang.String | VARCHAR | 变长字符 |
boolean/yes_no/true_false | java.lang.Boolean/boolean | BIT | 布尔类型 |
date | java.util.Date/java.sql.Date | DATE | 日期 |
time | java.util.Date/java.sql.Time | TIME | 时间 |
timestamp | java.util.Date/java.util.Timestamp | TIMESTAMP | 日期 |
calendar | java.util.Calendar | TIMESTAMP | 日期 |
calendar_dar | java.util.Calendar | DATE | 日期 |
binary | byte[] | BLOB | BLOB |
text | java.lang.String | CLOB | CLOB |
serializable | 实现java.io.Serializable接口的任意Java类 | BLOB | BLOB |
clob | java.sql.Clob | CLOB | CLOB |
blob | java.sql.Blob | BLOB | BLOB |
class | java.lang.Class | VARCHAR | 定长字符 |
locale | java.util.Locale | VARCHAR | 定长字符 |
timezone | java.util.TimeZone | VARCHAR | 定长字符 |
currency | java.util.Currency | VARCHAR | 定长字符 |
【2】Java时间和日期类型的Hibernate映射
在 Java 中, 代表时间和日期的类型包括: java.util.Date 和 java.util.Calendar。
此外, 在 JDBC API 中还提供了 3 个扩展了 java.util.Date 类的子类: java.sql.Date, java.sql.Time 和 java.sql.Timestamp, 这三个类分别和标准 SQL 类型中的 DATE, TIME 和 TIMESTAMP 类型对应。
因此在Java类中通常都将Date类型设置为java.util.Date。
在标准 SQL 中, DATE 类型表示日期, TIME 类型表示时间, TIMESTAMP 类型表示时间戳, 同时包含日期和时间信息。
映射类型 | Java类型 | 标准SQL类型 | 描述(java中表示) |
---|---|---|---|
date | java.util.Date/java.sql.Date | DATE | 日期:yyyy-MM-dd |
time | java.util.Date/java.sql.Time | TIME | 时间 :HH:mm:ss |
timestamp | java.util.Date/java.util.Timestamp | TIMESTAMP | 日期和时间:yyyy-MM-dd HH:mm:ss |
calendar | java.util.Calendar | TIMESTAMP | 同上 |
calendar_dar | java.util.Calendar | DATE | 日期:yyyy-MM-dd |
如何把java.util.Date映射为DATE , TIME和TIMESTAMP?
一个 Java 类型可能对应多个 Hibernate 映射类型。 例如: 如果持久化类的属性为 java.util.Date 类型, 对应的 Hibernate 映射类型可以是 date, time 或 timestamp。
此时可以根据对应的数据表的字段的 SQL 类型, 来确定 Hibernate 映射类型。
如果字段为 DATE 类型, 那么 Hibernate 映射类型为 date; 如果字段为 TIME 类型, 那么 Hibernate 映射类型为 time; 如果字段为 TIMESTATMP 类型, 那么 Hibernate 映射类型为 timestamp。
当然也可以在XML中显示指定Hibernate映射类型如下所示:
<property name="date" type="timestamp"><column name="DATE" default="null" /></property>
不同类型日期时间在Java中的表示
java.sql.Time和java.sql.Date如上表所示,格式为:
HH:mm:ss
yyyy-MM-dd
但是java.util.Date和java.sql.Timestamp就有些细节要注意了:
//数据库 datetime类型和timestamp类型
2018-10-05 16:13:46
2018-10-10 09:58:23//Java显示 java.util.Date和java.sql.Timestamp
date=2018-10-05 16:13:46.0
timestamp=2018-10-10 09:58:23.0
后面会多一个小数位秒,称之为纳秒,具体可以查看java.util.Date和java.sql.Timestamp源码。
尤其是如果数据库为date类型,Java对应接收类型为java.util.Date,就更有意思了:
//数据库 date类型
2018-10-05
// Java java.util.Date类型
date=2018-10-05 00:00:00.0
会自动给你补上00:00:00
!
参考博文:
MySQL中日期和时间格式化;
MyBatis中Java类型和JDBC类型映射。
【3】Java 大对象类型的 Hiberante 映射
① 几个概念
在 Java 中, java.lang.String 可用于表示长字符串(长度超过 255), 字节数组 byte[] 可用于存放图片或文件的二进制数据。
此外, 在 JDBC API 中还提供了 java.sql.Clob 和 java.sql.Blob 类型, 它们分别和标准 SQL 中的 CLOB 和 BLOB 类型对应。 CLOB 表示字符串大对象(Character Large Object), BLOB表示二进制对象(Binary Large Object)。
映射类型 | Java类型 | 标准SQL类型 | MySQL类型 | Oracle类型 |
---|---|---|---|---|
binary | byte[] | VARCHAR/BLOB | BLOB | BLOB |
text | java.lang.String | CLOB | TEXT | CLOB |
clob | java.sql.Clob | CLOB | TEXT | CLOB |
blob | java.sql.Blob | BLOB | BLOB | BLOB |
MySQL不支持标准 SQL 的 CLOB 类型, 在 MySQL 中, 用 TEXT, MEDIUMTEXT 及 LONGTEXT 类型来表示长度超过 255 的长文本数据。
在持久化类中, 二进制大对象可以声明为 byte[] 或 java.sql.Blob 类型; 字符串可以声明为 java.lang.String 或 java.sql.Clob。
实际上在 Java 应用程序中处理长度超过 255 的字符串, 使用 java.lang.String 比 java.sql.Clob 更方便。
② 实例测试
- 在pojo中添加blob属性字段:
public class News {private Integer id; //fieldprivate String title;private String author;private String describle;private Date date;//使用 title + "," + content 可以来描述当前的 News 记录. //即 title + "," + content 可以作为 News 的 describle 属性值//大文本private String content;private Blob picture;//...
}
- News.hbm.xml:
<property name="picture" type="java.sql.Blob"><column name="PICTURE" default="null" />
</property>
- 测试代码如下:
@Testpublic void testBlob() throws Exception{News news = new News();news.setAuthor("cc");news.setContent("CONTENT");news.setDate(new Date());news.setDescrible("DESC");news.setTitle("CC");InputStream stream = new FileInputStream("1.jpg");Blob image = Hibernate.getLobCreator(session).createBlob(stream, stream.available());news.setPicture(image);session.save(news);System.out.println(news);}
- 测试结果如下:
Hibernate: insert intoNEWS(TITLE, AUTHOR, DATE, CONTENT, PICTURE) values(?, ?, ?, ?, ?)
News [id=10, title=CC, author=cc, describle=DESC, date=Mon Oct 08 12:17:24 CST 2018,
content=CONTENT, picture=org.hibernate.engine.jdbc.BlobProxy@28c88600]
//注意,这里picture为Blob代理对象
- 数据表效果如下:
另外,若希望精确映射 SQL 类型, 可以使用 sql-type 属性:
<!-- 映射大对象 -->
<property name="content"><column name="CONTENT" sql-type="mediumtext"></column></property><property name="picture"><column name="PICTURE" sql-type="mediumblob"></column></property>
Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系相关推荐
- MySQL的时间戳2038年问题还有16年,最好在设计上的时候使用datetime就可以了,不要使用时间戳字段了,即使用了也不要用int类型进行映射,使用long类型映射即可
目录 前言 1,关于MySQL时间戳的2038年BUG 2,使用Docker创建MySQL 模拟下 3,总结 前言 本文的原文连接是: https://blog.csdn.net/freewebsys ...
- hibernate中java类的成员变量类型如何映射到SQL中的数据类型变化
hibernate映射文件??.hbm.xml配置映射元素详解--Hibernate映射类型 在从Hibernate的java的成员类型映射到SQL中的数据类型,其内映射方式它满足,SQL可以自己调制 ...
- mysql char类型c 映射_使用Hibernate原生SQL映射MYSQL的CHAR(n)类型到String时出错
数据库中有一个currencies表,表中有一个字段code,类型为CHAR(3),用于存放"CNY","USD"之类的字符串 与之对应的Java对象中的字段是 ...
- mysql映射超_Hibernate的映射类型 hibernate mysql映射类型
(转)http://blog.csdn.net/zxy_snow/article/details/7214222 Hibernate的映射类型 hibernate mysql映射类型 1.Hibern ...
- Hibernate的@Temporal注解处理时间日期类型的映射关系
@Temporal(TemporalType.DATE)public Date newDate; 指定 @Temporal value 属性,对应到数据库的映射关系为: 类型 mysql类型 值 Te ...
- Hibernate --- count(*) 调用 uniqueResult() 的返回值类型,hql --- Long,sql --- BigDecimal
1.使用的是 createQuery,用的 HQL,调用uniqueResult()方法返回的是 Long 类型: ((Long) getSession().createQuery( hql ).un ...
- Java程序员从笨鸟到菜鸟之(五十七)细谈Hibernate(八)Hibernate集合Map关系映射
对于hibernate中,集合属性在Hibernate的映射文件中是非常常见的,也是非常重要的内容,理解和熟练掌握常用的集合属性则显得更为重要.在hibernate的配置文件 ...
- java 不同类型 映射_如何使用Java泛型映射不同的值类型
java 不同类型 映射 有时,一般的开发人员会遇到这样的情况,即他必须在特定容器内映射任意类型的值. 但是,Java集合API仅提供与容器相关的参数化. 例如,这将HashMap的类型安全使用限制为 ...
- 如何使用Java泛型映射不同的值类型
有时,一般的开发人员会遇到这样的情况,即他必须在特定容器内映射任意类型的值. 但是,Java集合API仅提供与容器相关的参数化. 例如,这将HashMap的类型安全使用限制为单个值类型. 但是,如果您 ...
最新文章
- 彩色MT9V034摄像头 Bayer转rgb FPGA实现(转载)
- 【错误记录】Flutter 构建报错 ( Error: Method not found: ‘CupertinoModalPopupRoute‘. | 下载最新 Flutter SDK 版本 )
- qt 中如何播放声音(QSound)
- One order deletion tool
- Sqlite3中replace语句用法详解
- 初秋 · 外婆家的茶山 · 快乐的味道 2012年9月
- 3-7 DNA序列(DNA Consensus String, ACM/ICPC Seoul 2006, UVa1368)
- 靠谱测试人员需具备业务分析能力
- Win11 不支持移动任务栏位置;苹果将推出更大尺寸的 iPad Pro;iOS 15 更新 Beta2 版本|极客头条...
- Linux进阶之排错
- 服务器复制文件出现io错误,win10系统复制文件提示“由于io设备错误”的图文方案...
- 【PC】小米路由器Pro(R3P)升级/刷机
- django -- 过滤器
- 广州医保上线移动支付:暂只针对普通门诊
- 印象笔记Evernote 教程
- Strange Printer
- 多元线性回归推导过程
- python3黑帽编程_Python3.7 黑帽编程
- scsi设备驱动体系架构
- python线性方程组求解_python求解方程组的三种方法