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中的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_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的MyBatis+Spring框架中使用数据访问对象DAO模式的方法

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

通过代理类实现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 JDK 动态代理类分析(java.lang.reflect.Proxy)

详解java JDK 动态代理类分析(java.lang.reflect.Proxy) /** * JDK 动态代理类分析(java.lang.reflect.Proxy使用) * * @author 张明学 * */ public class ProxyStudy { @SuppressWarnings("unchecked") public static void main(String[] args) throws Exception { // 动态代理类:通用指定类加载器,和接

java 设计模式(DAO)的实例详解

java 设计模式(DAO)的实例详解 应用场景:在Java程序中,经常需要把数据持久化,也需要获取持久化的数据,但是在进行数据持久化的过程中面临诸多问题(如:数据源不同.存储类型不同.供应商不同.访问方式不同等等),请问如何能以统一的接口进行数据持久化的操作? 其实这个我没学号(≧ ﹏ ≦).我的理解就是一个产品面向的用户不是单一的,所以我们要兼容许多情况如前面提到的数据源不同.存储类型不同.供应商不同.访问方式不同等等. ★ 解决方案 DAO的理解: 1.DAO其实是利用组合工厂模式来解决问

Java生产1-100的随机数简单实例(分享)

直接调用Math里面的random即可,简单方便 int i = (int)(Math.random()*100+1); 以上这篇Java生产1-100的随机数简单实例(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

java实现表格tr拖动的实例(分享)

实现功能:实现表格tr拖动,并保存因为拖动改变的等级. jsp代码 <div id="mainContainer"> <div class="contentCol"> <div id="b_center"> <div class="mod mod1 parent-table" id="launch-detail-table"> <div class=&q

java留言管理系统中模糊查询实例分享

本文分享了一个基于MVC+DAO的留言管理系统,包含增删改查,其中查询,有全部查询和按关键字进行模糊查询的功能,具体内容如下 NoteDAO.Java package cn.mldn.lxh.note.dao ; import java.util.* ; import cn.mldn.lxh.note.vo.* ; public interface NoteDAO { // 增加操作 public void insert(Note note) throws Exception ; // 修改操作

java中vector与hashtable操作实例分享

众所周知,java中vector与hashtable是线程安全的,主要是java对两者的操作都加上了synchronized,也就是上锁了.因此 在vector与hashtable的操作是不会出现问题.但是有一种情况:就是将一个hashtable copy到另一个hashtable时,假如使用putAll方法的花,会抛出一个 java.util.ConcurrentModificationException异常.先上代码: TestSync.java 复制代码 代码如下: public clas

java dom4j解析xml文件代码实例分享

解析xml文件有两种方式,一种是利用Dom去解析,这种方式写起代码比较麻烦,对于刚入手的程序员来说比较容易出问题:第二种就是使用Dom4j包去解析在要使用Dom4j包的时候,肯定要先引入包 复制代码 代码如下: import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;import java.util.Iterator; import org.dom4j.Docum

JDK动态代理之ProxyGenerator生成代理类的字节码文件解析

通过前面几篇的分析,我们知道代理类是通过Proxy类的ProxyClassFactory工厂生成的,这个工厂类会去调用ProxyGenerator类的generateProxyClass()方法来生成代理类的字节码.ProxyGenerator这个类存放在sun.misc包下,我们可以通过OpenJDK源码来找到这个类,该类的generateProxyClass()静态方法的核心内容就是去调用generateClassFile()实例方法来生成Class文件.我们直接来看generateClas

java连接数据库增、删、改、查工具类

java连接数据库增.删.改.查工具类 数据库操作工具类,因为各厂家数据库的分页条件不同,目前支持Mysql.Oracle.Postgresql的分页查询在Postgresql环境测试过了,其他数据库未测试.sql语句需要使用预编译形式的 复制代码 代码如下: package db; import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.R