文章目录
- 什么是 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;}
}