成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

DAO開(kāi)發(fā)小試

Lorry_Lu / 2922人閱讀

摘要:在代理類(lèi)完成以后,最后還需要編寫(xiě)工廠類(lèi),以降低代碼間的耦合度。工廠類(lèi)工廠類(lèi)的功能就是直接返回接口的實(shí)例化對(duì)象這樣客戶(hù)端就可以直接通過(guò)工廠類(lèi)取得接口的實(shí)例化對(duì)象。

數(shù)據(jù)

DAO的開(kāi)發(fā)完全圍繞著數(shù)據(jù)進(jìn)行,先在數(shù)據(jù)庫(kù)中準(zhǔn)備幾個(gè)要用到的表:

sqlcreate table emp (
    empno int(4)    PRIMARY KEY,
    ename varchar(10),
    job varchar(9),
    hiredate    date,
    sal float(7,2)
    );
VO類(lèi)

根據(jù)表中的字段建立對(duì)應(yīng)的VO類(lèi):

javapackage temp.vo;

import java.util.Date;

/**
 * Created by mcbird on 14/11/20.
 */
public class Emp {
    private int empno;
    private String ename;
    private String job;
    private Date hiredate;
    private float sal;

    public String getEname() {
        return ename;
    }

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

    public String getJob() {
        return job;
    }

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

    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 int getEmpno() {
        return empno;

    }

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

可以看到,VO類(lèi)中只包含getter和setter方法。定義完VO類(lèi)之后,接下來(lái)定義一個(gè)DatebaseConnection類(lèi),用來(lái)完成數(shù)據(jù)庫(kù)的打開(kāi)及關(guān)閉操作。

DatabaseConnection類(lèi)

考慮到實(shí)踐當(dāng)中,有可能使用不同的數(shù)據(jù)庫(kù),所用,我們需要寫(xiě)一個(gè)通用接口,以及相應(yīng)的數(shù)據(jù)庫(kù)的實(shí)現(xiàn)類(lèi)。

DatabaseConnection通用接口
javapackage temp.dbc;


import java.sql.Connection;

/**
 * Created by mcbird on 14/11/20.
 */
public interface DatebaseConnection {
    public Connection getConnection() throws Exception;  // 取得數(shù)據(jù)庫(kù)連接
    public void close() throws Exception;                //關(guān)閉數(shù)據(jù)庫(kù)連接
}

通過(guò)這樣一個(gè)接口,能夠更好的松耦合、更抽象。

DatabaseConnection實(shí)現(xiàn)類(lèi)
javapackage temp.dbc.impl;

import temp.dbc.DatebaseConnection;

import java.sql.Connection;
import java.sql.DriverManager;

/**
 * Created by mcbird on 14/11/20.
 */
public class MySQLDatabaseConnection implements DatebaseConnection {
    private static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
    private static final String DBURL = "jdbc://localhost:3306/temp";
    private static final String DBUSER = "root";
    private static final String DBPASSWORD = "cloudSoft@Skybility";
    private Connection conn = null;


    @Override
    public Connection getConnection() throws Exception {
        try {
            Class.forName(DBDRIVER);
            this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);
        }catch (Exception e) {
            throw e;
        }
        return this.conn;
    }

    @Override
    public void close() throws Exception {
        if(this.conn != null) {
            try {
                this.conn.close();
            } catch (Exception e) {
                throw e;
            }
        }
    }
}

這是針對(duì)MySQL的一個(gè)實(shí)現(xiàn)類(lèi),還可以針對(duì)不同的數(shù)據(jù)庫(kù)編寫(xiě)不同的實(shí)現(xiàn)類(lèi)。

DAO類(lèi)

在DAO設(shè)計(jì)模式中,最重要的就是定義DAO接口,在定義DAO接口之前必須對(duì)業(yè)務(wù)進(jìn)行詳細(xì)的分析,要清楚地知道一張表在整個(gè)系統(tǒng)中應(yīng)該具備何種功能。

DAO接口
javapackage temp.dao;

import temp.vo.Emp;

import java.util.List;

/**
 * Created by mcbird on 14/11/20.
 */
public interface IEmpDAO {
    /**
     * 數(shù)據(jù)的增加操作
     * @param emp 要增加的數(shù)據(jù)對(duì)象
     * @return 是否成功增加標(biāo)志
     */
    public boolean doCreate(Emp emp) throws Exception;


    /**
     * 查詢(xún)?nèi)繑?shù)據(jù)
     * @param keyWord
     * @return
     * @throws Exception
     */
    public List findAll(String keyWord) throws Exception;

    /**
     * 根據(jù)編號(hào)查詢(xún)雇員信息
     * @param empno
     * @return
     * @throws Exception
     */
    public Emp findById(int empno) throws Exception;
}
DAO實(shí)現(xiàn)類(lèi)
javapackage temp.dao.impl;

import temp.dao.IEmpDAO;
import temp.vo.Emp;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by mcbird on 14/11/20.
 */
public class EmpDAOImpl implements IEmpDAO {
    private Connection conn = null;
    private PreparedStatement pstmt = null;     //數(shù)據(jù)庫(kù)操作對(duì)象

    public EmpDAOImpl(Connection conn) {
        this.conn = conn;
    }

    @Override
    public boolean doCreate(Emp emp) throws Exception {
        boolean flag = false;
        String sql = "insert int emp (empno,ename,job,hiredate,sal) values (?,?,?,?,?)";
        this.pstmt = this.conn.prepareStatement(sql);
        this.pstmt.setInt(1, emp.getEmpno());
        this.pstmt.setString(2, emp.getEname());
        this.pstmt.setString(3, emp.getJob());
        this.pstmt.setDate(4, new Date(emp.getHiredate().getTime()));
        this.pstmt.setFloat(5, emp.getSal());

        if(this.pstmt.executeUpdate() > 0) {    //更新記錄的行數(shù)大于0
            flag = true;
        }
        this.pstmt.close();
        return flag;
    }

    @Override
    public List findAll(String keyWord) throws Exception {
        List all = new ArrayList();
        String sql = "select empno,ename,job,hiredate,sal from emp where ename like ? or job like ?";
        this.pstmt = this.conn.prepareStatement(sql);
        this.pstmt.setString(1, "%" + keyWord + "%");
        this.pstmt.setString(2, "%" + keyWord + "%");
        ResultSet rs = this.pstmt.executeQuery();
        Emp emp = null;
        while (rs.next()) {
            emp = new Emp();
            emp.setEmpno(rs.getInt(1));
            emp.setEname(rs.getString(2));
            emp.setJob(rs.getString(3));
            emp.setHiredate(rs.getDate(4));
            emp.setSal(rs.getFloat(5));
            all.add(emp);
        }
        this.pstmt.close();
        return all;
    }

    @Override
    public Emp findById(int empno) throws Exception {
        Emp emp = null;
        String sql = "select empno,ename,job,hiredate,sal from emp where empno=?";
        this.pstmt = this.conn.prepareStatement(sql);
        this.pstmt.setInt(1, empno);
        ResultSet rs = this.pstmt.executeQuery();
        if(rs.next()) {
            emp = new Emp();
            emp.setEmpno(rs.getInt(1));
            emp.setEname(rs.getString(2));
            emp.setJob(rs.getString(3));
            emp.setHiredate(rs.getDate(4));
            emp.setSal(rs.getFloat(5));
        }
        this.pstmt.close();
        return emp;
    }
}

可以發(fā)現(xiàn),在這個(gè)實(shí)現(xiàn)類(lèi)中,根本沒(méi)有數(shù)據(jù)庫(kù)的打開(kāi)和鏈接操作,只是通過(guò)構(gòu)造方法取得了數(shù)據(jù)庫(kù)的鏈接,那么真正負(fù)責(zé)打開(kāi)和關(guān)閉的操作是由誰(shuí)來(lái)完成的呢?答案是,代理類(lèi)。

代理類(lèi)
javapackage temp.dao.proxy;

import temp.dao.IEmpDAO;
import temp.dao.impl.EmpDAOImpl;
import temp.dbc.DatebaseConnection;
import temp.dbc.impl.MySQLDatabaseConnection;
import temp.vo.Emp;

import java.util.List;

/**
 * Created by mcbird on 14/11/20.
 */
public class EmpDAOProxy implements IEmpDAO {
    private DatebaseConnection dbc = null;
    private IEmpDAO dao = null;
    public EmpDAOProxy() throws Exception {
        this.dbc = new MySQLDatabaseConnection();
        this.dao = new EmpDAOImpl(this.dbc.getConnection());
    }

    @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.dbc.close();
        }
        return flag;
    }

    @Override
    public List findAll(String keyWord) throws Exception {
        List all = null;
        try {
            all = this.findAll(keyWord);
        } catch (Exception e) {
            throw e;
        } finally {
            this.dbc.close();
        }
        return all;
    }

    @Override
    public Emp findById(int empno) throws Exception {
        Emp emp = null;
        try {
            emp = this.dao.findById(empno);
        } catch (Exception e) {
            throw e;
        } finally {
            this.dbc.close();
        }
        return emp;
    }
}

可以發(fā)現(xiàn),在代理類(lèi)的構(gòu)造方法中實(shí)例化了數(shù)據(jù)庫(kù)連接類(lèi)的對(duì)象以及DAO的實(shí)現(xiàn)類(lèi),而在代理中的各個(gè)方法只是調(diào)用了真實(shí)DAO實(shí)現(xiàn)類(lèi)的相應(yīng)方法。在代理類(lèi)完成以后,最后還需要編寫(xiě)工廠類(lèi),以降低代碼間的耦合度。

工廠類(lèi)

工廠類(lèi)的功能就是直接返回DAO接口的實(shí)例化對(duì)象,這樣客戶(hù)端就可以直接通過(guò)工廠類(lèi)取得DAO接口的實(shí)例化對(duì)象。

javapackage temp.dao.factory;

import temp.dao.IEmpDAO;
import temp.dao.proxy.EmpDAOProxy;

/**
 * Created by mcbird on 14/11/20.
 */
public class DAOFactory {
    public static IEmpDAO getIEmpDAOInstance() throws Exception {
        return new EmpDAOProxy();
    }
}
測(cè)試
javapackage temp.test;

import temp.dao.factory.DAOFactory;
import temp.vo.Emp;

import java.util.Date;

/**
 * Created by mcbird on 14/11/20.
 */
public class TestDAOInsert {
    public static void main(String[] args) throws Exception {
        Emp emp = null;
        for(int x = 0; x < 5; x++) {
            emp = new Emp();
            emp.setEmpno(1000 + x);
            emp.setEname("McBird_" + x);
            emp.setJob("Singer_" + x);
            emp.setHiredate(new Date());
            emp.setSal(100 * x);

            DAOFactory.getIEmpDAOInstance().doCreate(emp);
        }
    }
}

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/64274.html

相關(guān)文章

  • iKcamp出品|微信小程序|小試牛刀(視頻)+發(fā)布流程|基于最新版1.0開(kāi)發(fā)者工具初中級(jí)教程分享

    摘要:官網(wǎng)訪問(wèn)官網(wǎng)更快閱讀全部免費(fèi)分享課程出品全網(wǎng)最新微信小程序基于最新版開(kāi)發(fā)者工具之初中級(jí)培訓(xùn)教程分享。 iKcamp官網(wǎng):http://www.ikcamp.com 訪問(wèn)官網(wǎng)更快閱讀全部免費(fèi)分享課程:《iKcamp出品|全網(wǎng)最新|微信小程序|基于最新版1.0開(kāi)發(fā)者工具之初中級(jí)培訓(xùn)教程分享》。包含:文章、視頻、源代碼 showImg(https://segmentfault.com/i...

    Muninn 評(píng)論0 收藏0
  • iKcamp出品|微信小程序|小試牛刀(視頻)+發(fā)布流程|基于最新版1.0開(kāi)發(fā)者工具初中級(jí)教程分享

    摘要:官網(wǎng)訪問(wèn)官網(wǎng)更快閱讀全部免費(fèi)分享課程出品全網(wǎng)最新微信小程序基于最新版開(kāi)發(fā)者工具之初中級(jí)培訓(xùn)教程分享。 iKcamp官網(wǎng):http://www.ikcamp.com 訪問(wèn)官網(wǎng)更快閱讀全部免費(fèi)分享課程:《iKcamp出品|全網(wǎng)最新|微信小程序|基于最新版1.0開(kāi)發(fā)者工具之初中級(jí)培訓(xùn)教程分享》。包含:文章、視頻、源代碼 showImg(https://segmentfault.com/i...

    AlphaGooo 評(píng)論0 收藏0
  • iKcamp出品|微信小程序|小試牛刀(視頻)+發(fā)布流程|基于最新版1.0開(kāi)發(fā)者工具初中級(jí)教程分享

    摘要:官網(wǎng)訪問(wèn)官網(wǎng)更快閱讀全部免費(fèi)分享課程出品全網(wǎng)最新微信小程序基于最新版開(kāi)發(fā)者工具之初中級(jí)培訓(xùn)教程分享。 iKcamp官網(wǎng):http://www.ikcamp.com 訪問(wèn)官網(wǎng)更快閱讀全部免費(fèi)分享課程:《iKcamp出品|全網(wǎng)最新|微信小程序|基于最新版1.0開(kāi)發(fā)者工具之初中級(jí)培訓(xùn)教程分享》。包含:文章、視頻、源代碼 showImg(https://segmentfault.com/i...

    2450184176 評(píng)論0 收藏0
  • webmagic小試牛刀

    摘要:序是里頭比較優(yōu)秀的一個(gè)爬蟲(chóng)框架使用作為解析工具,并基于其開(kāi)發(fā)了解析的工具。默認(rèn)使用了作為下載工具。這里展示一下入門(mén)級(jí)使用。 序 webmagic是java里頭比較優(yōu)秀的一個(gè)爬蟲(chóng)框架: 使用Jsoup作為HTML解析工具,并基于其開(kāi)發(fā)了解析XPath的工具Xsoup。 默認(rèn)使用了Apache HttpClient作為下載工具。 這里展示一下入門(mén)級(jí)使用。 maven ...

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

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

0條評(píng)論

閱讀需要支付1元查看
<