DAO 学习笔记
文章目錄
- 什么是 DAO?
- 如何寫 DAO?
- 示例代碼
什么是 DAO?
Data Access Object(DAO),數據訪問對象/數據存取對象。DAO 是封裝數據庫訪問邏輯的組件/類 。
定義一個類,這個類中的方法封裝了數據庫訪問邏輯,要訪問數據庫時,只要調用DAO相關的方法就可以了,調用者(一般是業務邏輯模塊,即控制器)不需要了解底層的數據訪問細節就可以實現數據訪問。這樣一來,當底層的數據訪問細節發生改變,不 會影響到調用者。
DAO 可以設計成單例模式,因為往往我們只是調用 DAO 的方法獲取數據庫中的數據,里面沒有成員變量,所以沒有必要創建多個 DAO 對象。
如何寫 DAO?
寫實體類和數據表對應
為了方便處理數據庫中的記錄,可以定義與表記錄對應的實體類,即該類對象與數據表中的每條記錄一一對應,或者說可以將數據庫中的某條記錄轉換成一個實體類的實例
比如 Employee 類,提供 id,name,salary,age 屬性及相關的 get/set 方法,我們可以將 employee 表中的記錄轉化成一個 Employee 對象。
寫 DAO 接口,聲明一些方法
寫 DAO 接口,聲明一些數據訪問方法,例如:刪除記錄、增加記錄、修改記錄等。這些方法不要涉及具體的技術。
例如,聲明了以下的方法:
public void save(Employee e) throws SQLException;
這種方式不好,因為出現了 jdbc 的異常類,這就要求實現該方法只能使用 jdbc。 換一種方式來聲明更好,如下:
public void save(Employee e) throws Exception;
public List<Employee> findAll() throws Exception;
寫 DAO 實現類
再寫 DAO 實現類,采用具體的技術實現 DAO 接口有關的方法,且這些方法會用到實體類對象,并封裝好與數據庫連接的代碼及有關的業務代碼
例如:
使用 jdbc 實現 EmployeeDAO 接口,寫一個實現類 EmployeeDAOJdbcImpl。
寫 DAO 工廠類(即工廠模式)
寫工廠類,通過屬性文件(.properties)來配置不同的參數,從而可以獲取不同技術實現的DAO對象。
工廠類:封裝了對象的創建細節,為調用者提供符合要求的對象。
工廠模式可以通過簡單的配置文件管理 DAO 的實現類。
示例代碼
DAO接口:
package priv.lwx.servlet.dao;import priv.lwx.servlet.entity.Employee;import java.util.List;/*** 定義DAO接口** @author liaowenxiong* @date 2022/3/14 09:43*/public interface EmployeeDAO {void save(Employee e) throws Exception;void delete(int id) throws Exception;void update(Employee e) throws Exception;Employee findById(int id) throws Exception;List<Employee> findAll() throws Exception;}DAO實現類:
package priv.lwx.servlet.dao.impl;import priv.lwx.servlet.dao.EmployeeDAO; import priv.lwx.servlet.entity.Employee; import priv.lwx.servlet.util.ConnectionUtils;import java.math.BigDecimal; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List;/*** EmployeeDAO的實現類,使用JDBC技術實現** @author liaowenxiong* @date 2022/3/14 09:54*/public class EmployeeDAOJdbcImpl implements EmployeeDAO {/*** 新增雇員** @param e 要新增的雇員數據* @throws Exception*/@Overridepublic void save(Employee e) throws Exception {String sql = "insert into emp(name,salary,age) values(?,?,?)";Connection conn = ConnectionUtils.getConnection();PreparedStatement pstmt = null;pstmt = conn.prepareStatement(sql);pstmt.setString(1, e.getName());pstmt.setBigDecimal(2, e.getSalary());pstmt.setByte(3, e.getAge());pstmt.executeUpdate();ConnectionUtils.close(pstmt, conn);}/*** 根據雇員ID刪除雇員** @param id* @throws Exception*/@Overridepublic void delete(int id) throws Exception {String sql = "delete from emp where id=?";Connection conn = ConnectionUtils.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setInt(1, id);pstmt.executeUpdate();ConnectionUtils.close(pstmt, conn);}/*** 更新某個雇員信息** @param e* @throws Exception*/@Overridepublic void update(Employee e) throws Exception {String sql = "update emp set name=?,salary=?,age=? where id=?";Connection conn = ConnectionUtils.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setString(1, e.getName());pstmt.setBigDecimal(2, e.getSalary());pstmt.setByte(3, e.getAge());pstmt.setInt(4, e.getId());pstmt.executeUpdate();ConnectionUtils.close(pstmt, conn);}/*** 根據雇員ID查詢雇員信息** @param id* @return* @throws Exception*/@Overridepublic Employee findById(int id) throws Exception {String sql = "select * from emp where id=?";Connection conn = ConnectionUtils.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setInt(1, id);ResultSet rs = pstmt.executeQuery();rs.next();String name = rs.getString("name");BigDecimal salary = rs.getBigDecimal("salary");byte age = rs.getByte("age");Employee e = new Employee();e.setId(id);e.setName(name);e.setSalary(salary);e.setAge(age);return e;}/*** 查詢所有雇員的信息** @return* @throws Exception*/@Overridepublic List<Employee> findAll() throws Exception {String sql = "select * from emp";Connection conn = ConnectionUtils.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql);ResultSet rs = pstmt.executeQuery();List<Employee> emps = new ArrayList<>();while (rs.next()) {int id = rs.getInt("id");String name = rs.getString("name");BigDecimal salary = rs.getBigDecimal("salary");byte age = rs.getByte("age");Employee e = new Employee();e.setId(id);e.setName(name);e.setSalary(salary);e.setAge(age);emps.add(e);}return emps;} }總結
- 上一篇: 快手上的备案编号怎么写的(快手上的备案编
- 下一篇: Struts2请求处理的内部流程说明(版