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

 更新时间:2017年11月02日 09:46:02   作者:gz153016  
这篇文章主要介绍了Java之dao模式详解及代码示例,具有一定参考价值,需要的朋友可以了解下。

什么是dao模式?

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

一、信息系统的开发架构

客户层-------显示层-------业务层---------数据层---------数据库

1.客户层:客户层就是客户端,简单的来说就是浏览器。
2.显示层:JSP/Servlet,用于给浏览器显示。
3.业务层:对于数据层的原子操作进行整合。
4.数据层:对于数据库进行的原子操作,增加、删除等;

二、DAO(Data Access Object)介绍

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

三、DAO设计模式的结构

DAO设计模式一般分为几个类:

1.VO(Value Object):一个用于存放网页的一行数据即一条记录的类,比如网页要显示一个用户的信息,则这个类就是用户的类。
2.DatabaseConnection:用于打开和关闭数据库。
3.DAO接口:用于声明对于数据库的操作。
4.DAOImpl:必须实现DAO接口,真实实现DAO接口的函数,但是不包括数据库的打开和关闭。
5.DAOProxy:也是实现DAO接口,但是只需要借助DAOImpl即可,但是包括数据库的打开和关闭。
6.DAOFactory:工厂类,含有getInstance()创建一个Proxy类。

四、DAO的好处

DAO的好处就是提供给用户的接口只有DAO的接口,所以如果用户想添加数据,只需要调用create函数即可,不需要数据库的操作。

五、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());

总结

以上就是本文关于Java之dao模式详解及代码示例的全部内容,希望对大家有所帮助,欢迎参阅:Java设计模式笔记之抽象工厂代码示例Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解Java单例模式实现静态内部类方法示例等,有什么问题可以随时留言,感谢大家!

相关文章

  • Spring代理对象导致的获取不到原生对象注解的解决

    Spring代理对象导致的获取不到原生对象注解的解决

    本文主要介绍了Spring代理对象导致的获取不到原生对象注解的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Java数据结构之复杂度篇

    Java数据结构之复杂度篇

    算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小
    2022-01-01
  • Springboot整合freemarker 404问题解决方案

    Springboot整合freemarker 404问题解决方案

    这篇文章主要介绍了Springboot整合freemarker 404问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • SpringBoot集成内存数据库Derby的实践

    SpringBoot集成内存数据库Derby的实践

    像H2、hsqldb、derby、sqlite这样的内存数据库,小巧可爱,做小型服务端演示程序,非常好用。最大特点就是不需要你另外安装一个数据库。本文主要介绍了SpringBoot集成内存数据库Derby,感兴趣的可以了解一下
    2021-09-09
  • Java迭代器与Collection接口超详细讲解

    Java迭代器与Collection接口超详细讲解

    Collection也称集合,集合概述:集合是Java中提供的一种容器,可以用来存储多个数据。Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合
    2022-07-07
  • 简单聊聊Java中验证码功能的实现

    简单聊聊Java中验证码功能的实现

    相信大家都经常接触到验证码的,毕竟平时上网也能遇到各种验证码,需要我们输入验证码进行验证我们是人类,本篇文章就从这几个方面出发说说验证码,废话不多说,下面开始正文
    2023-06-06
  • dm.jdbc.driver.DMException网络通信异常的解决过程

    dm.jdbc.driver.DMException网络通信异常的解决过程

    最近一个项目里面出现了一个比较诡异的问题,给大家分享下,这篇文章主要给大家介绍了关于dm.jdbc.driver.DMException网络通信异常的解决过程,需要的朋友可以参考下
    2023-02-02
  • Java线性表的顺序表示及实现

    Java线性表的顺序表示及实现

    这篇文章主要介绍了Java线性表的顺序表示及实现,顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中
    2022-07-07
  • Java 中的HashMap详解和使用示例_动力节点Java学院整理

    Java 中的HashMap详解和使用示例_动力节点Java学院整理

    这篇文章主要介绍了Java 中的HashMap详解和使用示例_动力节点Java学院整理,需要的朋友可以参考下
    2017-05-05
  • SpringBoot+Kotlin中使用GRPC实现服务通信的示例代码

    SpringBoot+Kotlin中使用GRPC实现服务通信的示例代码

    本文主要介绍了SpringBoot+Kotlin中使用GRPC实现服务通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论