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

(0)

相关推荐

  • 全面了解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的生命周期,包

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

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

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

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

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

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

  • Java中的静态内部类详解及代码示例

    1. 什么是静态内部类 在Java中有静态代码块.静态变量.静态方法,当然也有静态类,但Java中的静态类只能是Java的内部类,也称为静态嵌套类.静态内部类的定义如下: public class OuterClass { static class StaticInnerClass { ... } } 在介绍静态内部类之前,首先要弄清楚静态内部类与Java其它内部类的区别. 2. 内部类 什么是内部类?将一个类的定义放在另一个类的内部,就是内部类.Java的内部类主要分为成员内部类.局部内部类.

  • Java中Volatile关键字详解及代码示例

    一.基本概念 先补充一下概念:Java内存模型中的可见性.原子性和有序性. 可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉.通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情.为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制. 可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的.也就是一个线程修改的结果.另一个线程马上就能看到.比如:用volatile修饰的变量,就会具有可见性.volatile修饰的

  • Java逃逸分析详解及代码示例

    概念引入 我们都知道,Java 创建的对象都是被分配到堆内存上,但是事实并不是这么绝对,通过对Java对象分配的过程分析,可以知道有两个地方会导致Java中创建出来的对象并一定分别在所认为的堆上.这两个点分别是Java中的逃逸分析和TLAB(Thread Local Allocation Buffer)线程私有的缓存区. 基本概念介绍 逃逸分析,是一种可以有效减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法.通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的

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

    第1部分 HashSet介绍 HashSet 简介 HashSet 是一个没有重复元素的集合. 它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素. HashSet是非同步的.如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步.这通常是通过对自然封装该 set 的对象执行同步操作来完成的.如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来"包装" set.

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

    第1部分 HashMap介绍 HashMap简介 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.Serializable接口. HashMap 的实现不是同步的,这意味着它不是线程安全的.它的key.value都可以为null.此外,HashMap中的映射不是有序的. HashMap 的实例有两个参数影响其性能:"初始容量" 和 "加载因子&quo

  • 集合框架(Collections Framework)详解及代码示例

    简介 集合和数组的区别: 数组存储基础数据类型,且每一个数组都只能存储一种数据类型的数据,空间不可变. 集合存储对象,一个集合中可以存储多种类型的对象.空间可变. 严格地说,集合是存储对象的引用,每个对象都称为集合的元素.根据存储时数据结构的不同,分为几类集合.但对象不管存储到什么类型的集合中,既然集合能存储任何类型的对象,这些对象在存储时都必须向上转型为Object类型,也就是说,集合中的元素都是Object类型的对象. 既然是集合,无论分为几类,它都有集合的共性,也就是说虽然存储时数据结构不

  • SpringMVC中的拦截器详解及代码示例

    本文研究的主要是SpringMVC中的拦截器的介绍及实例代码,配置等内容,具体如下. Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用方法. 1. springmvc拦截器的定义和配置 1.1 springmvc拦截器的定义 在springmvc中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的三个方法,如下: /

  • JAVA 静态代理模式详解及实例应用

    JAVA 静态代理模式 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 代理模式说白了就是"真实对象"的代表,在访问对象时引入一定程度的间接性,因为这种间接性可以附加多种用途. 在这实现代码之前,先讲一个简单的生活故事,我们都知道我们周边有很多公司有房屋买卖或租赁的业务,比如链家(LianJia),但链家本身是不存在任何实际房屋资产的,他所售卖租赁的房屋均需要房屋产权所有人(HomeMaster)提供,才得以实现公司的房源需求:同时公司要的卖房租房业务均需要公司

  • Java设计模式之装饰者模式详解和代码实例

    装饰者模式可以给已经存在的对象动态的添加能力.下面,我将会用一个简单的例子来演示一下如何在程序当中使用装饰者模式. 1.装饰者模式 让我们来假设一下,你正在寻找一个女朋友.有很多来自不同国家的女孩,比如:美国,中国,日本,法国等等,他们每个人都有不一样的个性和兴趣爱好,如果需要在程序当中模拟这么一种情况的话,假设每一个女孩就是一个Java类的话,那么就会有成千上万的类,这样子就会造成类的膨胀,而且这样的设计的可扩展性会比较差.因为如果我们需要一个新的女孩,就需要创建一个新的Java类,这实际上也

随机推荐