CodeGym/Java kursus/All lectures for DA purposes/Lagring af objekter i databasen

Lagring af objekter i databasen

Ledig

Komplet liste over JDBC-datatyper

Ud over de datatyper, du kender, giver JDBC dig mulighed for at arbejde med mange indbyggede datatyper til DBMS. Nedenfor vil jeg liste typerne og funktionerne for at få dem:

Type Metode
array getArray()
AsciiStream getAsciiStream()
BigDecimal getBigDecimal()
BinaryStream getBinaryStream()
klat getBlob()
Boolean get Boolean()
klat getBlob()
Boolean get Boolean()
bytes getByte()
bytes getBytes()
CharacterStream getCharacterStream()
Clob getClob()
Dato getDate()
Dobbelt getDouble()
flyde getFloat()
int getInt()
Lang getLong()
NCharacterStream getNCaracterStream()
Objekt getObject()
Ref getRef()
RowId getRowId()
kort getShort()
SQLXML getSQLXML()
Snor getString()
Tid getTime()
Tidsstempel getTimestamp()
UnicodeStream getUnicodeStream()
URL getURL()

Vi har allerede overvejet primitive typer. Lad os nu prøve at arbejde med objekter.

BLOB datatype

Hvis du vil gemme et eller andet objekt i databasen, så er den nemmeste måde at gøre dette på at bruge SQL BLOB-typen. JDBC har sin pendant kaldet Blob.

BLOB står for Binary L arge Object . Det bruges til at gemme en række bytes. Blob-typen i JDBC er en grænseflade, og du kan lægge (og modtage) data i den på to måder:

  • Brug af InputStream
  • Brug af en række bytes

Eksempel: kolonne nummer 3 indeholder BLOB-typen:

Statement statement = connection.createStatement();
    ResultSet results = statement.executeQuery("SELECT * FROM user");
    results.first();

    Blob blob = results.getBlob(3);
    InputStream is = blob.getBinaryStream();

For at oprette dit eget Blob-objekt skal du bruge funktionen createBlob() . Eksempel:

String insertQuery = “INSERT INTO images(name, image) VALUES (?, ?);
PreparedStatement statement = connection.prepareStatement(insertQuery);

// Create a Blob object and get an OtputStream from it to write data to it
Blob blob = connection.createBlob();

// Populate the Blob with data...
OutputStream os = blob.setBinaryStream(1);

// Passing Blob as query parameter
statement.setBlob(2, blob);
statement.execute();

Der er to måder at udfylde en Blob med data. Den første er via OutputSteam :

Path avatar = Paths.get("E:\\images\\cat.jpg");
OutputStream os = blob.setBinaryStream(1);
Files.copy(avatar, os);

Og den anden - ved at fylde med bytes:

Path avatar = Paths.get("E:\\images\\cat.jpg");
byte[] content = Files.readAllBytes(avatar);
blob.setBytes(1, content);

Lagring af et Java-objekt i en database

Vi har lært, hvordan man gemmer binære objekter i databasen: byte-arrays, byte-streams og så videre. Hvad med Java-objekter? Hvordan gemmer vi et Java-objekt i en database?

Lad os sige, at vi har en Employee Java-klasse , der beskriver en medarbejder i en virksomhed:

public class Employee {
    public Integer id;
    public String name;
    public String occupation;
    public Integer salary;
    public Date joinDate;
}

Hvordan kan vi gemme et objekt af denne klasse til databasen ved hjælp af JDBC?

Faktisk ved du allerede alt, hvad du behøver at vide. Først skal du oprette en tabel i databasen, der svarer til denne klasse. For eksempel denne:

CREATE TABLE employee {
    id INT PRIMARY KEY NOT NULL,
    name VARCHAR(100),
    occupation VARCHAR(100),
    salary INT,
    join_date DATE
}

Og lad os nu skrive koden, der tilføjer et objekt fra vores Employee- klasse til basen:

public static boolean addEmployee(Connection connection, Employee employee) throws Exception {
    	// Create and prepare a query to insert data into the table
    	String insertQuery = "INSERT INTO employee(name, occupation, salary, join_date ) VALUES (?, ?, ?, ?)";
    	PreparedStatement statement = connection.prepareStatement(insertQuery);

    	// Populate the query with data from the Employee object
    	statement.setString(1, employee.name);
    	statement.setString(2, employee.occupation);
    	statement.setInt(3, employee.salary);
    	statement.setDate(4, employee.joinDate);

    	// Execute our query and it returns true if a new row has been added
    	int count = statement.executeUpdate();
    	return count > 0;
    }

Enkelt og overskueligt. Metoden vil fungere glimrende.

Læsning af et Java-objekt fra en database

Vi lærte, hvordan man skriver et objekt til databasen, lad os nu skrive koden for at læse objektet fra databasen. Lad os starte med koden, der læser et objekt fra databasen ved dets ID:

public static Employee getEployeeById(Connection connection, int id) throws Exception {
    	// Create and prepare a query to get an employee from the table
    	PreparedStatement statement = connection.prepareStatement("SELECT * FROM employee WHERE id = ?");
    	statement.setInt(1, id);

    	// Execute our query and it returns null if there are no rows in the query result
    	ResultSet results = statement.executeQuery();
    	if (!results.first())
        	return null;

    	// Populate the Employee object with the data from the ResultSet
    	Employee employee = new Employee();
    	employee.id = results.getInt(1);
    	employee.name = results.getString(2);
    	employee.occupation = results.getString(3);
    	employee.salary = results.getInt(4);
    	employee.joinDate = results.getDate(5);
    	return employee;
}

Og hvis vi ikke har brug for én genstand, men flere? Sådan en anmodning er også nem at skrive. Lad os få alle medarbejdere i vores virksomhed:

public static List<Employee> getAllEployees(Connection connection) throws Exception {
	// Create and execute a query to get employees from the table
	Statement statement = connection.createStatement();
	ResultSet results = statement.executeQuery("SELECT * FROM employee");

	ArrayList<Employee> list = new ArrayList<Employee>();
	while (results.next()) {
        // Populate the Employee object with the data from the current row of the ResultSet
	        Employee employee = new Employee();
	        employee.id = results.getInt(1);
	        employee.name = results.getString(2);
	        employee.occupation = results.getString(3);
	        employee.salary = results.getInt(4);
	        employee.joinDate = results.getDate(5);

	        list.add(employee);
	}
	return list;
}

Forresten, hvis der er mange sådanne metoder, skal du i hver af dem skrive den samme kode for at konvertere ResultSet- strengen til et objektmedarbejder. Så denne kode kan flyttes til en separat metode.

Dette kan især være nyttigt, hvis Employee- klassen indeholder komplekse felter som Enum, InputStream eller referencer til andre objekter, som vi også ønsker at gemme i databasen.

Kommentarer
  • Populær
  • Ny
  • Gammel
Du skal være logget ind for at skrive en kommentar
Denne side har ingen kommentarer endnu