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.
GO TO FULL VERSION