DAO设计模式
DAO(Database Access Object 数据库访问对象)
为了降低耦合性,提出了DAO封装数据库操作的设计模式。
它可以实现业务逻辑与数据库访问相分离。相对来说,数据库是比较稳定的,其中DAO组件依赖于数据库系统,提供数据库访问的接口。
隔离了不同的数据库实现。
DAO模式的组成部分
1 DAO接口(主要 添加 修改 更新 删除方法) 2 DAO实现类 3 实体类 (domain、beans、entity、pojo、model) --作用:用在数据访问代码和业务逻辑代码之间通过实体类来传输数据 --实体类特征: ◦属性一般使用private修饰 ◦提供public修饰的getter/setter方法 ◦实体类提供无参构造方法,根据业务提供有参构造 ◦实现java.io.Serializable接口,支持序列化机制 4 数据库连接和关闭工具类
设计的包名
domain 存放实体类
utils 存放工具类
dao 存放接口
dao.impl 存放实现类
实例:
使用DAO设计模式实现emp表的查询、添加、删除、修改
domain包中: Employee类(员工实体类)
public class Employee { private int empno ; private String ename ; private String job ; private int mgr ; private Date hiredate ; private double sal ; private double comm ; private int deptno ; public Employee() { } public Employee(int empno, String ename, String job, int mgr, Date hiredate, double sal, double comm, int deptno) { this.empno = empno; this.ename = ename; this.job = job; this.mgr = mgr; this.hiredate = hiredate; this.sal = sal; this.comm = comm; this.deptno = deptno; } //省略所有属性的getter和setter方法 ... @Override public String toString() { return "Employee [empno=" + empno + ", ename=" + ename + ", job=" + job + ", mgr=" + mgr + ", hiredate=" + hiredate + ", sal=" + sal + ", comm=" + comm + ", deptno=" + deptno + "]"; } }
dao包中:数据库数据的CRUD操作接口类 EmployeeDao
public interface EmployeeDao { /** * 查询全部 * @return */ public List<Employee> getAll() ; /** * 根据编号查询 * @param empno * @return */ public Employee getByEmpno(int empno) ; /** * 添加数据 * @param emp * @return */ public boolean add(Employee emp) ; /** * 修改数据 * @param emp * @return */ public boolean update(Employee emp) ; /** * 删除数据 * @param empno * @return */ public boolean delete(int empno) ; }
utils 工具包中,使用Druid连接池创建工具类
public class DataSourceUtils { private static DataSource ds = null; static { InputStream is = DataSourceUtils.class.getClassLoader().getResourceAsStream("druid.properties") ; Properties pro = new Properties() ; try { pro.load(is); ds = DruidDataSourceFactory.createDataSource(pro) ; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static DataSource getDataSource() { return ds ; } }
dao.impl包: 使用DbUtils类创建 EmployeeDaoImpl实现类
public class EmployeeDaoImpl implements EmployeeDao { @Override public List<Employee> getAll() { List<Employee> list = null; QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource()) ; try { list = qr.query("select * from emp", new BeanListHandler<>(Employee.class)) ; } catch (SQLException e) { e.printStackTrace(); return null ; } return list ; } @Override public Employee getByEmpno(int empno) { QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource()) ; Employee emp = null; try { emp = qr.query("SELECT * FROM emp WHERE empno=?",new BeanHandler<>(Employee.class), empno) ; } catch (SQLException e) { e.printStackTrace(); return null; } return emp; } @Override public boolean add(Employee emp) { QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource()) ; try { int len = qr.update("INSERT INTO emp VALUES (?,?,?,?,?,?,?,?)", emp.getEmpno(),emp.getEname(),emp.getJob(),emp.getMgr(),emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno()) ; if (len > 0) { return true ; } } catch (SQLException e) { e.printStackTrace(); } return false ; } @Override public boolean update(Employee emp) { QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource()) ; try { int len = qr.update("UPDATE emp SET ename=?,job=?,mgr=?,hiredate=?,sal=?,comm=?,deptno=? WHERE empno=?", emp.getEname(),emp.getJob(),emp.getMgr(),emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno(),emp.getEmpno()); if (len > 0) { return true ; } } catch (SQLException e) { e.printStackTrace(); } return false; } @Override public boolean delete(int empno) { QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource()) ; try { int len = qr.update("DELETE FROM emp WHERE empno=?", empno); if (len > 0) { return true ; } } catch (SQLException e) { e.printStackTrace(); } return false; } }