




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、4.1、關(guān)于設(shè)計(jì)分層的初步概念 在軟件開發(fā)過程之中一定要存在有一個(gè)程序的層次概念,每一個(gè)程序?qū)哟味家瓿赡承┚唧w的操作,而在一般情況下,分層的原則:不超過三層的原則,而常見的分層模式如下。 以上只是給出了一些層次的基本描述名稱,但是嚴(yán)格來講,每一層還會(huì)有更多的劃分,如果是一個(gè)更加嚴(yán)格的劃分,有可能劃分成如下的形式。
2、0; 對(duì)于業(yè)務(wù)層如果是一些簡(jiǎn)單的程序開發(fā),以上的形式已經(jīng)夠使用了,但是很多時(shí)候還會(huì)遇見一些更為復(fù)雜的應(yīng)用,那么業(yè)務(wù)層上還會(huì)繼續(xù)進(jìn)行劃分。 今天的任務(wù)不是去研究控制層,也不是研究顯示層,而專注于業(yè)務(wù)層與數(shù)據(jù)層,而且最為基本的操作是只存在一層業(yè)務(wù)。一直強(qiáng)調(diào),業(yè)務(wù)層是整個(gè)項(xiàng)目的核心,而你們最大的特點(diǎn)是在業(yè)務(wù)層上表現(xiàn)。 那么下面就以刁雪冰后面站著聽課為例,說明業(yè)務(wù)層和數(shù)據(jù)層的關(guān)聯(lián)。
3、0; 通過以上的分析就可以發(fā)現(xiàn),一個(gè)業(yè)務(wù)層需要調(diào)用多個(gè)數(shù)據(jù)層,而數(shù)據(jù)層所提供的都是數(shù)據(jù)庫(kù)的原子性操作(INSERT、UPDATE、DELETE、SELECT)。那么就可以給出概念:· 數(shù)據(jù)層(數(shù)據(jù)訪問層、持久層),一般會(huì)使用“Data Access Object”表示,簡(jiǎn)稱為DAO,在DAO之中提供的是一系列的數(shù)據(jù)庫(kù)操作標(biāo)準(zhǔn)(接口);· 業(yè)務(wù)層(服務(wù)層),一般會(huì)使用“Service”表示,由于業(yè)務(wù)層最終也是要給控制層進(jìn)行調(diào)用(今天給客戶直接調(diào)用)、所以業(yè)務(wù)層也需要有一個(gè)自己的操作標(biāo)準(zhǔn),而一個(gè)業(yè)務(wù)層就需要調(diào)用多個(gè)數(shù)據(jù)
4、層。4.2、實(shí)例分析 現(xiàn)在要求使用emp表(基本字段:empno、ename、job、hiredate、sal、comm)實(shí)現(xiàn)如下功能: · 【業(yè)務(wù)層】實(shí)現(xiàn)新雇員的增加操作;
5、0; |- 數(shù)據(jù)層雇員的編號(hào)是由用戶自己輸入的,所以必須首先確定雇員編號(hào)是否存在,需要查詢;
6、160; |- 數(shù)據(jù)層如果雇員編號(hào)不存在,則執(zhí)行增加操作,更新; · 【業(yè)務(wù)層】實(shí)現(xiàn)雇員的修改操作;
7、; |- 數(shù)據(jù)層直接修改雇員數(shù)據(jù); · 【業(yè)務(wù)層】實(shí)現(xiàn)雇員的刪除操作;
8、160; |- 數(shù)據(jù)層直接刪除雇員數(shù)據(jù); · 【業(yè)務(wù)層】可以根據(jù)雇員編號(hào)查詢出雇員的完整信息;
9、160; |- 數(shù)據(jù)層直接根據(jù)編號(hào)做限定查詢; · 【業(yè)務(wù)層】可以顯示全部雇員記錄; &
10、#160; |- 數(shù)據(jù)層查詢雇員表的全部數(shù)據(jù)· 【業(yè)務(wù)層】可以分頁顯示全部雇員記錄,或者可以使用模糊查詢進(jìn)行關(guān)鍵字匹配,在返回全部記錄的同時(shí)還需要返回本次查詢的總數(shù)據(jù)量;
11、 |- 數(shù)據(jù)層使用LIKE模糊查詢查詢滿足條件的數(shù)據(jù)信息; |- 數(shù)據(jù)層使用COUNT()函數(shù)統(tǒng)計(jì)滿足條件的數(shù)據(jù)量。 通過以上的分析
12、就可以清楚的發(fā)現(xiàn),一個(gè)業(yè)務(wù)層還是調(diào)用了多個(gè)數(shù)據(jù)層,所以在日后用戶所提出的全部要求的細(xì)分,基本上都是業(yè)務(wù)層分析,而只有確定了業(yè)務(wù)之后才可以確定出數(shù)據(jù)層。4.3、代碼的準(zhǔn)備 首先需要打開Oracle的系統(tǒng)服務(wù),而后建立一個(gè)新的項(xiàng)目 DAOProject,同時(shí)在項(xiàng)目之中配置好所需要的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序。 系統(tǒng)的開發(fā)之中需要有包的規(guī)范,現(xiàn)在假設(shè)父包名稱為:cn.mldn.oracle。4.3.1、數(shù)據(jù)庫(kù)連接類:Dat
13、abaseConnection 在整個(gè)JDBC操作過程之中,數(shù)據(jù)庫(kù)只有打開后才可以進(jìn)行一系列的操作,而后數(shù)據(jù)庫(kù)的連接又必須關(guān)閉。那么為了方便控制,可以直接將數(shù)據(jù)庫(kù)的打開和關(guān)閉操作封裝在一個(gè)類之中。 數(shù)據(jù)庫(kù)的連接類保存包為“cn.mldn.oracle.dbc”,而且此數(shù)據(jù)庫(kù)的連接只針對(duì)于Oracle定義。范例:定義DatabaseConnection.java類package cn.mldn.oracle
14、.dbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException; public class DatabaseConnection private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; private static final String DBURL = "jdbc:or
15、acle:thin:localhost:1521:MLDN" ; private static final String DBUSER = "scott" ; private static final String PASSWORD = "tiger" ; private Connection conn ; / 準(zhǔn)備出一個(gè)數(shù)據(jù)庫(kù)連接對(duì)象 pub
16、lic DatabaseConnection() try Class.forName(DBDRIVER) ; this.conn = DriverManager.getConnection(DBURL, DBUSER, PASSWORD) ;
17、60; catch (Exception e) e.printStackTrace(); public Connection getConnection()
18、160; return this.conn ; public void close() if (this.conn != null) try
19、0; this.conn.close(); catch (SQLException e) e.printStackTrace();
20、 嚴(yán)格來講以上的寫法只是一個(gè)簡(jiǎn)便寫法,因?yàn)槿蘸笫菫榱讼蚩蚣荛_發(fā)靠攏,所有一些地方就需要做一些修改,而最早的時(shí)候,對(duì)于DAO設(shè)計(jì)模式的主要功能是為了解決掉數(shù)據(jù)庫(kù)的可移植操作問題。 4.3.2、開發(fā)簡(jiǎn)單Java類 簡(jiǎn)
21、單Java類指的就是類的結(jié)構(gòu)比較單一,主要是由屬性、setter/getter方法所組成,簡(jiǎn)單Java類的主要功能是作為一種數(shù)據(jù)的載體進(jìn)行存放,而日后對(duì)于簡(jiǎn)單Java類也會(huì)出現(xiàn)如下的名稱:POJO(簡(jiǎn)單Java類)、VO(值對(duì)象)、TO(DTO,數(shù)據(jù)傳輸對(duì)象,主要用于分布式)、PO(持久化對(duì)象)??墒菍?duì)于簡(jiǎn)單Java類的組成結(jié)構(gòu)在開發(fā)之中也有了明確要求: · 簡(jiǎn)單Java類的最主要的設(shè)計(jì)思想來源于數(shù)據(jù)表,所以一定要和數(shù)據(jù)表的結(jié)構(gòu)映射上;
22、60; · 簡(jiǎn)單Java類的名稱要與數(shù)據(jù)表的名稱保持一致,注意大小寫,例如:member_info表,類:MemberInfo; · 為了方便程序擴(kuò)展,所有的簡(jiǎn)單Java類必須實(shí)現(xiàn)java.io.Serializable接口; · 類之中的屬性必須使用private封裝,封裝后的屬性一定要編寫setter、getter方法;
23、160; · 類之中一定要提供有無參構(gòu)造方法; · 類之中不允許使用基本數(shù)據(jù)類型,所有的基本類型要全部替換為包裝類; · 類之中不允許出現(xiàn)任何的輸出語句,所有的輸出必須交給被調(diào)用處執(zhí)行; · 類可以有
24、選擇性的覆寫Object類的:equals()、hashCode()、toString()。 簡(jiǎn)單Java類要求保存在cn.mldn.oracle.vo包中。范例:定義Member.java類package cn.mldn.oracle.vo;import java.io.Serializable;import java.util.Date;SuppressWarnings("serial")public class Emp implements Serializable
25、60; private Integer empno ; private String ename ; private String job ; private Date hiredate ; private Double sal ; private Double comm ; / setter、getter略 &
26、#160; 此時(shí)類之中默認(rèn)提供有一個(gè)無參構(gòu)造方法,所以此時(shí)的類完全符合于簡(jiǎn)單Java類的開發(fā)標(biāo)準(zhǔn)。4.4、開發(fā)數(shù)據(jù)層:DAO層 數(shù)據(jù)層又分稱為持久層,指的是進(jìn)行持久化數(shù)據(jù)操作的。持久層屬于DAO層,所以在進(jìn)行開發(fā)的時(shí)候首先要開發(fā)出操作的標(biāo)準(zhǔn),而后進(jìn)行子類的實(shí)現(xiàn)。4.4.1、持久層標(biāo)準(zhǔn) 因?yàn)槌志脤幼罱K要交給業(yè)務(wù)層進(jìn)行調(diào)用,所以持久層必須有一個(gè)自己的操作接口,用于定義標(biāo)準(zhǔn),
27、但是此接口的命名是有要求的,如果當(dāng)前操作的是emp表,那么這個(gè)接口應(yīng)該命名為EmpDAO,但是為了區(qū)分接口還有類,所以現(xiàn)在要求在接口定義前增加一個(gè)字母I,所以emp表的持久層標(biāo)準(zhǔn)名稱:IEmpDAO,而且此接口要保存在cn.mldn.oracle.dao下。 在數(shù)據(jù)層之中定義的方法嚴(yán)格來講就只有兩類:
28、; · 數(shù)據(jù)更新操作:此類方法的命名以“doXxx()”的形式,例如:doCreate()、doUpdate()、doRemove(); · 數(shù)據(jù)查詢操作:查詢會(huì)分為兩個(gè)小類:
29、0; |- 數(shù)據(jù)查詢:此類方法以“findXxx()”命名,例如:findById()、findByJob()、findAll();
30、 |- 統(tǒng)計(jì)查詢:此類方法以“getXxx()”命名,例如:getAllCount()。范例:定義IEmpDAO接口package cn.mldn.oracle.dao;import java.util.List;import cn.mldn.oracle.vo.Emp;public interface IEmpDAO public boolean doCreate(Emp vo) throws Exception ; public boolean
31、doUpdate(Emp vo) throws Exception ; public boolean doRemove(Integer id) throws Exception ; public Emp findById(Integer id) throws Exception ; public List findAll() throws Exception ;
32、0; public List findAll(String column, String keyWord, Integer currentPage, Integer lineSize) throws Exception; public Integer getAllCount(String column,String keyWord) throws
33、 Exception ; 以后的工作之中一定要按照以上的要求編寫注釋信息,這才叫合格代碼。4.4.2、定義數(shù)據(jù)層實(shí)現(xiàn)類:EmpDAOImpl 接口標(biāo)準(zhǔn)定義完成之后,下面就可以進(jìn)行實(shí)現(xiàn)類的編寫,編寫的實(shí)現(xiàn)類要保存在cn.mldn.oracle.dao.impl子包之中,而且名稱后面一定要加上Impl。但是對(duì)于實(shí)現(xiàn)類,現(xiàn)在采用如下的方式編寫。范例:觀察問題 Override
34、 public boolean doCreate(Emp vo) throws Exception String sql = "INSERT INTO emp(empno,ename,job,hiredate,sal,comm) VALUES (?,?,?,?,?,?)" ; DatabaseConnection dbc = new DatabaseConnection(
35、) ; Connection conn = dbc.getConnection() ; PreparedStatement pstmt = conn.prepareStatement(sql) ; pstmt.setInt(1, vo.getEmpno(); ps
36、tmt.setString(2, vo.getEname(); pstmt.setString(3, vo.getJob(); pstmt.setDate(4, new java.sql.Date(vo.getHiredate().getTime(); pstmt.setDouble(5, vo.getSal();
37、0; pstmt.setDouble(6, vo.getComm(); if (pstmt.executeUpdate() > 0) return true ;
38、; dbc.close(); return false; 如果此時(shí)的實(shí)現(xiàn)類按照如下的方式編寫,可能存在有兩個(gè)重要問題:· 根據(jù)異常的處理來講,如果在處理過程之中出現(xiàn)了數(shù)據(jù)庫(kù)的更新異常,那么就再也關(guān)不上了,而且在本程序之中,如果更新成功直接返回了,也無法關(guān)閉;· 一個(gè)業(yè)務(wù)層會(huì)調(diào)用多個(gè)數(shù)據(jù)層操作,現(xiàn)在把數(shù)據(jù)庫(kù)的打開和關(guān)閉操作放在了數(shù)據(jù)層的每一個(gè)方法里面,這就意味著
39、,一個(gè)業(yè)務(wù)操作的時(shí)候會(huì)打開和關(guān)閉數(shù)據(jù)庫(kù)多次,那么可以將數(shù)據(jù)庫(kù)的連接和關(guān)閉操作交給業(yè)務(wù)層處理;范例:標(biāo)準(zhǔn)實(shí)現(xiàn)package cn.mldn.oracle.dao.impl;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import cn.mldn.oracle.dao.IEmpDAO;import cn.mldn.oracle.vo.Emp;public class Emp
40、DAOImpl implements IEmpDAO private Connection conn; private PreparedStatement pstmt; public EmpDAOImpl(Connection conn) this.conn = conn; Override&
41、#160; public boolean doCreate(Emp vo) throws Exception String sql = "INSERT INTO emp(empno,ename,job,hiredate,sal,comm) VALUES (?,?,?,?,?,?)" this.pstmt = this.conn.prepareStatement(sql);
42、 this.pstmt.setInt(1, vo.getEmpno(); this.pstmt.setString(2, vo.getEname(); this.pstmt.setString(3, vo.getJob(); this.pstmt.setDate(4, new
43、 java.sql.Date(vo.getHiredate().getTime(); this.pstmt.setDouble(5, vo.getSal(); this.pstmt.setDouble(6, vo.getComm(); if (this.pstmt.executeUpdate() > 0)
44、0; return true; return false; Override public boolean doUpdate(Emp vo) throws Exception
45、 String sql = "UPDATE emp SET ename=?,job=?,hiredate=?,sal=?,comm=? WHERE empno=?" this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setString(1, vo.getEname();
46、60; this.pstmt.setString(2, vo.getJob(); this.pstmt.setDate(3, new java.sql.Date(vo.getHiredate().getTime(); this.pstmt.setDouble(4, vo.getSal(); this.pstmt.setDo
47、uble(5, vo.getComm(); this.pstmt.setInt(6, vo.getEmpno(); if (this.pstmt.executeUpdate() > 0) return true;
48、0; return false; Override public boolean doRemove(Integer id) throws Exception String sql = "DELETE FROM emp WHERE empno=?"
49、160; this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setInt(1, id); if (this.pstmt.executeUpdate() > 0) return true;
50、60; return false; Override public Emp findById(Integer id) throws Exception Emp vo = null;
51、60; String sql = "SELECT empno,ename,job,hiredate,sal,comm FROM emp WHERE empno=?" this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setInt(1, id); ResultSet
52、 rs = this.pstmt.executeQuery(); if (rs.next() / 有數(shù)據(jù)返回 vo = new Emp(); vo.setEmpno(rs.getInt(1);
53、 vo.setEname(rs.getString(2); vo.setJob(rs.getString(3); vo.setHiredate(rs.getDate(4);
54、0; vo.setSal(rs.getDouble(5); vo.setComm(rs.getDouble(6); return vo; Override
55、; public List findAll() throws Exception List all = new ArrayList(); String sql = "SELECT empno,ename,job,hiredate,sal,comm FROM emp" this.pstmt = this.conn.prepareStat
56、ement(sql); ResultSet rs = this.pstmt.executeQuery(); while (rs.next() Emp vo = new Emp();
57、; vo.setEmpno(rs.getInt(1); vo.setEname(rs.getString(2); vo.setJob(rs.getString(3); vo.setHireda
58、te(rs.getDate(4); vo.setSal(rs.getDouble(5); vo.setComm(rs.getDouble(6); all.add(vo); / 向集合增加數(shù)據(jù) &
59、#160; return all; Override public List findAll(String column, String keyWord, Integer currentPage, Integer line
60、Size) throws Exception List all = new ArrayList(); String sql = "SELECT * FROM(" + " SELECT empno,ename,job,hi
61、redate,sal,comm,ROWNUM rn" + " FROM emp " + " WHERE " + column + " LIKE ? AND ROWNUM<=?
62、) temp " + " WHERE temp.rn>? " this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setString(1, "%" + keyWord + "%"); this.pstmt.se
63、tInt(2, currentPage * lineSize); this.pstmt.setInt(3, (currentPage - 1) * lineSize); ResultSet rs = this.pstmt.executeQuery(); while (rs.next()
64、 Emp vo = new Emp(); vo.setEmpno(rs.getInt(1); vo.setEname(rs.getString(2);
65、60; vo.setJob(rs.getString(3); vo.setHiredate(rs.getDate(4); vo.setSal(rs.getDouble(5); vo.setCo
66、mm(rs.getDouble(6); all.add(vo); / 向集合增加數(shù)據(jù) return all; Override public Integer getAllCount(Str
67、ing column, String keyWord) throws Exception String sql = "SELECT COUNT(empno) FROM emp WHERE " + column + " LIKE ?" this.pstmt = this.conn.prepareStatement(sql);
68、60; this.pstmt.setString(1, "%" + keyWord + "%"); ResultSet rs = this.pstmt.executeQuery(); if (rs.next() return rs.getInt(
69、1); return 0; 雖然代碼較長(zhǎng),但是所有的代碼都是標(biāo)準(zhǔn)的JDBC操作,而且每一個(gè)方法都只完成一個(gè)基本的原子性操作。4.4.3、建立數(shù)據(jù)層工廠類 最終數(shù)據(jù)層是要交給業(yè)務(wù)層調(diào)用的,而業(yè)務(wù)層為了和
70、數(shù)據(jù)層之間不產(chǎn)生耦合,所以不允許直接使用子類為數(shù)據(jù)層接口實(shí)例化,必須通過工廠類來完成,工廠應(yīng)該保存在cn.mldn.oracle.factory包下。范例:建立DAOFactorypackage cn.mldn.oracle.factory;import java.sql.Connection;import cn.mldn.oracle.dao.IEmpDAO;import cn.mldn.oracle.dao.impl.EmpDAOImpl;public class DAOFactory public static IEmpDAO getIEmpDAOI
71、nstance(Connection conn) return new EmpDAOImpl(conn) ; 對(duì)于業(yè)務(wù)層在通過工廠類取得數(shù)據(jù)層接口實(shí)例的時(shí)候一定要傳遞連接對(duì)象。4.5、開發(fā)業(yè)務(wù)層:Service層 數(shù)據(jù)層完成后最終一定要交給業(yè)務(wù)層進(jìn)行調(diào)用,所以在業(yè)務(wù)層里面就需要通過工
72、廠取得數(shù)據(jù)層接口對(duì)象,同時(shí)業(yè)務(wù)層由于最終也必須由控制層(本次不考慮控制層,只考慮客戶端)調(diào)用,所以也需要制定業(yè)務(wù)層接口標(biāo)準(zhǔn)和相關(guān)的子類實(shí)現(xiàn)。4.5.1、業(yè)務(wù)層操作標(biāo)準(zhǔn) 業(yè)務(wù)層的功能在之前已經(jīng)建立完成了,而且現(xiàn)在的業(yè)務(wù)層依然是圍繞emp表進(jìn)行,所以業(yè)務(wù)層的接口名稱就為IEmpService,保存在cn.mldn.oracle.service包之中。同時(shí)業(yè)務(wù)層的方法沒有特別明確的標(biāo)準(zhǔn),所以方法名稱只要求有意義。范例:定義IEmpService接口package cn.mldn.oracle.servic
73、e;import java.util.List;import java.util.Map;import cn.mldn.oracle.vo.Emp; public interface IEmpService public boolean insert(Emp vo) throws Exception ; public boolean update(Emp vo) throws Exception ;
74、60; public boolean delete(int id) throws Exception ; public Emp get(int id) throws Exception ; public List list() throws Exception ; public Map list(String column,String keyWord,in
75、t currentPage,int lineSize) throws Exception ; 在這個(gè)接口之中,關(guān)鍵性的問題在于list()方法上,此方法返回的是多種數(shù)據(jù)的集合,所以使用Map。4.5.2、定義業(yè)務(wù)層實(shí)現(xiàn)類 如果要定義業(yè)務(wù)層實(shí)現(xiàn)類請(qǐng)一定要記住這個(gè)類要有兩個(gè)功能:打開和關(guān)閉數(shù)據(jù)庫(kù)(不管是否出異常, 數(shù)據(jù)庫(kù)都要關(guān)閉)、調(diào)用數(shù)據(jù)層方法。 &
76、#160; 實(shí)現(xiàn)類保存在cn.mldn.oracle.service.impl子包之中。范例:定義實(shí)現(xiàn)類package cn.mldn.oracle.service.impl;import java.sql.Connection;import java.util.HashMap;import java.util.List;import java.util.Map;import cn.mldn.oracle.dao.IEmpDAO;import cn.mldn.oracle.dbc.DatabaseConnection;import cn.mldn.oracle.fact
77、ory.DAOFactory;import cn.mldn.oracle.service.IEmpService;import cn.mldn.oracle.vo.Emp;public class EmpServiceImpl implements IEmpService / 只要一實(shí)例化本類對(duì)象就自動(dòng)取得了數(shù)據(jù)庫(kù)連接 private DatabaseConnection dbc = new DatabaseConnection() ; Override
78、; public boolean insert(Emp vo) throws Exception try Connection conn = this.dbc.getConnection() ; IEmpDAO dao = DAOFactory.g
79、etIEmpDAOInstance(conn) ; if (dao.findById(vo.getEmpno() = null) / 數(shù)據(jù)不存在 return dao.doCreate(vo); / 增加
80、; return false; catch (Exception e) throw e; finally
81、 this.dbc.close(); Override public boolean update(Emp vo) throws Exception try &
82、#160; return DAOFactory.getIEmpDAOInstance(this.dbc.getConnection() .doUpdate(vo); catch (Except
83、ion e) throw e; finally this.dbc.close(); Ov
84、erride public boolean delete(int id) throws Exception try return DAOFactory.getIEmpDAOInstance(this.dbc.getConnection()
85、; .doRemove(id); catch (Exception e) throw e; finally
86、; this.dbc.close(); Override public Emp get(int id) throws Exception try &
87、#160; return DAOFactory.getIEmpDAOInstance(this.dbc.getConnection() .findById(id); catch (Exception e)
88、; throw e; finally this.dbc.close(); Override public List list() thro
89、ws Exception try return DAOFactory.getIEmpDAOInstance(this.dbc.getConnection()
90、0; .findAll(); catch (Exception e) throw e; finally this.dbc.close(); &
91、#160; Override public Map list(String column, String keyWord, int currentPage, int lineSize) throws Exception t
92、ry Map map = new HashMap() ; map.put("allEmps",
93、160; DAOFactory.getIEmpDAOInstance(this.dbc.getConnection() .findAll(column, keyWord, currentPage, lineSize);
94、; map.put("empCount", DAOFactory.getIEmpDAOInstance(this.dbc.getConnection()
95、0; .getAllCount(column, keyWord); return map ; catch (Exception e)
96、; throw e; finally this.dbc.close(); 現(xiàn)在的代碼由于業(yè)
97、務(wù)層的要求簡(jiǎn)單,所以服務(wù)層看起來也很容易,但是這些是日后的基礎(chǔ)。4.5.3、定義業(yè)務(wù)層工廠類 業(yè)務(wù)層最終也是需要交給其它層進(jìn)行調(diào)用的,所以依然需要定義工廠類,以取得Service層接口對(duì)象。范例:定義ServiceFactorypackage cn.mldn.oracle.factory;import cn.mldn.oracle.service.IEmpService;import cn.mldn.oracle.service.impl.EmpServiceImpl;public class Se
98、rviceFactory public static IEmpService getIEmpService() return new EmpServiceImpl() ; 這個(gè)時(shí)候一個(gè)最標(biāo)準(zhǔn)的后臺(tái)代碼就完成了。4.6、程序測(cè)試 后臺(tái)代碼完成之后下
99、面對(duì)于程序做一些測(cè)試,有兩種測(cè)試方法:利用主方法編寫、利用junit測(cè)試。4.6.1、編寫主方法測(cè)試 下面主要測(cè)試兩個(gè)功能:一個(gè)增加、模糊查詢。范例:測(cè)試增加操作package cn.mldn.oracle.test;import java.util.Date;import cn.mldn.oracle.factory.ServiceFactory;import cn.mldn.oracle.vo.Emp;public class TestEmpInsert p
100、ublic static void main(String args) throws Exception Emp vo = new Emp(); vo.setEmpno(8998); vo.setEname("張吊三"); vo.setHir
101、edate(new Date(); vo.setSal(8000.0); vo.setJob("經(jīng)理"); vo.setComm(1000.0); System.out.println(ServiceFactory.getIEmpService
102、().insert(vo); 范例:測(cè)試查詢package cn.mldn.oracle.test;import java.util.Iterator;import java.util.List;import java.util.Map;import cn.mldn.oracle.factory.ServiceFactory;import cn.mldn.oracle.vo.Emp;public class TestEmpList public static void main(String args) throws E
103、xception Map map = ServiceFactory.getIEmpService().list("ename", "", 2, 5); List all = (List) map.get(&qu
104、ot;allEmps"); Integer count = (Integer) map.get("empCount"); System.out.println("總數(shù)據(jù)量:" + count); Iterator iter = all.iterator();
105、160; while (iter.hasNext() System.out.println(iter.next(); 這種的測(cè)試方式只是最原始的測(cè)試方式。4.6.2、使用JUNIT測(cè)試 &
106、#160; JUNIT測(cè)試最大的好處是可以返回GREEN BAR、RED BAR直觀的視覺體驗(yàn)。1、 選擇要測(cè)試的接口:IEmpService;2、 選擇好接口后,選擇新建。 3、 建立JUNIT中的Test Case。 4、 輸入程序保存的包;5、 選擇要測(cè)試的方法6、 在項(xiàng)目之中添加JUNIT的開發(fā)包 范例:編寫junit測(cè)試程序package cn.mldn
107、.oracle.junit.test;import java.util.Date;import junit.framework.TestCase;import org.junit.Test;import cn.mldn.oracle.factory.ServiceFactory;import cn.mldn.oracle.vo.Emp;public class IEmpServiceTest Test public void testInsert() try Emp vo = new Emp
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 分配生考試數(shù)學(xué)試卷
- 高二上冊(cè)期末數(shù)學(xué)試卷
- 2025年04月山東工商學(xué)院校醫(yī)院臨床醫(yī)師(省屬高校事業(yè)編制)招聘筆試歷年專業(yè)考點(diǎn)(難、易錯(cuò)點(diǎn))附帶答案詳解
- 2025至2030吹風(fēng)機(jī)行業(yè)市場(chǎng)深度研究與戰(zhàn)略咨詢分析報(bào)告
- 廣東初中期末數(shù)學(xué)試卷
- 中藥材種植技術(shù)培訓(xùn)與中藥材市場(chǎng)分析研究考核試卷
- 乳粉生產(chǎn)質(zhì)量管理中的質(zhì)量信息共享與溝通平臺(tái)搭建考核試卷
- 體育賽事觀眾互動(dòng)的線上線下融合模式考核試卷
- 辦公自動(dòng)化系統(tǒng)調(diào)度系統(tǒng)的實(shí)時(shí)性優(yōu)化技術(shù)考核試卷
- 高中理科必修三數(shù)學(xué)試卷
- 上海虹口區(qū)2024-2025學(xué)年下學(xué)期七年級(jí)期末考試英語試題(含答案無聽力原文及音頻)
- 2024年江蘇省徐州市保安員證考試題庫(kù)及答案()
- 2025年江西省中考數(shù)學(xué)試卷真題(含標(biāo)準(zhǔn)答案)
- 2025年物聯(lián)網(wǎng)技術(shù)在智能養(yǎng)老中的老人健康監(jiān)測(cè)與生活服務(wù)保障報(bào)告
- 天臺(tái)保安考試題及答案
- 2025年高考全國(guó)二卷英語高考真題含解析
- 2024年民族出版社招聘事業(yè)編制專業(yè)技術(shù)人員真題
- 2025年食品安全管理員考試試題及答案
- 2025-2030骨科植入器材產(chǎn)業(yè)市場(chǎng)深度分析及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 陜西省西工大附中第二次2025屆數(shù)學(xué)八下期末考試試題含解析
- 2025年中央八項(xiàng)規(guī)定精神學(xué)習(xí)教育應(yīng)知應(yīng)會(huì)考試題庫(kù)(含答案)
評(píng)論
0/150
提交評(píng)論