6.1 Lagre filer på serveren
Noen ganger må binære objekter lagres i databasen. For eksempel filer. Hvis filen er stor, er det rimeligst å lagre den i en egen mappe på disken, og lagre banene i databasen. Eksempel:
c:\db-files\users\12355\avatar.jpg
Og i databasen lagrer vi bare en relativ bane til filen:
\12355\avatar.jpg
Det er praktisk å lagre en relativ bane i databasen, siden det da er lett å få en URL fra den:
https://storage.codegym.cc/users/12355/avatar.jpg
Vi limer bare inn den relative banen til servernavnet, og vi er ferdige.
6.2 Lagre bilder direkte i databasen
Men hvis bildene er små, kan de lagres direkte i databasen og gis til klienten som et sett med byte. For slike tilfeller har SQL en spesiell BLOB- datatype - Binary Large Object. Eller rettere sagt, det er til og med to av dem:
- CLOB - Character Large Object,
- BLOB - Binært stort objekt.
CLOB brukes til å lagre svært store tekster. En BLOB er for lagring av binære data, for eksempel små bilder, videoer og lignende.
Eksempel:
@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;
// ...
}
Merknaden @Lob
forteller Hibernate at et stort objekt er lagret i feltet . Og columnDefinition="BLOB"
snakker allerede om hvordan du lagrer alt i databasen.
La oss skrive en eksempelkode som lagrer en ny bruker og bildet hans i 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 og JSON
Hibernate har interessant støtte for JSON som datatype. Den lar deg lagre en HashMap av strenger som et enkelt JSON-objekt. Hvis DBMS kan fungere med JSON, ser det slik ut:
@JdbcTypeCode(SqlTypes.JSON)
private Map<String, String> properties;
Hibernate sørger for at typeobjektet Map<String, String>
serialiseres til et enkelt JSON-objekt. Når du leser et objekt fra databasen, gjør det også JSON-objektet til et sett med Map<String, String>
.
Hibernate kan gjøre noe lignende med XML:
@JdbcTypeCode(SqlTypes.SQLXML)
private Map<String, String> properties;