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

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

【1】常见的映射关系表

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

6.png

7.png



【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


【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代理对象
  • 数据表效果如下:

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


目录
相关文章
|
26天前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
45 17
|
28天前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
91 6
|
1月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
239 11
|
30天前
|
SQL Java 数据库连接
如何用 Java 校验 SQL 语句的合法性?
本文介绍了五种校验 SQL 语句合法性的方案:1) 使用 JDBC API 的 `execute()` 方法,通过捕获异常判断合法性;2) 使用 JSqlParser 库解析 SQL 语句为 Java 对象;3) 使用正则表达式检查 SQL 语句格式;4) 使用 ANTLR 生成 SQL 解析器;5) 使用 Apache Calcite 解析 SQL。每种方法各有优劣,具体选择取决于需求和个人偏好。需要注意的是,这些方法仅能校验语法合法性,无法保证语义正确性,仍需防范 SQL 注入攻击。
|
2月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
109 9
|
3月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
54 8
|
3月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
3月前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
3月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
111 2
|
3月前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
泛型擦除是指Java编译器在编译期间会移除所有泛型信息,使所有泛型类型在运行时都变为原始类型。例如,`List&lt;String&gt;` 和 `List&lt;Integer&gt;` 在JVM中都视为 `List`。因此,通过 `getClass()` 比较两个不同泛型类型的 `ArrayList` 实例会返回 `true`。此外,通过反射调用 `add` 方法可以向 `ArrayList&lt;Integer&gt;` 中添加字符串,进一步证明了泛型信息在运行时被擦除。
76 2