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