Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系

【1】常见的映射关系表

常见的映射对应关系如下表所示:

Hibernate映射类型Java类型标准SQL类型字节大小
integer/intjava.lang.Integer/intINTEGER4Byte
longjava.lang.Long/longBIGINT8Byte
shortjava.lang.Short/shortSMALLINT2Byte
bytejava.lang.Byte/byteTINYINT1Byte
floatjava.lang.Float/floatFLOAT4Byte
doublejava.lang.Double/doubleDOUBLE8Byte
big_decimaljava.math.BigDecimalNUMERIC
characterjava.lang.Character/java.lang.String/charCHAR定长字符
stringjava.lang.StringVARCHAR变长字符
boolean/yes_no/true_falsejava.lang.Boolean/booleanBIT布尔类型
datejava.util.Date/java.sql.DateDATE日期
timejava.util.Date/java.sql.TimeTIME时间
timestampjava.util.Date/java.util.TimestampTIMESTAMP日期
calendarjava.util.CalendarTIMESTAMP日期
calendar_darjava.util.CalendarDATE日期
binarybyte[]BLOBBLOB
textjava.lang.StringCLOBCLOB
serializable实现java.io.Serializable接口的任意Java类BLOBBLOB
clobjava.sql.ClobCLOBCLOB
blobjava.sql.BlobBLOBBLOB
classjava.lang.ClassVARCHAR定长字符
localejava.util.LocaleVARCHAR定长字符
timezonejava.util.TimeZoneVARCHAR定长字符
currencyjava.util.CurrencyVARCHAR定长字符

【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中表示)
datejava.util.Date/java.sql.DateDATE日期:yyyy-MM-dd
timejava.util.Date/java.sql.TimeTIME时间 :HH:mm:ss
timestampjava.util.Date/java.util.TimestampTIMESTAMP日期和时间:yyyy-MM-dd HH:mm:ss
calendarjava.util.CalendarTIMESTAMP同上
calendar_darjava.util.CalendarDATE日期: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类型
binarybyte[]VARCHAR/BLOBBLOBBLOB
textjava.lang.StringCLOBTEXTCLOB
clobjava.sql.ClobCLOBTEXTCLOB
blobjava.sql.BlobBLOBBLOBBLOB

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; //field
	private 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>
  • 测试代码如下:
	@Test
	public 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 
    into
        NEWS
        (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>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Java与MySQL数据库之间的数据类型转换可以使用Java的JDBC(Java Database Connectivity)驱动程序来实现。以下是一些常见的Java类型与MySQL数据库类型之间的转换示例: 1. 字符串类型(String)和MySQL的VARCHAR、CHAR类型之间的转换: - Java中的String类型可以直接赋值给MySQL的VARCHAR、CHAR类型的列。 - MySQL的VARCHAR、CHAR类型可以通过getString方法获取为Java的String类型。 2. 整数类型(int、long、short)和MySQL的整数类型(INT、BIGINT、SMALLINT)之间的转换: - Java的整数类型可以直接赋值给MySQL的整数类型的列。 - MySQL的整数类型可以通过getInt、getLong、getShort等方法获取为对应Java整数类型。 3. 浮点数类型(float、double)和MySQL的浮点数类型(FLOAT、DOUBLE)之间的转换: - Java的浮点数类型可以直接赋值给MySQL的浮点数类型的列。 - MySQL的浮点数类型可以通过getFloat、getDouble等方法获取为对应Java浮点数类型。 4. 日期时间类型java.util.Date、java.sql.Date、java.sql.Timestamp)和MySQL的日期时间类型(DATE、TIME、DATETIME)之间的转换: - Java的日期时间类型可以通过Java的SimpleDateFormat等类进行格式化,然后赋值给MySQL的日期时间类型的列。 - MySQL的日期时间类型可以通过getDate、getTime、getTimestamp等方法获取为对应Java日期时间类型。 总之,通过JDBC的ResultSet和PreparedStatement对象提供的get和set方法,可以在Java和MySQL数据库之间轻松进行数据类型的转换。此外,对于更复杂的类型转换,还可以使用Java的ORM(对象关系映射)框架,如Hibernate、MyBatis等来简化操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流烟默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值