Пълен списък на типовете данни JDBC
В допълнение към типовете данни, които познавате, JDBC ви позволява да работите с много собствени типове данни за СУБД. По-долу ще изброя типовете и функциите за получаването им:
Тип | Метод |
---|---|
масив | getArray() |
AsciiStream | getAsciiStream() |
BigDecimal | getBigDecimal() |
BinaryStream | getBinaryStream() |
петно | getBlob() |
Булева стойност | getBoolean() |
петно | getBlob() |
Булева стойност | getBoolean() |
byteове | getByte() |
byteове | getBytes() |
CharacterStream | getCharacterStream() |
Clob | getClob() |
Дата | getDate() |
Двойна | getDouble() |
плавам | getFloat() |
вътр | getInt() |
Дълги | getLong() |
NCharacterStream | getNCharacterStream() |
Обект | getObject() |
Реф | getRef() |
RowId | getRowId() |
Къс | getShort() |
SQLXML | getSQLXML() |
низ | getString() |
време | getTime() |
Времево клеймо | getTimestamp() |
UnicodeStream | getUnicodeStream() |
URL address | getURL() |
Вече разгледахме примитивните типове. Нека сега се опитаме да работим с обекти.
BLOB тип данни
Ако искате да запишете няHowъв обект в базата данни, тогава най-лесният начин да направите това е да използвате типа SQL BLOB. JDBC има свой аналог, наречен Blob.
BLOB означава Binary L arge Object . _ Използва се за съхраняване на масив от byteове. Типът Blob в JDBC е интерфейс и можете да поставяте (и получавате) данни в него по два начина:
- Използване на InputStream
- Използване на масив от byteове
Пример: колона номер 3 съдържа тип BLOB:
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
results.first();
Blob blob = results.getBlob(3);
InputStream is = blob.getBinaryStream();
За да създадете свой собствен Blob обект, трябва да използвате функцията createBlob() . Пример:
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();
Има два начина за попълване на Blob с данни. Първият е чрез OutputSteam :
Path avatar = Paths.get("E:\\images\\cat.jpg");
OutputStream os = blob.setBinaryStream(1);
Files.copy(avatar, os);
И второто - чрез попълване с byteове:
Path avatar = Paths.get("E:\\images\\cat.jpg");
byte[] content = Files.readAllBytes(avatar);
blob.setBytes(1, content);
Запазване на Java обект в база данни
Научихме How да запазваме двоични обекти в базата данни: масиви от byteове, потоци от byteове и т.н. Какво ще кажете за обектите на Java? Как да запазим Java обект в база данни?
Да кажем, че имаме Java клас Employee , който описва служител на компания:
public class Employee {
public Integer id;
public String name;
public String occupation;
public Integer salary;
public Date joinDate;
}
Как можем да запазим обект от този клас в базата данни с помощта на JDBC?
Всъщност вие вече знаете всичко, което трябва да знаете. Първо трябва да създадете table в базата данни, която съответства на този клас. Например този:
CREATE TABLE employee {
id INT PRIMARY KEY NOT NULL,
name VARCHAR(100),
occupation VARCHAR(100),
salary INT,
join_date DATE
}
А сега нека напишем codeа, който ще добави обект от нашия клас Employee към базата:
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;
}
Просто и ясно. Методът ще работи чудесно.
Четене на Java обект от база данни
Научихме How да напишем обект в базата данни, сега нека напишем codeа за четене на обекта от базата данни. Нека започнем с codeа, който чете обект от базата данни по неговия 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;
}
И ако имаме нужда не от един обект, а от няколко? Такава молба също е лесна за писане. Нека вземем всички служители на нашата компания:
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;
}
Между другото, ако има много такива методи, тогава във всеки от тях ще трябва да напишете един и същ code за преобразуване на низа ResultSet в обектслужител. Така че този code може да бъде преместен в отделен метод.
Това може да бъде особено полезно, ако класът Employee съдържа сложни полета като Enum, InputStream or препратки към други обекти, които също искаме да съхраняваме в базата данни.