6.1 Lagra filer på servern
Ibland måste binära objekt sparas i databasen. Till exempel filer. Om filen är stor är det mest rimligt att lagra den i en separat mapp på disken och lagra dess sökvägar i databasen. Exempel:
c:\db-files\users\12355\avatar.jpg
Och i databasen lagrar vi bara en relativ sökväg till filen:
\12355\avatar.jpg
Det är bekvämt att lagra en relativ sökväg i databasen, eftersom det då är lätt att få en URL från den:
https://storage.codegym.cc/users/12355/avatar.jpg
Vi klistrar bara in den relativa sökvägen till servernamnet och vi är klara.
6.2 Lagra bilder direkt i databasen
Men om bilderna är små kan de lagras direkt i databasen och ges till klienten som en uppsättning byte. För sådana fall har SQL en speciell BLOB- datatyp - Binary Large Object. Eller snarare, det finns till och med två av dem:
- CLOB - Character Large Object,
- BLOB - binärt stort objekt.
CLOB används för att lagra mycket stora texter. En BLOB är för att lagra binär data, såsom små bilder, videor och liknande.
Exempel:
@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;
// ...
}
Anteckningen @Lob
talar om för Hibernate att ett stort objekt lagras i fältet . Och columnDefinition="BLOB"
pratar redan om hur man sparar allt i databasen.
Låt oss skriva en exempelkod som sparar en ny användare och hans foto till databasen:
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 och JSON
Hibernate har intressant stöd för JSON som datatyp. Det låter dig lagra en HashMap av strängar som ett enda JSON-objekt. Om DBMS kan fungera med JSON, ser det ut så här:
@JdbcTypeCode(SqlTypes.JSON)
private Map<String, String> properties;
Hibernate ser till att typobjektet Map<String, String>
serialiseras till ett enda JSON-objekt. När man läser ett objekt från databasen, förvandlas JSON-objektet till en uppsättning av Map<String, String>
.
Hibernate kan göra något liknande med XML:
@JdbcTypeCode(SqlTypes.SQLXML)
private Map<String, String> properties;
GO TO FULL VERSION