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;
}
}