Danh sách đầy đủ các kiểu dữ liệu JDBC
Ngoài các kiểu dữ liệu mà bạn biết, JDBC cho phép bạn làm việc với nhiều kiểu dữ liệu gốc cho DBMS. Dưới đây tôi sẽ liệt kê các loại và các chức năng để có được chúng:
Kiểu | Phương pháp |
---|---|
mảng | getArray() |
AsciiStream | getAsciiStream() |
BigDecimal | getBigDecimal() |
Luồng nhị phân | getBinaryStream() |
bãi | getBlob() |
Boolean | getBoolean() |
bãi | getBlob() |
Boolean | getBoolean() |
byte | getByte() |
byte | getBytes() |
Nhân vậtStream | get CharacterStream() |
cục đất sét | getClob() |
Ngày | hẹn gặp() |
Gấp đôi | getDouble() |
trôi nổi | getFloat() |
int | getInt() |
Dài | getLong() |
N CharacterStream | getN CharacterStream() |
Sự vật | getObject() |
Giới thiệu | getRef() |
Id hàng | getRowId() |
Ngắn | getShort() |
SQLXML | getSQLXML() |
Sợi dây | getString() |
Thời gian | dành thời gian() |
Dấu thời gian | lấy Dấu thời gian() |
UnicodeStream | getUnicodeStream() |
URL | getURL() |
Chúng tôi đã xem xét các loại nguyên thủy. Bây giờ chúng ta hãy thử làm việc với các đối tượng.
Kiểu dữ liệu BLOB
Nếu bạn muốn lưu một đối tượng nào đó vào cơ sở dữ liệu thì cách dễ nhất để thực hiện việc này là sử dụng kiểu SQL BLOB. JDBC có đối tác được gọi là Blob.
BLOB là viết tắt của Binary L age Object . Nó được sử dụng để lưu trữ một mảng byte. Kiểu Blob trong JDBC là một giao diện và bạn có thể đưa (và nhận) dữ liệu vào đó theo hai cách:
- Sử dụng InputStream
- Sử dụng một mảng byte
Ví dụ: cột số 3 chứa loại BLOB:
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
results.first();
Blob blob = results.getBlob(3);
InputStream is = blob.getBinaryStream();
Để tạo đối tượng Blob của riêng bạn, bạn cần sử dụng hàm createBlob() . Ví dụ:
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();
Có hai cách để điền dữ liệu vào Blob. Cái đầu tiên là thông qua OutputSteam :
Path avatar = Paths.get("E:\\images\\cat.jpg");
OutputStream os = blob.setBinaryStream(1);
Files.copy(avatar, os);
Và thứ hai - thông qua điền byte:
Path avatar = Paths.get("E:\\images\\cat.jpg");
byte[] content = Files.readAllBytes(avatar);
blob.setBytes(1, content);
Lưu đối tượng Java vào cơ sở dữ liệu
Chúng ta đã học cách lưu các đối tượng nhị phân vào cơ sở dữ liệu: mảng byte, luồng byte, v.v. Còn các đối tượng Java thì sao? Làm cách nào để lưu một đối tượng Java vào cơ sở dữ liệu?
Giả sử chúng ta có một lớp Java Nhân viên mô tả một nhân viên của một công ty:
public class Employee {
public Integer id;
public String name;
public String occupation;
public Integer salary;
public Date joinDate;
}
Làm thế nào chúng ta có thể lưu một đối tượng của lớp này vào cơ sở dữ liệu bằng cách sử dụng JDBC?
Trên thực tế, bạn đã biết mọi thứ bạn cần biết. Trước tiên, bạn cần tạo một bảng trong cơ sở dữ liệu tương ứng với lớp này. Ví dụ, cái này:
CREATE TABLE employee {
id INT PRIMARY KEY NOT NULL,
name VARCHAR(100),
occupation VARCHAR(100),
salary INT,
join_date DATE
}
Và bây giờ hãy viết mã để thêm một đối tượng của lớp Nhân viên của chúng ta vào cơ sở:
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;
}
Đơn giản và rõ ràng. Phương pháp sẽ hoạt động tuyệt vời.
Đọc một đối tượng Java từ cơ sở dữ liệu
Chúng ta đã học cách ghi một đối tượng vào cơ sở dữ liệu, bây giờ hãy viết mã để đọc đối tượng từ cơ sở dữ liệu. Hãy bắt đầu với mã đọc một đối tượng từ cơ sở dữ liệu bằng ID của 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;
}
Và nếu chúng ta không cần một đối tượng, mà là một số? Một yêu cầu như vậy cũng dễ viết. Hãy để tất cả các nhân viên của công ty chúng tôi:
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;
}
Nhân tiện, nếu có nhiều phương thức như vậy, thì trong mỗi phương thức đó, bạn sẽ phải viết cùng một mã để chuyển đổi chuỗi Kết quả thành một đối tượngngười lao động. Vì vậy, mã này có thể được chuyển sang một phương pháp riêng biệt.
Điều này có thể đặc biệt hữu ích nếu lớp Nhân viên chứa các trường phức tạp như Enum, InputStream hoặc tham chiếu đến các đối tượng khác mà chúng tôi cũng muốn lưu trữ trong cơ sở dữ liệu.
GO TO FULL VERSION