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。

Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系_第1张图片

在标准 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映射类型如下所示:

 
   
 

不同类型日期时间在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; //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:

   

  • 测试代码如下:
	@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 属性:

  

 	
 
 
 
 	
 

你可能感兴趣的:(#,Hibernate)