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;
GO TO FULL VERSION