DAO 设计模式

介绍

DAO功能是数据操作.
客户发送数据到显示层,显示层发送数据到业务层,业务发送数据到数据层,数据层进行持久化.即.保存进入databases

一些简称 BO 业务对象的简称 DAO 一个数据访问对象,增删查改 PO数据库一条记录,映射成javaBean对象,拥有getter/setter方法

为什么使用

把jdbc的操作进行分离,即数据库的操作和业务进行分离,javabean是把视图和业务进行分离,dao是把数据库的操作和业务逻辑进行分离.

DAO组成

VO

属性,get set 方法组成.VO是数据库中记录的映射.

DAO

定义操作的接口
用于定义数据库的原子化操作,增删查改

Impl

对接口的实现

Proxy

代理实现类,通过代理类,用来调用真实的对象的操作

Factory

工厂类,通过工厂,产生DAO实例化对象

DAO栗子

一个雇员表如下
NO | 列名称 | 描述
----|-------|-----
1 | empno | 雇员编号 数字表示 长度4位
2 | ename | 雇员姓名 字符串表示 长度10位字符串
3 | job | 雇员工作
4 | hiredate | 雇佣日期
5 | sal | 基本工资 小数表示 小数2位 整数 5位

VO

数据库关系映射如下

package com.ming.vo;

import java.util.Date;
// 对数据库记录的映射
public class Emp {
    // 雇员编号
    private int empno;
    // 姓名
    private String ename;
    // 职位
    private String job;
    // 日期
    private Date hiredate;
    // 基本工资
    private float sal;

    public int getEmpno() {
        return empno;
    }

    public String getEname() {
        return ename;
    }

    public String getJob() {
        return job;
    }

    public Date getHiredate() {
        return hiredate;
    }

    public float getSal() {
        return sal;
    }

    public void setEmpno(int empno) {
        this.empno = empno;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

    public void setSal(float sal) {
        this.sal = sal;
    }
}

数据库连接

定义接口

package com.ming.dbc;

import java.sql.Connection;
// 数据库连接
public interface DataBaseConnection {
    public Connection getConnection();
    public void close() throws Exception;
}

实现该接口

package com.ming.dbc;

import java.sql.*;

// mysql数据库连接实栗
public class MysqlDatabaseConnection implements DataBaseConnection{
    private static final String DBDRIVER  = "com.mysql.cj.jdbc.Driver";
    private static final String DBURL = "jdbc:mysql://47.94.95.84:32786/test";
    private static final String DBUSER = "test";
    private static final String DBPASSWORD = "ABCcba20170607";
    private Connection connection = null;
    public MysqlDatabaseConnection() throws Exception {
        try{
            Class.forName(DBDRIVER);
            this.connection = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);
        }catch (Exception e){
            throw e;
        }
    }
    // 获得连接
    @Override
    public Connection getConnection(){
        return this.connection;
    }
    // 关闭连接
    @Override
    public void close() throws Exception{
        if(this.connection != null){
            try{
                this.connection.close();
            }catch (Exception e){
                throw e;
            }
        }
    }
}

设置工厂

package com.ming.dbc;

// 数据库连接工厂
public class DatabaseConnectionFactory {
    // 获得实栗
    public static DataBaseConnection getDataBaseConnection() throws Exception{
        return new MysqlDatabaseConnection();
    }
}

dao

定义dao接口

package com.ming.dao;

import com.ming.vo.Emp;

import java.util.List;

// 定义dao接口
public interface IEmpDAO {
    /**
     * 数据库增加操作 以doXXX方式命名
     * @param emp 增加数据的对象
     * @return 成功标记
     * @throws Exception 异常继续向上抛出
    **/
    public boolean doCreate(Emp emp) throws Exception;

    /**
     *
     * 查询全部数据 一般以findXXXX命名
     * @param keyWord 查询关键字
     * @return 返回查询结果 一个Emp对象表示一行记录
     * @throws Exception 异常继续抛出
     */
    public List<Emp> findAll(String keyWorld) throws Exception;

    /**
     * 根据雇员编号查询雇员信息
     * @param empno 雇员编号
     * @return 雇员vo对象
     * @throws Exception 异常向上抛出
     */
    public Emp findByid(int empno) throws Exception;
}

实现接口

package com.ming.dao;

import com.ming.vo.Emp;
import com.mysql.cj.protocol.Resultset;

import javax.xml.transform.Result;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

// DAO实栗
public class EmpDAOImpl implements IEmpDAO {
    // 数据库连接对象
    private Connection connection = null;
    // 数据库操作方法
    private PreparedStatement preparedStatement = null;

    // 构造方法注入数据库连接
    public EmpDAOImpl(Connection _connection){
        this.connection = _connection;
    }

    /**
     * 数据库增加操作 以doXXX方式命名
     *  实现数据库增加操作
     * @param emp 增加数据的对象
     * @return 成功标记
     * @throws Exception 异常继续向上抛出
     **/
    @Override
    public boolean doCreate(Emp emp) throws Exception {
        // 定义标志位
        boolean flag = false;
        // sql
        String sql = "INSERT INTO emp(empno, ename, job, hiredate, sal) VALUES (?, ?, ?, ?, ?);";
        // 实例化操作对象
        this.preparedStatement = this.connection.prepareStatement(sql);
        // 赋值操作
        this.preparedStatement.setInt(1, emp.getEmpno());
        this.preparedStatement.setString(2, emp.getEname());
        this.preparedStatement.setString(3, emp.getJob());
        this.preparedStatement.setDate(4, new Date(emp.getHiredate().getTime()));
        this.preparedStatement.setFloat(5, emp.getSal());
        // 更新行数大于0
        if(this.preparedStatement.executeUpdate() > 0){
            flag = true;
        }
        this.preparedStatement.close();
        return flag;
    }

    /**
     * 查询全部数据 一般以findXXXX命名
     *
     * @param keyWorld@return 返回查询结果 一个Emp对象表示一行记录
     * @throws Exception 异常继续抛出
     */
    @Override
    public List<Emp> findAll(String keyWorld) throws Exception {
        List<Emp> all = new ArrayList<Emp>();
        String sql = "SELECT empno, ename, job, hiredate, sal FROM emp WHERE ename like ? OR job like ?";
        this.preparedStatement = this.connection.prepareStatement(sql);
        this.preparedStatement.setString(1, "%" + keyWorld + "%");
        this.preparedStatement.setString(2, "%" + keyWorld + "%");
        ResultSet resultSet = this.preparedStatement.executeQuery();
        Emp emp = null;
        while(resultSet.next()){
            emp = new Emp();
            emp.setEmpno(resultSet.getInt(1));
            emp.setEname(resultSet.getString(2));
            emp.setJob(resultSet.getString(3));
            emp.setHiredate(resultSet.getDate(4));
            emp.setSal(resultSet.getFloat(5));
            all.add(emp);
        }
        this.preparedStatement.close();
        return all;
    }

    /**
     * 根据雇员编号查询雇员信息
     *
     * @param empno 雇员编号
     * @return 雇员vo对象
     * @throws Exception 异常向上抛出
     */
    @Override
    public Emp findByid(int empno) throws Exception {
        // 声明Emp对象
        Emp emp = null;
        String sql = "SELECT empno, ename, job, hiredate, sal FROM emp WHERE empno = ?";
        this.preparedStatement = this.connection.prepareStatement(sql);
        this.preparedStatement.setInt(1, empno);
        ResultSet resultset = this.preparedStatement.executeQuery();
        if(resultset.next()){
            emp = new Emp();
            emp.setEmpno(resultset.getInt(1));
            emp.setEname(resultset.getString(2));
            emp.setJob(resultset.getString(3));
            emp.setHiredate(resultset.getDate(4));
            emp.setSal(resultset.getFloat(5));
        }
        this.preparedStatement.close();
        return emp;
    }
}

定义代理类

package com.ming.dao;

import com.ming.dbc.DataBaseConnection;
import com.ming.dbc.DatabaseConnectionFactory;
import com.ming.vo.Emp;

import java.util.List;

// 数据库连接代理类
public class EmpDAOProxy implements IEmpDAO{
    private DataBaseConnection dataBaseConnection = null;
    private IEmpDAO dao = null;
    // 实例化连接
    public EmpDAOProxy() throws Exception{
        // 获得连接对象
        dataBaseConnection = DatabaseConnectionFactory.getDataBaseConnection();
        // 实例化主题类
        this.dao = new EmpDAOImpl(dataBaseConnection.getConnection());
    }
    /**
     * 数据库增加操作 以doXXX方式命名
     *
     * @param emp 增加数据的对象
     * @return 成功标记
     * @throws Exception 异常继续向上抛出
     **/
    @Override
    public boolean doCreate(Emp emp) throws Exception {
        boolean flag = false;
        try{
            // 插入雇员编号不存在
            if(this.dao.findByid(emp.getEmpno()) == null){
                // 调用主题直接创建
                flag = this.dao.doCreate(emp);
            }
        }catch (Exception e){
            throw e;
        }finally {
            this.dataBaseConnection.close();
        }
        return flag;
    }

    /**
     * 查询全部数据 一般以findXXXX命名
     *
     * @param keyWorld@return 返回查询结果 一个Emp对象表示一行记录
     * @throws Exception 异常继续抛出
     */
    @Override
    public List<Emp> findAll(String keyWorld) throws Exception {
        List<Emp> all = null;
        try{
            all = this.dao.findAll(keyWorld);
        }catch (Exception e){
            throw e;
        }finally {
            this.dataBaseConnection.close();
        }
        return all;
    }

    /**
     * 根据雇员编号查询雇员信息
     *
     * @param empno 雇员编号
     * @return 雇员vo对象
     * @throws Exception 异常向上抛出
     */
    @Override
    public Emp findByid(int empno) throws Exception {
        Emp emp = null;
        try{
            emp = this.dao.findByid(empno);
        }catch (Exception e){
            throw  e;
        }finally {
            this.dataBaseConnection.close();
        }
        return emp;
    }
}

编写测试类

package com.ming.dao;

import com.ming.vo.Emp;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import javax.swing.text.html.HTMLDocument;
import javax.xml.crypto.Data;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

import static org.junit.Assert.*;

public class EmpDAOProxyTest {
    EmpDAOProxy empDAOProxy = null;
    Emp emp = null;
    String keyWords = null;
    @Before
    public void setUp() throws Exception {
        empDAOProxy = new EmpDAOProxy();
        emp = new Emp();
        emp.setEname("ae3365eaa");
        emp.setEmpno(2223453);
        emp.setSal(23.2325624f);
        emp.setHiredate(new Date());
        emp.setJob("ming4654");
        keyWords = new String("ming4654");
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void doCreate() throws Exception {
        if(empDAOProxy.doCreate(emp)){
            System.out.println("增加一条记录成功");
        }else{
            System.out.println("增加一条记录失败");
        }
    }

    @Test
    public void findAll() throws Exception {
        List<Emp> result = empDAOProxy.findAll(this.keyWords);
        // 迭代器遍历对象
        Iterator iterator = result.iterator();
        // 循环迭代
        while(iterator.hasNext()){
            Emp tmp = (Emp)iterator.next();
            System.out.println(emp.getEname() + emp.getJob() + emp.getEmpno() + emp.getHiredate() + emp.getSal());
        }
    }

    @Test
    public void findByid() throws Exception{
        int emp = 2223453;
        Emp tmp = empDAOProxy.findByid(emp);
        System.out.println(tmp.getEname());
    }
}

设置工厂

package com.ming.dao;

public class DAOFactory {
    public static IEmpDAO getIEmpDAOInstance() throws Exception{
        return new EmpDAOProxy();
    }
}

设置插入界面jsp

<%--
  Created by IntelliJ IDEA.
  User: ming
  Date: 19-3-16
  Time: 上午3:10
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>增加雇员</title>
</head>
<body>
<form action="./emp_insert_do.jsp" method="post">
    雇员编号 <input type="text" name="empno"/>
    雇员姓名 <input type="text" name="ename"/>
    职位 <input type="text" name="job"/>
    日期 <input type="text" name="hiredate"/>
    工资 <input type="text" name="sal"/>
    <input type="submit" value="注册"/>
    <input type="reset" value="恢复"/>
</form>
</body>
</html>

设置插入成功jsp

<%@ page import="com.ming.vo.Emp" %>
<%@ page import="com.ming.dao.DAOFactory" %>
<%@ page import="java.util.Date" %>
<%--
  Created by IntelliJ IDEA.
  User: ming
  Date: 19-3-16
  Time: 上午3:12
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    Emp emp = new Emp();
    emp.setJob(request.getParameter("job"));
    emp.setEmpno(Integer.parseInt(request.getParameter("empno")));
    emp.setHiredate(new Date());
    emp.setEname("eee");
    emp.setSal(34.45f);
    try{
        if(DAOFactory.getIEmpDAOInstance().doCreate(emp)){
%>
    <h3>添加成功</h3>
<%
%>
<%
        }
    }catch (Exception e){
        e.printStackTrace();
    }
%>
</body>
</html>

原文地址:https://www.cnblogs.com/melovemingming/p/10549855.html

时间: 2024-10-24 23:45:42

DAO 设计模式的相关文章

DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据库资源中间. DAO模式实际上是两个模式的组合,即Data Accessor (数据访问者)模式和 Active Domain Object(领域对象)模式.Data Accessor 模式实现了数据访问和业务逻辑的分离:Active Domain Object 模式实现了业务数据的对象化封装. 需要注意的是,DAO设计模式是Java EE中的设计模式,而非Ja

Java学习之DAO设计模式

DAO设计模式是一个javaEE里的设计模式,DAO是Data Access Object 数据访问接口. 一个典型的DAO实现有三个组件: 1.一个DAO接口 2.一个DAO接口的具体类: 3.数据传递对象(DTO)或者叫值对象(VO)或者叫领域模型(domain)[个人认为就是数据库表里对应的java对象类] 举个例子: 首先在数据库建一个表Person有四个字段id(pk),name,age,desc(描述): 然后建立domain 1 package com.gh.domain; 2 3

jsp DAO设计模式

DAO(Data Access Objects)设计模式是属于J2EE体系架构中的数据层的操作. 一.为什么要用DAO? 比较在JSP页面中使用JDBC来连接数据库,这样导致了JSP页面中包含了大量的HTML代码和JSP代码,将显示和功能代码混在一起,难以维护.并且在JSP页面中使用JDBC代码,必须导入相应的"java.sql.*"包.基于使得JSP页面专注于数据的表现的思想,我们只是希望JSP主要负责数据的显示,而不需要关注数据的来源和途径.同时在JSP进行JDBC操作,重复编码太

JavaBean在DAO设计模式简介

一.信息系统开发框架 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层是client,简单的来说就是浏览器. 2.显示层:JSP/Servlet,用于给浏览器显示. 3.业务层:对于数据层的原子操作进行整合. 4.数据层:对于数据库进行的原子操作,添加.删除等: 二.DAO(Data Access Object)介绍 DAO应用在数据层那块,用于訪问数据库,对数据库进行操作的类. 三.DAO设计模式的结构 DAO设计模式一般分为几

JavaBean中DAO设计模式介绍

一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/Servlet,用于给浏览器显示. 3.业务层:对于数据层的原子操作进行整合. 4.数据层:对于数据库进行的原子操作,增加.删除等: 二.DAO(Data Access Object)介绍 DAO应用在数据层那块,用于访问数据库,对数据库进行操作的类. 三.DAO设计模式的结构 DAO设计模式一般分为几个

JavaWeb技术(二):DAO设计模式

1. DAO全称:Data Access Object , 数据访问对象.使用DAO设计模式来封装数据持久化层的所有操作(CRUD),使得数据访问逻辑和业务逻辑分离,实现解耦的目的. 2. 典型的DAO实现组件:DAO接口 + DAO接口的实现类 3. 事例代码 1)javabean组件:用于数据传输的对象 /** javabean数据传输对象 */ public class Customer { // 和数据库中的表是对应的 private int id; private String nam

【设计模式】:Dao设计模式详解及一个简单的项目(AJAX+JSP+Servlet)

迫于课程结束,老师逼着让做课程设计,就简单花了一天的时间写了个使用dao设计模式的东西~ ~ ~顺带在这里讲解下dao设计模式 把写个这个东西的源代码放上来: http://download.csdn.net/detail/u010800530/8273915 先画一个图,这个图可能能够完整表达出dao设计模式的意思,但是可以在下边通过代码看出来: 一.完成登陆功能(未设计AJAX,等到完成显示列表的时候我们做AJAX): 首先,我们建立一个项目TestJSP 然后,我们写一个login.jsp

DAO设计模式 -- 使用数据库连接类连接MySql数据库并实现添加用户

1. DAO简介    DAO设计模式是属于J2EE数据库层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性. 2. DAO各部分详解    DAO设计模式包括5个重要的部分,分别为数据库连接类,VO类,DAO接口,DAO实现类以及DAO工厂类.   2-1 数据库连接类:    数据库连接类的主要功能就是连接数据库并获得连接对象,以及关闭数据库.通过数据库连接类可以大大地简化开发,在需要进行数据库连接时,只需要创建该类的实例,并调用其中的方法就可以获得数据库连接对象和关闭数据库而

MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4059514.html 联系方式:[email protected] [正文] 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据库资源中间. DAO模式实际上是两个模式的组合,即Data Accessor (数据

J2EE之DAO设计模式及简单实现

JAVAEE(Java Enterprise Edition ) 模式 : DAO模式 因此在了解DAO模式之前,我们先来学习一下Java EE的体系结构: (一)JavaEE体系结构 客户端: 客户端层:DHTML(Dynanic HTML:HTML+CSS+JavaScript).JavaApplication(带有main函数的Java程序) 服务器端 web层(接收请求,生成响应):Servlet.JSP 业务逻辑层(编写程序业务处理流程):EJB(企业版JavaBean),例如容器管理