CodeGym/Khóa học Java/All lectures for VI purposes/Lưu đối tượng vào cơ sở dữ liệu

Lưu đối tượng vào cơ sở dữ liệu

Có sẵn

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.

Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào