Spara objekt i databasen

Tillgängliga

Komplett lista över JDBC-datatyper

Förutom de datatyper du känner till låter JDBC dig arbeta med många inbyggda datatyper för DBMS. Nedan kommer jag att lista typerna och funktionerna för att få dem:

Typ Metod
array getArray()
AsciiStream getAsciiStream()
BigDecimal getBigDecimal()
BinaryStream getBinaryStream()
klick getBlob()
Boolean getBoolean()
klick getBlob()
Boolean getBoolean()
bytes getByte()
bytes getBytes()
CharacterStream getCharacterStream()
Clob getClob()
Datum getDate()
Dubbel getDouble()
flyta getFloat()
int getInt()
Lång getLong()
NCharacterStream getNCaracterStream()
Objekt getObject()
Ref getRef()
RowId getRowId()
kort getShort()
SQLXML getSQLXML()
Sträng getString()
Tid få tid()
Tidsstämpel getTimestamp()
UnicodeStream getUnicodeStream()
URL getURL()

Vi har redan övervägt primitiva typer. Låt oss nu försöka arbeta med objekt.

BLOB-datatyp

Om du vill spara något objekt i databasen, är det enklaste sättet att göra detta att använda SQL BLOB-typen. JDBC har sin motsvarighet som heter Blob.

BLOB står för Binary L arge Object . Den används för att lagra en array av byte. Blob-typen i JDBC är ett gränssnitt och du kan lägga (och ta emot) data i den på två sätt:

  • Använder InputStream
  • Använder en array av byte

Exempel: kolumn nummer 3 innehåller typen BLOB:

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

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

För att skapa ditt eget Blob-objekt måste du använda funktionen createBlob() . Exempel:

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();

Det finns två sätt att fylla en Blob med data. Den första är via OutputSteam :

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

Och den andra - genom att fylla med bytes:

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

Spara ett Java-objekt i en databas

Vi har lärt oss hur man sparar binära objekt i databasen: byte-arrayer, byte-strömmar och så vidare. Hur är det med Java-objekt? Hur sparar vi ett Java-objekt i en databas?

Låt oss säga att vi har en Java-klass för anställda som beskriver en anställd på ett företag:

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

Hur kan vi spara ett objekt av denna klass till databasen med JDBC?

Faktum är att du redan vet allt du behöver veta. Först måste du skapa en tabell i databasen som motsvarar denna klass. Till exempel denna:

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

Och låt oss nu skriva koden som lägger till ett objekt av vår Employee -klass till 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 och tydligt. Metoden kommer att fungera utmärkt.

Läsa ett Java-objekt från en databas

Vi lärde oss hur man skriver ett objekt till databasen, nu ska vi skriva koden för att läsa objektet från databasen. Låt oss börja med koden som läser ett objekt från databasen med dess 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;
}

Och om vi inte behöver ett objekt, utan flera? En sådan begäran är också lätt att skriva. Låt oss få alla anställda i vårt företag:

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;
}

Förresten, om det finns många sådana metoder, måste du i var och en av dem skriva samma kod för att konvertera ResultSet- strängen till ett objektanställd. Så den här koden kan flyttas till en separat metod.

Detta kan vara särskilt användbart om klassen Employee innehåller komplexa fält som Enum, InputStream eller referenser till andra objekt som vi också vill lagra i databasen.

Kommentarer
  • Populär
  • Ny
  • Gammal
Du måste vara inloggad för att lämna en kommentar
Den här sidan har inga kommentarer än