DAO结构
什么是DAO:DAO(Database Access Object)数据库访问对象;
一种封装数据库操作的模式;
为什么要用DAO:实现业务逻辑与数据库操作相分离,降低程序代码的耦合性
怎么实现DAO(DAO模式文件结构):
dao接口:存放接口
dao实现类:存放接口的实现类
实体类:存放实体类
工具类(包括工具配置,连接池和连接池配置):存放工具类和连接池以及他们相应的配置
dao接口
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) ;
}
dao接口实现类:
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;
}
}
实体类
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 + "]";
}
}
工具类和连接池
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 ;
}
}
连接池
个人理解:一个缓存池,存放和数据库之间的连接,不用每次请求操作数据库时重新创建数据库连接,即从数据库连接池直接取连接好的接口,用完后再放回,可以有效的减少数据库连接所产生的数据库消耗。本质上是一种提高操作数据库性能的技术。
更全面的解释:https://blog.csdn.net/shuaihj/article/details/14223015