A JDBC adattípusok teljes listája
Az ismert adattípusokon kívül a JDBC lehetővé teszi, hogy számos natív adattípussal dolgozzon a DBMS-hez. Az alábbiakban felsorolom a típusokat és a hozzájuk tartozó funkciókat:
típus | Módszer |
---|---|
sor | getArray() |
AsciiStream | getAsciiStream() |
BigDecimal | getBigDecimal() |
BinaryStream | getBinaryStream() |
folt | getBlob() |
Boolean | getBoolean() |
folt | getBlob() |
Boolean | getBoolean() |
bájtok | getByte() |
bájtok | getBytes() |
Karakterfolyam | getCharacterStream() |
Clob | getClob() |
Dátum | getDate() |
Kettős | getDouble() |
úszó | getFloat() |
int | getInt() |
Hosszú | get Long() |
NCharacterStream | getNCharacterStream() |
Tárgy | getObject() |
Ref | getRef() |
RowId | getRowId() |
Rövid | getShort() |
SQLXML | getSQLXML() |
Húr | getString() |
Idő | getTime() |
Időbélyeg | getTimestamp() |
UnicodeStream | getUnicodeStream() |
URL | getURL() |
A primitív típusokat már figyelembe vettük. Most próbáljunk meg tárgyakkal dolgozni.
BLOB adattípus
Ha el akarunk menteni valamilyen objektumot az adatbázisba, akkor ennek legegyszerűbb módja az SQL BLOB típus használata. A JDBC-nek megvan a megfelelője, Blob.
A BLOB a Binary L arge Object rövidítése . Egy bájttömb tárolására szolgál. A JDBC Blob típusa egy interfész, és kétféle módon helyezhet el (és fogadhat) adatokat:
- Az InputStream használata
- Egy bájttömb használatával
Példa: a 3. számú oszlop a BLOB típust tartalmazza:
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
results.first();
Blob blob = results.getBlob(3);
InputStream is = blob.getBinaryStream();
Saját Blob objektum létrehozásához a createBlob() függvényt kell használnia . Példa:
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();
Kétféleképpen tölthet fel egy Blobot adatokkal. Az első az OutputSteamen keresztül történik :
Path avatar = Paths.get("E:\\images\\cat.jpg");
OutputStream os = blob.setBinaryStream(1);
Files.copy(avatar, os);
És a második - bájtokkal való kitöltéssel:
Path avatar = Paths.get("E:\\images\\cat.jpg");
byte[] content = Files.readAllBytes(avatar);
blob.setBytes(1, content);
Java objektum mentése adatbázisba
Megtanultuk, hogyan lehet bináris objektumokat menteni az adatbázisba: bájttömböket, bájtfolyamokat stb. Mi a helyzet a Java objektumokkal? Hogyan menthetünk el egy Java objektumot adatbázisba?
Tegyük fel, hogy van egy Employee Java osztályunk , amely egy vállalat alkalmazottját írja le:
public class Employee {
public Integer id;
public String name;
public String occupation;
public Integer salary;
public Date joinDate;
}
Hogyan menthetünk el egy ilyen osztályú objektumot az adatbázisba JDBC használatával?
Valójában már mindent tudsz, amit tudnod kell. Először létre kell hoznia egy táblát az adatbázisban, amely megfelel ennek az osztálynak. Például ez:
CREATE TABLE employee {
id INT PRIMARY KEY NOT NULL,
name VARCHAR(100),
occupation VARCHAR(100),
salary INT,
join_date DATE
}
És most írjuk meg azt a kódot, amely hozzáadja az Employee osztály egy objektumát az alaphoz:
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;
}
Egyszerű és világos. A módszer nagyszerűen fog működni.
Java objektum beolvasása adatbázisból
Megtanultuk, hogyan kell objektumot írni az adatbázisba, most írjuk meg a kódot, hogy kiolvassuk az objektumot az adatbázisból. Kezdjük azzal a kóddal, amely beolvas egy objektumot az adatbázisból az azonosítója alapján:
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;
}
És ha nem egy tárgyra van szükségünk, hanem többre? Egy ilyen kérést is könnyű megírni. Szerezzük meg cégünk összes alkalmazottját:
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;
}
Mellesleg, ha sok ilyen módszer létezik, akkor mindegyikbe ugyanazt a kódot kell írnia a ResultSet karakterlánc objektummá konvertálásáhozmunkavállaló. Tehát ez a kód áthelyezhető egy külön metódusba.
Ez különösen akkor lehet hasznos, ha az Employee osztály olyan összetett mezőket tartalmaz, mint az Enum, InputStream, vagy hivatkozások más objektumokra, amelyeket szintén az adatbázisban szeretnénk tárolni.
GO TO FULL VERSION