DAO 学习笔记

什么是 DAO?

Data Access Object(DAO),数据访问对象/数据存取对象。DAO 是封装数据库访问逻辑的组件/类 。

定义一个类,这个类中的方法封装了数据库访问逻辑,要访问数据库时,只要调用DAO相关的方法就可以了,调用者(一般是业务逻辑模块,即控制器)不需要了解底层的数据访问细节就可以实现数据访问。这样一来,当底层的数据访问细节发生改变,不 会影响到调用者。

DAO 可以设计成单例模式,因为往往我们只是调用 DAO 的方法获取数据库中的数据,里面没有成员变量,所以没有必要创建多个 DAO 对象。

如何写 DAO?

  1. 写实体类和数据表对应
    为了方便处理数据库中的记录,可以定义与表记录对应的实体类,即该类对象与数据表中的每条记录一一对应,或者说可以将数据库中的某条记录转换成一个实体类的实例
    比如 Employee 类,提供 id,name,salary,age 属性及相关的 get/set 方法,我们可以将 employee 表中的记录转化成一个 Employee 对象。

  2. 写 DAO 接口,声明一些方法
    写 DAO 接口,声明一些数据访问方法,例如:删除记录、增加记录、修改记录等。这些方法不要涉及具体的技术。
    例如,声明了以下的方法:
    public void save(Employee e) throws SQLException;
    这种方式不好,因为出现了 jdbc 的异常类,这就要求实现该方法只能使用 jdbc。 换一种方式来声明更好,如下:
    public void save(Employee e) throws Exception;
    public List<Employee> findAll() throws Exception;

  3. 写 DAO 实现类
    再写 DAO 实现类,采用具体的技术实现 DAO 接口有关的方法,且这些方法会用到实体类对象,并封装好与数据库连接的代码及有关的业务代码
    例如:
    使用 jdbc 实现 EmployeeDAO 接口,写一个实现类 EmployeeDAOJdbcImpl。

  4. 写 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
   */
  @Override
  public 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
   */
  @Override
  public 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
   */
  @Override
  public 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
   */
  @Override
  public 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
   */
  @Override
  public 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;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值