Komplett liste over JDBC-datatyper
I tillegg til datatypene du kjenner, lar JDBC deg jobbe med mange native datatyper for DBMS. Nedenfor vil jeg liste opp typene og funksjonene for å få dem:
Type | Metode |
---|---|
array | getArray() |
AsciiStream | getAsciiStream() |
BigDesimal | getBigDecimal() |
BinaryStream | getBinaryStream() |
blob | getBlob() |
boolsk | getBoolean() |
blob | getBlob() |
boolsk | getBoolean() |
bytes | getByte() |
bytes | getBytes() |
CharacterStream | getCharacterStream() |
Clob | getClob() |
Dato | getDate() |
Dobbelt | getDouble() |
flyte | getFloat() |
int | getInt() |
Lang | getLong() |
NCharacterStream | getNCaracterStream() |
Gjenstand | getObject() |
Ref | getRef() |
RowId | getRowId() |
Kort | getShort() |
SQLXML | getSQLXML() |
String | getString() |
Tid | getTime() |
Tidsstempel | getTimestamp() |
UnicodeStream | getUnicodeStream() |
URL | getURL() |
Vi har allerede vurdert primitive typer. La oss nå prøve å jobbe med objekter.
BLOB-datatype
Hvis du vil lagre et objekt i databasen, er den enkleste måten å gjøre dette på å bruke SQL BLOB-typen. JDBC har sitt motstykke kalt Blob.
BLOB står for Binary L arge Object . Den brukes til å lagre en rekke byte. Blob-typen i JDBC er et grensesnitt, og du kan sette (og motta) data i det på to måter:
- Bruker InputStream
- Bruke en rekke byte
Eksempel: kolonne nummer 3 inneholder 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 å lage ditt eget Blob-objekt, må du bruke createBlob()- funksjonen . 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();
Det er to måter å fylle 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 andre - gjennom å fylle med bytes:
Path avatar = Paths.get("E:\\images\\cat.jpg");
byte[] content = Files.readAllBytes(avatar);
blob.setBytes(1, content);
Lagre et Java-objekt i en database
Vi har lært hvordan du lagrer binære objekter i databasen: byte-matriser, byte-strømmer og så videre. Hva med Java-objekter? Hvordan lagrer vi et Java-objekt i en database?
La oss si at vi har en Employee Java-klasse som beskriver en ansatt i et selskap:
public class Employee {
public Integer id;
public String name;
public String occupation;
public Integer salary;
public Date joinDate;
}
Hvordan kan vi lagre et objekt av denne klassen til databasen ved å bruke JDBC?
Faktisk vet du allerede alt du trenger å vite. Først må du lage en tabell i databasen som tilsvarer denne klassen. For eksempel denne:
CREATE TABLE employee {
id INT PRIMARY KEY NOT NULL,
name VARCHAR(100),
occupation VARCHAR(100),
salary INT,
join_date DATE
}
Og la oss nå skrive koden som vil legge til et objekt fra vår 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 oversiktlig. Metoden vil fungere utmerket.
Lese et Java-objekt fra en database
Vi lærte hvordan man skriver et objekt til databasen, la oss nå skrive koden for å lese objektet fra databasen. La oss starte med koden som leser et objekt fra databasen ved sin 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 trenger ett objekt, men flere? En slik forespørsel er også lett å skrive. La oss få alle ansatte i selskapet vårt:
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 det er mange slike metoder, må du i hver av dem skrive den samme koden for å konvertere ResultSet- strengen til et objektansatt. Så denne koden kan flyttes til en egen metode.
Dette kan være spesielt nyttig hvis Employee -klassen inneholder komplekse felt som Enum, InputStream eller referanser til andre objekter som vi også ønsker å lagre i databasen.