6.1 在服務器上存儲文件

有時需要將二進制對象保存到數據庫中。例如,文件。如果文件很大,那麼最合理的做法是將其存儲在磁盤上的單獨文件夾中,並將其路徑存儲在數據庫中。例子:

c:\db-files\users\12355\avatar.jpg

在數據庫中,我們只存儲文件的相對路徑:

\12355\avatar.jpg

在數據庫中存儲相對路徑很方便,因為從中很容易獲取 URL:

https://storage.codegym.cc/users/12355/avatar.jpg

我們只需將相對路徑粘貼到服務器名稱即可。

6.2 將圖片直接存入數據庫

但是如果圖片比較小,可以直接存入數據庫,以字節集的形式給客戶端。對於這種情況,SQL 有一種特殊的BLOB數據類型——二進制大對象。或者更確切地說,甚至有兩個:

  • CLOB - 字符大對象,
  • BLOB - 二進制大對象。

CLOB 用於存儲非常大的文本。BLOB 用於存儲二進制數據,例如小圖片、視頻等。

例子:

@Entity
@Table(name="user")
public class User {

    @Id
    private String id;

	@Column(name = "name", columnDefinition="VARCHAR(128)")
    private String name;

	@Lob
	@Column(name = "photo", columnDefinition="BLOB")
    private byte[] photo;

	// ...
}

註釋@Lob告訴 Hibernate字段中存儲了一個大對象。並且columnDefinition="BLOB"已經討論瞭如何將其全部保存在數據庫中。

讓我們編寫一個示例代碼,將新用戶及其照片保存到數據庫中:

byte[] imageBuffer = Files.readAllBytes(Paths.get("C:/temp/avatar.png"))

User user = new User();
user.setId("1");
user.setName("Zapp");
user.setPhoto(imageBuffer);

session.persist(user);

6.3 XML 和 JSON

Hibernate 對 JSON 作為數據類型有有趣的支持。它允許您將字符串的 HashMap 存儲為單個 JSON 對象。如果 DBMS 可以使用 JSON,那麼它看起來像這樣:

@JdbcTypeCode(SqlTypes.JSON)
private Map<String, String> properties;

Hibernate 負責將類型對象Map<String, String>序列化為單個 JSON 對象。此外,當從數據庫中讀取對象時,它會將 JSON 對象轉換為一組Map<String, String>.

Hibernate 可以用 XML 做一些類似的事情:

@JdbcTypeCode(SqlTypes.SQLXML)
private Map<String, String> properties;