DAO

Java之dao模式详解及代码示例java

这篇文章主要介绍了Java之dao模式详解及代码示例,具备必定参考价值,须要的朋友能够了解下。mysql

什么是dao模式?sql

DAO(Data Access Object)顾名思义是一个为数据库或其余持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各类数据访问操做。在实际的开发中,应该将全部对数据源的访问操做进行抽象化后封装在一个公共API中。用程序设计语言来讲,就是创建一个接口,接口中定义了此应用程序中将会用到的全部事务方法。在这个应用程序中,当须要和数据源进行交互的时候则使用这个接口,而且编写一个单独的类来实现这个接口,在逻辑上该类对应一个特定的数据存储。DAO模式实际上包含了两个模式,一是Data Accessor(数据访问器),二是Data Object(数据对象),前者要解决如何访问数据的问题,然后者要解决的是如何用对象封装数据。数据库

1、信息系统的开发架构设计模式

客户层-------显示层-------业务层---------数据层---------数据库浏览器

1.客户层:客户层就是客户端,简单的来讲就是浏览器。架构

2.显示层:JSP/Servlet,用于给浏览器显示。函数

3.业务层:对于数据层的原子操做进行整合。this

4.数据层:对于数据库进行的原子操做,增长、删除等;设计

2、DAO(Data Access Object)介绍

DAO应用在数据层那块(对于数据库进行的原子操做,增长、删除等;),用于访问数据库,对数据库进行操做的类。

3、DAO设计模式的结构

DAO设计模式通常分为几个类:

1.VO(Value Object):一个用于存放网页的一行数据即一条记录的类,好比网页要显示一个用户的信息,则这个类就是用户的类。

2.DatabaseConnection:用于打开和关闭数据库。

3.DAO接口:用于声明对于数据库的操做。

4.DAOImpl:必须实现DAO接口,真实实现DAO接口的函数,可是不包括数据库的打开和关闭。

5.DAOProxy:也是实现DAO接口,可是只须要借助DAOImpl便可,可是包括数据库的打开和关闭。

6.DAOFactory:工厂类,含有getInstance()建立一个Proxy类。

4、DAO的好处

DAO的好处就是提供给用户的接口只有DAO的接口,因此若是用户想添加数据,只须要调用create函数便可,不须要数据库的操做。

5、DAO包命名

对于DAO,包的命名和类的命名必定要有层次。

1.Emp.Java

package org.vo; 

import java.util.*; 

public class Emp{ 

  private int empno; 

  private String ename; 

  private String job; 

  private Date hireDate; 

  private float sal; 

  public Emp(){ 

  } 

  public int getEmpno(){ 

    return empno; 

  } 

  public void setEmpno(int empno){ 

    this.empno = empno; 

  } 

  public String getEname(){ 

    return ename; 

  } 

  public void setEname(String ename){ 

    this.ename = ename; 

  } 

  public Date getHireDate(){ 

    return hireDate; 

  } 

  public void setHireDate(Date hireDate){ 

    this.hireDate = hireDate; 

  } 

  public float getSal(){ 

    return sal; 

  } 

  public void setSal(float sal){ 

    this.sal = sal; 

  } 

  public String getJob(){ 

    return job; 

  } 

  public void setJob(String job){ 

    this.job = job; 

  } 

2.DatabaseConnection.java

package org.dbc; 

import java.sql.*; 

public class DatabaseConnection{ 

  private Connection con = null; 

  private static final String DRIVER = "com.mysql.jdbc.Driver"; 

  private static final String USER = "root"; 

  private static final String URL = "jdbc:mysql://localhost:3306/mldn"; 

  private static final String PASS = "12345"; 

  public DatabaseConnection()throws Exception{ 

    Class.forName(DRIVER); 

    con = DriverManager.getConnection(URL,USER,PASS); 

  } 

  public Connection getConnection()throws Exception{ 

    return con; 

  } 

  public void close()throws Exception{ 

    if(con!=null){ 

      con.close(); 

    } 

  } 

3.IEmpDAO.java

package org.dao; 

import java.util.List; 

import org.vo.*; 

public interface IEmpDAO{ 

  public boolean doCreate(Emp emp)throws Exception; 

  public List<Emp> findAll()throws Exception; 

  public Emp findById(int empno)throws Exception; 

4.EmpDAOImpl.java

package org.dao.impl; 

import org.dao.*; 

import java.sql.*; 

import org.vo.*; 

import java.util.*; 

public class EmpDAOImpl implements IEmpDAO{ 

  private Connection con; 

  private PreparedStatement stat = null; 

  public EmpDAOImpl(Connection con){ 

    this.con = con; 

  } 

  public boolean doCreate(Emp emp)throws Exception{ 

    String sql = "INSERT INTO emp(empno,ename,job,hiredate,sal) VALUES(?,?,?,?,?)"; 

    stat = con.prepareStatement(sql); 

    stat.setInt(1,emp.getEmpno()); 

    stat.setString(2,emp.getEname()); 

    stat.setString(3,emp.getJob()); 

    stat.setDate(4,new java.sql.Date(emp.getHireDate().getTime())); 

    stat.setFloat(5,emp.getSal()); 

    int update = stat.executeUpdate(); 

    if(update>0){ 

      return true; 

    } 

    else{ 

      return false; 

    } 

  } 

  public List<Emp> findAll()throws Exception{ 

    String sql = "SELECT empno,ename,job,hiredate,sal FROM emp"; 

    stat = con.prepareStatement(sql); 

    ResultSet rs = stat.executeQuery(); 

    Emp emp = null; 

    List<Emp> list = new ArrayList<Emp>(); 

    while(rs.next()){ 

      int empno = rs.getInt(1); 

      String ename = rs.getString(2); 

      String job = rs.getString(3); 

      float sal = rs.getFloat(5); 

      emp = new Emp(); 

      emp.setEmpno(empno); 

      emp.setEname(ename); 

      emp.setJob(job); 

      emp.setHireDate(rs.getDate(4)); 

      emp.setSal(sal); 

      list.add(emp); 

    } 

    return list; 

  } 

  public Emp findById(int empno)throws Exception{ 

    String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE empno=?"; 

    stat = con.prepareStatement(sql); 

    stat.setInt(1,empno); 

    ResultSet rs = stat.executeQuery(); 

    Emp emp = null; 

    if(rs.next()){ 

      String ename = rs.getString(2); 

      String job = rs.getString(3); 

      float sal = rs.getFloat(5); 

      emp = new Emp(); 

      emp.setEmpno(empno); 

      emp.setEname(ename); 

      emp.setJob(job); 

      emp.setHireDate(rs.getDate(4)); 

      emp.setSal(sal); 

    } 

    return emp; 

  } 

5.EmpDAOProxy.java

package org.dao.impl; 

import org.dao.*; 

import java.sql.*; 

import org.vo.*; 

import java.util.*; 

import org.dbc.*; 

public class EmpDAOProxy implements IEmpDAO{ 

  private DatabaseConnection dbc; 

  private IEmpDAO dao = null; 

  public EmpDAOProxy()throws Exception{ 

    dbc = new DatabaseConnection(); 

    dao = new EmpDAOImpl(dbc.getConnection()); 

  } 

  public boolean doCreate(Emp emp)throws Exception{ 

    boolean flag = false; 

    if(dao.findById(emp.getEmpno())==null){ 

      flag = dao.doCreate(emp); 

    } 

    dbc.close(); 

    return flag; 

  } 

  public List<Emp> findAll()throws Exception{ 

    List<Emp>list = dao.findAll(); 

    dbc.close(); 

    return list; 

  } 

  public Emp findById(int empno)throws Exception{ 

    Emp emp = dao.findById(empno); 

    dbc.close(); 

    return emp; 

  } 

6.DAOFactory.java

package org.dao.factory; 

import org.dao.*; 

import java.sql.*; 

import org.vo.*; 

import java.util.*; 

import org.dbc.*; 

import org.dao.impl.*; 

public class DAOFactory{ 

  public static IEmpDAO getInstance(){ 

    IEmpDAO dao = null; 

    try{ 

      dao = new EmpDAOProxy();   

    } 

    catch(Exception e){ 

      e.printStackTrace(); 

    } 

    return dao; 

  } 

7.TestDAO.java

package org.dao.test; 

import org.dao.factory.*; 

import org.vo.*; 

import org.dao.*; 

public class TestDAO{ 

  public static void main(String args[])throws Exception{ 

    Emp emp = null; 

    for(int i=0;i<5;i++){ 

      emp = new Emp(); 

      emp.setEmpno(i); 

      emp.setEname("xiazdong-"+i); 

      emp.setJob("stu-"+i); 

      emp.setHireDate(new java.util.Date()); 

      emp.setSal(500*i); 

      DAOFactory.getInstance().doCreate(emp); 

    } 

  } 

经过DAO设计模式,能够在JSP中屏蔽了数据库链接的操做,达到JSP只负责显示的效果。

//对应

String sql = "INSERT INTO emp_table(ename,job,sal,hiredate) VALUES(?,?,?,?)"; 

    stat = (PreparedStatement) con.prepareStatement(sql); 

    stat.setString(1,emp.getEname()); 

    stat.setString(2,emp.getJob()); 

    stat.setFloat(3,emp.getSal());

相关文章
相关标签/搜索