DAO
DAO (Data Access Object) là một mẫu thiết kế (design pattern) dùng để tách biệt logic truy cập dữ liệu (ví dụ như kết nối, truy vấn, thêm, sửa, xóa trong cơ sở dữ liệu) khỏi các phần còn lại của ứng dụng.
DAO thường bao gồm các phương thức CRUD (Create, Read, Update, Delete) để thao tác với cơ sở dữ liệu.
Tải thư viện để kết nối đến Database
DBContext
DBContext là lớp dùng để thiết lập kết nối với cơ sở dữ liệu để các lớp con (như PersonDAO) có thể sử dụng lại mà không cần tạo kết nối mới.
package dal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class DBContext {
protected Connection connection;
public DBContext()
{
try {
String user = "sa";
String pass = "sa";
String url = "jdbc:sqlserver://localhost:1433;databaseName=Test";
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
connection = DriverManager.getConnection(url, user, pass);
} catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(DBContext.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
PersonDAO
Lớp PersonDAO kế thừa từ DBContext và thực hiện các thao tác CRUD với bảng person.
package dal;
import dal.DBContext;
import java.sql.*;
import java.util.ArrayList;
import model.Todo;
public class PersonDAO extends DBContext {
// Lấy một Person theo ID
public Person getById(int id) throws SQLException {
Person person = null;
String sql = "SELECT * FROM Persons WHERE id = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, id);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
person = new Person();
person.setId(rs.getInt("id"));
person.setName(rs.getString("name"));
person.setAge(rs.getInt("age"));
}
rs.close();
pstmt.close();
return person;
}
// Lấy tất cả Person
public List<Person> getAll() throws SQLException {
List<Person> list = new ArrayList<>();
String sql = "SELECT * FROM Persons";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
Person person = new Person();
person.setId(rs.getInt("id"));
person.setName(rs.getString("name"));
person.setAge(rs.getInt("age"));
list.add(person);
}
rs.close();
stmt.close();
return list;
}
// Thêm mới Person
public int insert(Person person) throws SQLException {
String sql = "INSERT INTO Persons (name, age) VALUES (?, ?)";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, person.getName());
pstmt.setInt(2, person.getAge());
int rows = pstmt.executeUpdate();
pstmt.close();
return rows;
}
// Cập nhật Person
public int update(Person person) throws SQLException {
String sql = "UPDATE Persons SET name = ?, age = ? WHERE id = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, person.getName());
pstmt.setInt(2, person.getAge());
pstmt.setInt(3, person.getId());
int rows = pstmt.executeUpdate();
pstmt.close();
return rows;
}
// Xoá Person
public void delete(int id) throws SQLException {
String sql = "DELETE FROM Persons WHERE id = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, id);
pstmt.executeUpdate();
pstmt.close();
}
}
Gọi DAO từ Servlet
public class PersonServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
int id = Integer.parseInt(request.getParameter("id"));
PersonDAO personDAO = new PersonDAO();
Person person = personDAO.getById(id);
request.setAttribute("person", person);
request.getRequestDispatcher("/person.jsp").forward(request, response);
} catch (SQLException e) {
throw new ServletException("Database error", e);
}
}
}
DAO là lớp trung gian giữa ứng dụng và cơ sở dữ liệu, giúp bạn quản lý dữ liệu một cách rõ ràng, có tổ chức và dễ bảo trì. Trong các ứng dụng Java web sử dụng MVC, DAO thường nằm ở tầng Model.
