0
点赞
收藏
分享

微信扫一扫

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 类型之间的对应关系_SQL类型

在标准 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; //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代理对象
  • 数据表效果如下:
    Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系_Java类型_02

另外,若希望精确映射 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>


举报

相关推荐

0 条评论