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单例模式实现静态内部类方法示例等,有什么问题可以随时留言,感谢大家!

时间: 2017-10-30

Java的Spring框架中DAO数据访问对象的使用示例

Spring DAO之JDBC   Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术, 如JDBC,Hibernate或者JDO等.它不仅可以让你方便地在这些持久化技术间切换, 而且让你在编码的时候不用考虑处理各种技术中特定的异常. 为了便于以一种一致的方式使用各种数据访问技术,如JDBC.JDO和Hibernate, Spring提供了一套抽象DAO类供你扩展.这些抽象类提供了一些方法,通过它们你可以 获得与你当前使用的数据访问技术相关的数据源和其

基于java中的PO VO DAO BO POJO(详解)

一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的ava对象. 最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合PO中应该不包含任何对数据库的操作. 二.VO:value object值对象.通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已.但应是抽象出的业务对象可以和表对应也可以不这根据业务的需要 三.DAO:data access object 数据访问对象,此对象用于访问数据库.通常和PO结合使用,DAO中包含了各种

全面了解JAVA_BaseDAO数据处理类

实例如下: package dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class BaseDao { private String drive="com.microsoft.sqlserver.jdbc.SQLSer

通过代理类实现java连接数据库(使用dao层操作数据)实例分享

首先,我们在一个java文件中定义要存储的结构类型: 复制代码 代码如下: import java.util.Date ;/** * * @author Nero */public class Emp {    private int empno ;    private String ename ;    private String job ;    private Date hiredate ;    private float sal ;    public void setEmpno(

Java的MyBatis+Spring框架中使用数据访问对象DAO模式的方法

SqlSessionTemplate SqlSessionTemplate是MyBatis-Spring的核心.这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常.SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用. 当调用SQL方法时,包含从映射器getMapper()方法返回的方法,SqlSessionTemplate将会保证使用的SqlSession是和当前Spring的事务相关的.此外,它管理session的生命周期,包

Yii学习总结之数据访问对象 (DAO)

Yii提供了强大的数据库编程支持.Yii数据访问对象(DAO)建立在PHP的数据对象(PDO)extension上,使得在一个单一的统一的接口可以访问不同的数据库管理系统(DBMS).使用Yii的DAO开发的应用程序可以很容易地切换使用不同的数据库管理系统,而不需要修改数据访问代码. 数据访问对象(DAO) 对访问存储在不同数据库管理系统(DBMS)中的数据提供了一个通用的API. 因此,在将底层 DBMS 更换为另一个时,无需修改使用了 DAO 访问数据的代码. Yii DAO 基于 PHP

详解Java的Spring框架中的事务管理方式

数据库事务是被当作单个工作单元的操作序列.这些操作要么全部完成或全部不成功.事务管理是面向企业应用程序,以确保数据的完整性和一致性RDBMS中的重要组成部分.事务的概念可以用下面的描述为ACID四个关键属性来描述: 原子性: 一个事务应该被视为单个操作单元表示的操作的任一整个序列是成功的或不成功的. 一致性: 这代表了数据库的参照完整性,在桌等唯一主键的一致性 隔离性: 可能有很多事务处理相同的数据集的同时,每个事务都应由他人隔离,以防止数据损坏. 持久性: 一旦事务完成,本次事务的结果必须作出

Java的Spring框架中AOP项目的一般配置和部署教程

0.关于AOP 面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),是软件开发中的一个热点,也是Spring框架中的一个重要内容.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. AOP是OOP的延续. 主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等. 主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过

深入理解Java的Spring框架中的IOC容器

Spring IOC的原型 spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了spring容器对依赖的全局控制. 这样做的好处是什么呢? 当然就是所谓的"解耦"了,可以使得程序的各模块之间的关系更为独立,只需要spring控制这些模块之间的依赖关系并在容器启动和初始化的过程中将依据这些依赖关系创建.管理和维护这些模块就好,如果需要改变模块间的依赖关系的话,甚至都不需要改变程序代码,只需要将

设计模式在Spring框架中的应用汇总

这篇文章主要介绍了设计模式在Spring框架中的应用汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在开始正文之前,请你先思考几个问题: 你项目中有使用哪些 GOF 设计模式 说一说 GOF 23 种设计模式的设计理念 说说 Spring 框架中如何实现设计模式 假设我是面试官问起了你这些面试题,你该如何回答呢,请先思考一分钟. 好的,我们开始进入正题.设计模式实践里面提供了许多经久不衰的解决方案和最佳方案.这里,GOF 设计模式主要分为三

使用spring框架中的组件发送邮件功能说明

Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务器端的开发.从简单性.可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益. 首先进入自己的QQ邮箱,在设置中修改账户信息 然后来至底部 点击开启,再用手机发送对应信息到指定号码,然后点击我已发送 获取授权码 注意提示: 到这里,相信你已经开通了SMTP服务,这样就可以在java code发送邮件了 接下来的是S

Spring框架中 @Autowired 和 @Resource 注解的区别

Spring框架中 @Autowired 和 @Resource 注解的区别 在 spring 框架中,除了使用其特有的注解外,使用基于 JSR-250 的注解,它包括 @PostConstruct, @PreDestroy 和 @Resource 注释. 首先,咱们简单了解 @PostConstruct 和 @PreDestroy 注释: 为了定义一个 bean 的安装和卸载,我们可以使用 init-method 和 destroy-method 参数简单的声明一下 ,其中 init-meth

java获取两个数组中不同数据的方法

本文实例讲述了java获取两个数组中不同数据的方法.分享给大家供大家参考.具体实现方法如下: public static <T> List<T> compare(T[] t1, T[] t2) { List<T> list1 = Arrays.asList(t1); List<T> list2 = new ArrayList<T>(); for (T t : t2) { if (!list1.contains(t)) { list2.add(t)