【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 类型之间的对应关系相关推荐

  1. MySQL的时间戳2038年问题还有16年,最好在设计上的时候使用datetime就可以了,不要使用时间戳字段了,即使用了也不要用int类型进行映射,使用long类型映射即可

    目录 前言 1,关于MySQL时间戳的2038年BUG 2,使用Docker创建MySQL 模拟下 3,总结 前言 本文的原文连接是: https://blog.csdn.net/freewebsys ...

  2. hibernate中java类的成员变量类型如何映射到SQL中的数据类型变化

    hibernate映射文件??.hbm.xml配置映射元素详解--Hibernate映射类型 在从Hibernate的java的成员类型映射到SQL中的数据类型,其内映射方式它满足,SQL可以自己调制 ...

  3. mysql char类型c 映射_使用Hibernate原生SQL映射MYSQL的CHAR(n)类型到String时出错

    数据库中有一个currencies表,表中有一个字段code,类型为CHAR(3),用于存放"CNY","USD"之类的字符串 与之对应的Java对象中的字段是 ...

  4. mysql映射超_Hibernate的映射类型 hibernate mysql映射类型

    (转)http://blog.csdn.net/zxy_snow/article/details/7214222 Hibernate的映射类型 hibernate mysql映射类型 1.Hibern ...

  5. Hibernate的@Temporal注解处理时间日期类型的映射关系

    @Temporal(TemporalType.DATE)public Date newDate; 指定 @Temporal value 属性,对应到数据库的映射关系为: 类型 mysql类型 值 Te ...

  6. Hibernate --- count(*) 调用 uniqueResult() 的返回值类型,hql --- Long,sql --- BigDecimal

    1.使用的是 createQuery,用的 HQL,调用uniqueResult()方法返回的是 Long 类型: ((Long) getSession().createQuery( hql ).un ...

  7. Java程序员从笨鸟到菜鸟之(五十七)细谈Hibernate(八)Hibernate集合Map关系映射

                 对于hibernate中,集合属性在Hibernate的映射文件中是非常常见的,也是非常重要的内容,理解和熟练掌握常用的集合属性则显得更为重要.在hibernate的配置文件 ...

  8. java 不同类型 映射_如何使用Java泛型映射不同的值类型

    java 不同类型 映射 有时,一般的开发人员会遇到这样的情况,即他必须在特定容器内映射任意类型的值. 但是,Java集合API仅提供与容器相关的参数化. 例如,这将HashMap的类型安全使用限制为 ...

  9. 如何使用Java泛型映射不同的值类型

    有时,一般的开发人员会遇到这样的情况,即他必须在特定容器内映射任意类型的值. 但是,Java集合API仅提供与容器相关的参数化. 例如,这将HashMap的类型安全使用限制为单个值类型. 但是,如果您 ...

最新文章

  1. 彩色MT9V034摄像头 Bayer转rgb FPGA实现(转载)
  2. 【错误记录】Flutter 构建报错 ( Error: Method not found: ‘CupertinoModalPopupRoute‘. | 下载最新 Flutter SDK 版本 )
  3. qt 中如何播放声音(QSound)
  4. One order deletion tool
  5. Sqlite3中replace语句用法详解
  6. 初秋 · 外婆家的茶山 · 快乐的味道 2012年9月
  7. 3-7 DNA序列(DNA Consensus String, ACM/ICPC Seoul 2006, UVa1368)
  8. 靠谱测试人员需具备业务分析能力
  9. Win11 不支持移动任务栏位置;苹果将推出更大尺寸的 iPad Pro;iOS 15 更新 Beta2 版本|极客头条...
  10. Linux进阶之排错
  11. 服务器复制文件出现io错误,win10系统复制文件提示“由于io设备错误”的图文方案...
  12. 【PC】小米路由器Pro(R3P)升级/刷机
  13. django -- 过滤器
  14. 广州医保上线移动支付:暂只针对普通门诊
  15. 印象笔记Evernote 教程
  16. Strange Printer
  17. 多元线性回归推导过程
  18. python3黑帽编程_Python3.7 黑帽编程
  19. scsi设备驱动体系架构
  20. python线性方程组求解_python求解方程组的三种方法

热门文章

  1. 东大22春政治学概论X《政治学概论》在线平时作业2_100分满分非答案
  2. MATLAB运用——多项式插值
  3. 03基础自绘-18手机通讯录-telwidget
  4. win10更新后office2016图标显示空白
  5. 使用GridSearchCV对CatBoostClassifier分类器调参
  6. 难忘的童年~~~~~~真的好怀念!
  7. echarts柱状图自定义显示内容
  8. IE中直接访问html,????? help!在IE中用Applet如何访问所在的HTML吗?
  9. 高校学生信息管理系统
  10. Nginx安装配置及使用方法