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