成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

dao 設(shè)計(jì)模式

rickchen / 1476人閱讀

摘要:介紹功能是數(shù)據(jù)操作客戶發(fā)送數(shù)據(jù)到顯示層顯示層發(fā)送數(shù)據(jù)到業(yè)務(wù)層業(yè)務(wù)發(fā)送數(shù)據(jù)到數(shù)據(jù)層數(shù)據(jù)層進(jìn)行持久化即保存進(jìn)入一些簡(jiǎn)稱業(yè)務(wù)對(duì)象的簡(jiǎn)稱一個(gè)數(shù)據(jù)訪問對(duì)象增刪查改數(shù)據(jù)庫一條記錄映射成對(duì)象擁有方法為什么使用把的操作進(jìn)行分離即數(shù)據(jù)庫的操作和業(yè)務(wù)進(jìn)行分離是

介紹

DAO功能是數(shù)據(jù)操作.
客戶發(fā)送數(shù)據(jù)到顯示層,顯示層發(fā)送數(shù)據(jù)到業(yè)務(wù)層,業(yè)務(wù)發(fā)送數(shù)據(jù)到數(shù)據(jù)層,數(shù)據(jù)層進(jìn)行持久化.即.保存進(jìn)入databases

一些簡(jiǎn)稱 BO 業(yè)務(wù)對(duì)象的簡(jiǎn)稱 DAO 一個(gè)數(shù)據(jù)訪問對(duì)象,增刪查改 PO數(shù)據(jù)庫一條記錄,映射成javaBean對(duì)象,擁有g(shù)etter/setter方法
為什么使用

把jdbc的操作進(jìn)行分離,即數(shù)據(jù)庫的操作和業(yè)務(wù)進(jìn)行分離,javabean是把視圖和業(yè)務(wù)進(jìn)行分離,dao是把數(shù)據(jù)庫的操作和業(yè)務(wù)邏輯進(jìn)行分離.

DAO組成 VO

屬性,get set 方法組成.VO是數(shù)據(jù)庫中記錄的映射.

DAO

定義操作的接口
用于定義數(shù)據(jù)庫的原子化操作,增刪查改

Impl

對(duì)接口的實(shí)現(xiàn)

Proxy

代理實(shí)現(xiàn)類,通過代理類,用來調(diào)用真實(shí)的對(duì)象的操作

Factory

工廠類,通過工廠,產(chǎn)生DAO實(shí)例化對(duì)象

DAO栗子

一個(gè)雇員表如下

NO 列名稱 描述
1 empno 雇員編號(hào) 數(shù)字表示 長度4位
2 ename 雇員姓名 字符串表示 長度10位字符串
3 job 雇員工作
4 hiredate 雇傭日期
5 sal 基本工資 小數(shù)表示 小數(shù)2位 整數(shù) 5位
VO

數(shù)據(jù)庫關(guān)系映射如下

package com.ming.vo;

import java.util.Date;
// 對(duì)數(shù)據(jù)庫記錄的映射
public class Emp {
    // 雇員編號(hào)
    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;
    }
}
數(shù)據(jù)庫連接

定義接口

package com.ming.dbc;

import java.sql.Connection;
// 數(shù)據(jù)庫連接
public interface DataBaseConnection {
    public Connection getConnection();
    public void close() throws Exception;
}

實(shí)現(xiàn)該接口

package com.ming.dbc;

import java.sql.*;

// mysql數(shù)據(jù)庫連接實(shí)栗
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;
    }
    // 關(guān)閉連接
    @Override
    public void close() throws Exception{
        if(this.connection != null){
            try{
                this.connection.close();
            }catch (Exception e){
                throw e;
            }
        }
    }
}

設(shè)置工廠

package com.ming.dbc;

// 數(shù)據(jù)庫連接工廠
public class DatabaseConnectionFactory {
    // 獲得實(shí)栗
    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 {
    /**
     * 數(shù)據(jù)庫增加操作 以doXXX方式命名
     * @param emp 增加數(shù)據(jù)的對(duì)象
     * @return 成功標(biāo)記
     * @throws Exception 異常繼續(xù)向上拋出
    **/
    public boolean doCreate(Emp emp) throws Exception;

    /**
     *
     * 查詢?nèi)繑?shù)據(jù) 一般以findXXXX命名
     * @param keyWord 查詢關(guān)鍵字
     * @return 返回查詢結(jié)果 一個(gè)Emp對(duì)象表示一行記錄
     * @throws Exception 異常繼續(xù)拋出
     */
    public List findAll(String keyWorld) throws Exception;

    /**
     * 根據(jù)雇員編號(hào)查詢雇員信息
     * @param empno 雇員編號(hào)
     * @return 雇員vo對(duì)象
     * @throws Exception 異常向上拋出
     */
    public Emp findByid(int empno) throws Exception;
}
實(shí)現(xiàn)接口
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實(shí)栗
public class EmpDAOImpl implements IEmpDAO {
    // 數(shù)據(jù)庫連接對(duì)象
    private Connection connection = null;
    // 數(shù)據(jù)庫操作方法
    private PreparedStatement preparedStatement = null;

    // 構(gòu)造方法注入數(shù)據(jù)庫連接
    public EmpDAOImpl(Connection _connection){
        this.connection = _connection;
    }

    /**
     * 數(shù)據(jù)庫增加操作 以doXXX方式命名
     *  實(shí)現(xiàn)數(shù)據(jù)庫增加操作
     * @param emp 增加數(shù)據(jù)的對(duì)象
     * @return 成功標(biāo)記
     * @throws Exception 異常繼續(xù)向上拋出
     **/
    @Override
    public boolean doCreate(Emp emp) throws Exception {
        // 定義標(biāo)志位
        boolean flag = false;
        // sql
        String sql = "INSERT INTO emp(empno, ename, job, hiredate, sal) VALUES (?, ?, ?, ?, ?);";
        // 實(shí)例化操作對(duì)象
        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());
        // 更新行數(shù)大于0
        if(this.preparedStatement.executeUpdate() > 0){
            flag = true;
        }
        this.preparedStatement.close();
        return flag;
    }

    /**
     * 查詢?nèi)繑?shù)據(jù) 一般以findXXXX命名
     *
     * @param keyWorld@return 返回查詢結(jié)果 一個(gè)Emp對(duì)象表示一行記錄
     * @throws Exception 異常繼續(xù)拋出
     */
    @Override
    public List findAll(String keyWorld) throws Exception {
        List all = new ArrayList();
        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;
    }

    /**
     * 根據(jù)雇員編號(hào)查詢雇員信息
     *
     * @param empno 雇員編號(hào)
     * @return 雇員vo對(duì)象
     * @throws Exception 異常向上拋出
     */
    @Override
    public Emp findByid(int empno) throws Exception {
        // 聲明Emp對(duì)象
        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;

// 數(shù)據(jù)庫連接代理類
public class EmpDAOProxy implements IEmpDAO{
    private DataBaseConnection dataBaseConnection = null;
    private IEmpDAO dao = null;
    // 實(shí)例化連接
    public EmpDAOProxy() throws Exception{
        // 獲得連接對(duì)象
        dataBaseConnection = DatabaseConnectionFactory.getDataBaseConnection();
        // 實(shí)例化主題類
        this.dao = new EmpDAOImpl(dataBaseConnection.getConnection());
    }
    /**
     * 數(shù)據(jù)庫增加操作 以doXXX方式命名
     *
     * @param emp 增加數(shù)據(jù)的對(duì)象
     * @return 成功標(biāo)記
     * @throws Exception 異常繼續(xù)向上拋出
     **/
    @Override
    public boolean doCreate(Emp emp) throws Exception {
        boolean flag = false;
        try{
            // 插入雇員編號(hào)不存在
            if(this.dao.findByid(emp.getEmpno()) == null){
                // 調(diào)用主題直接創(chuàng)建
                flag = this.dao.doCreate(emp);
            }
        }catch (Exception e){
            throw e;
        }finally {
            this.dataBaseConnection.close();
        }
        return flag;
    }

    /**
     * 查詢?nèi)繑?shù)據(jù) 一般以findXXXX命名
     *
     * @param keyWorld@return 返回查詢結(jié)果 一個(gè)Emp對(duì)象表示一行記錄
     * @throws Exception 異常繼續(xù)拋出
     */
    @Override
    public List findAll(String keyWorld) throws Exception {
        List all = null;
        try{
            all = this.dao.findAll(keyWorld);
        }catch (Exception e){
            throw e;
        }finally {
            this.dataBaseConnection.close();
        }
        return all;
    }

    /**
     * 根據(jù)雇員編號(hào)查詢雇員信息
     *
     * @param empno 雇員編號(hào)
     * @return 雇員vo對(duì)象
     * @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;
    }
}
編寫測(cè)試類
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 result = empDAOProxy.findAll(this.keyWords);
        // 迭代器遍歷對(duì)象
        Iterator iterator = result.iterator();
        // 循環(huán)迭代
        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());
    }
}
設(shè)置工廠
package com.ming.dao;

public class DAOFactory {
    public static IEmpDAO getIEmpDAOInstance() throws Exception{
        return new EmpDAOProxy();
    }
}
設(shè)置插入界面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" %>


    增加雇員


雇員編號(hào) 雇員姓名 職位 日期 工資
設(shè)置插入成功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" %>


    Title


<%
    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)){
%>
    

添加成功

<% %> <% } }catch (Exception e){ e.printStackTrace(); } %>

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73751.html

相關(guān)文章

  • Java中的DAO模式

    摘要:此的功能是從應(yīng)用程序中隱藏在底層存儲(chǔ)機(jī)制中執(zhí)行操作所涉及的所有復(fù)雜性。這正是模式試圖解決的問題。將模式與一起使用開發(fā)人員普遍認(rèn)為的發(fā)布將模式的功能降級(jí)為零,因?yàn)樵撃J街皇菍?shí)體經(jīng)理提供的另一層抽象和復(fù)雜性。在這種情況下,模式有其自己的位置。 案例概述 數(shù)據(jù)訪問對(duì)象(DAO)模式是一種結(jié)構(gòu)模式,它允許我們使用抽象API將應(yīng)用程序/業(yè)務(wù)層與持久層(通常是關(guān)系數(shù)據(jù)庫,但它可以是任何其他持久性機(jī)...

    TIGERB 評(píng)論0 收藏0
  • 動(dòng)態(tài)代理模式

    摘要:實(shí)現(xiàn)數(shù)據(jù)庫操作關(guān)于人員的數(shù)據(jù)庫操作定義一個(gè)代理類代理,如果使用靜態(tài)代理,那么這個(gè)類必須實(shí)現(xiàn)接口,這里采用動(dòng)態(tài)代理類,免去實(shí)現(xiàn)代理類定義的所有接口。 描述:代理對(duì)象和被代理對(duì)象具有相同的行為,客戶端通過代理對(duì)象實(shí)現(xiàn)對(duì)被代理對(duì)象調(diào)用,代理對(duì)象除了可以代理被代理對(duì)象的所有行為外,還可以在被代理對(duì)象的所有行為上添加一些額外的內(nèi)容,如開閉事務(wù),權(quán)限攔截等;動(dòng)態(tài)代理可以生成一個(gè)不用實(shí)現(xiàn)被代理類的所...

    chavesgu 評(píng)論0 收藏0
  • 面向?qū)ο?em>設(shè)計(jì)原則-依賴倒置

    摘要:依賴倒置在面向?qū)ο笤O(shè)計(jì)中有一個(gè)重要的原則是依賴倒置,主要作用是解耦,讓對(duì)象與對(duì)象之間松耦合。現(xiàn)在根據(jù)依賴倒置原則對(duì)例子進(jìn)行修改。 依賴倒置 在面向?qū)ο笤O(shè)計(jì)中有一個(gè)重要的原則是依賴倒置(Dependence Inversion Principle),主要作用是解耦,讓對(duì)象與對(duì)象之間松耦合。定義如下:高層模塊不應(yīng)該依賴底層模塊,他們都應(yīng)該依賴抽象。抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。...

    Zhuxy 評(píng)論0 收藏0
  • 用戶登陸注冊(cè)【JDBC版】

    前言 在講解Web開發(fā)模式的時(shí)候,曾經(jīng)寫過XML版的用戶登陸注冊(cè)案例!現(xiàn)在在原有的項(xiàng)目上,使用數(shù)據(jù)庫版來完成用戶的登陸注冊(cè)!如果不了解的朋友,可以看看我Web開發(fā)模式的博文! 本來使用的是XML文件作為小型數(shù)據(jù)庫,現(xiàn)在使用Mysql數(shù)據(jù)庫,代碼究竟要改多少呢?我們拭目以待! 使用C3P0數(shù)據(jù)庫連接池 導(dǎo)入C3P0的開發(fā)包和導(dǎo)入配置文件 開發(fā)包導(dǎo)入的是這個(gè):c3p0-0.9.2-pre1和mcha...

    jayzou 評(píng)論0 收藏0
  • DAO開發(fā)小試

    摘要:在代理類完成以后,最后還需要編寫工廠類,以降低代碼間的耦合度。工廠類工廠類的功能就是直接返回接口的實(shí)例化對(duì)象這樣客戶端就可以直接通過工廠類取得接口的實(shí)例化對(duì)象。 數(shù)據(jù) DAO的開發(fā)完全圍繞著數(shù)據(jù)進(jìn)行,先在數(shù)據(jù)庫中準(zhǔn)備幾個(gè)要用到的表: sqlcreate table emp ( empno int(4) PRIMARY KEY, ename varchar(10...

    Lorry_Lu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

rickchen

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<