




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、4.1、關于設計分層的初步概念 在軟件開發(fā)過程之中一定要存在有一個程序的層次概念,每一個程序?qū)哟味家瓿赡承┚唧w的操作,而在一般情況下,分層的原則:不超過三層的原則,而常見的分層模式如下。 以上只是給出了一些層次的基本描述名稱,但是嚴格來講,每一層還會有更多的劃分,如果是一個更加嚴格的劃分,有可能劃分成如下的形式。
2、0; 對于業(yè)務層如果是一些簡單的程序開發(fā),以上的形式已經(jīng)夠使用了,但是很多時候還會遇見一些更為復雜的應用,那么業(yè)務層上還會繼續(xù)進行劃分。 今天的任務不是去研究控制層,也不是研究顯示層,而專注于業(yè)務層與數(shù)據(jù)層,而且最為基本的操作是只存在一層業(yè)務。一直強調(diào),業(yè)務層是整個項目的核心,而你們最大的特點是在業(yè)務層上表現(xiàn)。 那么下面就以刁雪冰后面站著聽課為例,說明業(yè)務層和數(shù)據(jù)層的關聯(lián)。
3、0; 通過以上的分析就可以發(fā)現(xiàn),一個業(yè)務層需要調(diào)用多個數(shù)據(jù)層,而數(shù)據(jù)層所提供的都是數(shù)據(jù)庫的原子性操作(INSERT、UPDATE、DELETE、SELECT)。那么就可以給出概念:· 數(shù)據(jù)層(數(shù)據(jù)訪問層、持久層),一般會使用“Data Access Object”表示,簡稱為DAO,在DAO之中提供的是一系列的數(shù)據(jù)庫操作標準(接口);· 業(yè)務層(服務層),一般會使用“Service”表示,由于業(yè)務層最終也是要給控制層進行調(diào)用(今天給客戶直接調(diào)用)、所以業(yè)務層也需要有一個自己的操作標準,而一個業(yè)務層就需要調(diào)用多個數(shù)據(jù)
4、層。4.2、實例分析 現(xiàn)在要求使用emp表(基本字段:empno、ename、job、hiredate、sal、comm)實現(xiàn)如下功能: · 【業(yè)務層】實現(xiàn)新雇員的增加操作;
5、0; |- 數(shù)據(jù)層雇員的編號是由用戶自己輸入的,所以必須首先確定雇員編號是否存在,需要查詢;
6、160; |- 數(shù)據(jù)層如果雇員編號不存在,則執(zhí)行增加操作,更新; · 【業(yè)務層】實現(xiàn)雇員的修改操作;
7、; |- 數(shù)據(jù)層直接修改雇員數(shù)據(jù); · 【業(yè)務層】實現(xiàn)雇員的刪除操作;
8、160; |- 數(shù)據(jù)層直接刪除雇員數(shù)據(jù); · 【業(yè)務層】可以根據(jù)雇員編號查詢出雇員的完整信息;
9、160; |- 數(shù)據(jù)層直接根據(jù)編號做限定查詢; · 【業(yè)務層】可以顯示全部雇員記錄; &
10、#160; |- 數(shù)據(jù)層查詢雇員表的全部數(shù)據(jù)· 【業(yè)務層】可以分頁顯示全部雇員記錄,或者可以使用模糊查詢進行關鍵字匹配,在返回全部記錄的同時還需要返回本次查詢的總數(shù)據(jù)量;
11、 |- 數(shù)據(jù)層使用LIKE模糊查詢查詢滿足條件的數(shù)據(jù)信息; |- 數(shù)據(jù)層使用COUNT()函數(shù)統(tǒng)計滿足條件的數(shù)據(jù)量。 通過以上的分析
12、就可以清楚的發(fā)現(xiàn),一個業(yè)務層還是調(diào)用了多個數(shù)據(jù)層,所以在日后用戶所提出的全部要求的細分,基本上都是業(yè)務層分析,而只有確定了業(yè)務之后才可以確定出數(shù)據(jù)層。4.3、代碼的準備 首先需要打開Oracle的系統(tǒng)服務,而后建立一個新的項目 DAOProject,同時在項目之中配置好所需要的數(shù)據(jù)庫驅(qū)動程序。 系統(tǒng)的開發(fā)之中需要有包的規(guī)范,現(xiàn)在假設父包名稱為:cn.mldn.oracle。4.3.1、數(shù)據(jù)庫連接類:Dat
13、abaseConnection 在整個JDBC操作過程之中,數(shù)據(jù)庫只有打開后才可以進行一系列的操作,而后數(shù)據(jù)庫的連接又必須關閉。那么為了方便控制,可以直接將數(shù)據(jù)庫的打開和關閉操作封裝在一個類之中。 數(shù)據(jù)庫的連接類保存包為“cn.mldn.oracle.dbc”,而且此數(shù)據(jù)庫的連接只針對于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 ; / 準備出一個數(shù)據(jù)庫連接對象 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、 嚴格來講以上的寫法只是一個簡便寫法,因為日后是為了向框架開發(fā)靠攏,所有一些地方就需要做一些修改,而最早的時候,對于DAO設計模式的主要功能是為了解決掉數(shù)據(jù)庫的可移植操作問題。 4.3.2、開發(fā)簡單Java類 簡
21、單Java類指的就是類的結(jié)構比較單一,主要是由屬性、setter/getter方法所組成,簡單Java類的主要功能是作為一種數(shù)據(jù)的載體進行存放,而日后對于簡單Java類也會出現(xiàn)如下的名稱:POJO(簡單Java類)、VO(值對象)、TO(DTO,數(shù)據(jù)傳輸對象,主要用于分布式)、PO(持久化對象)??墒菍τ诤唵蜫ava類的組成結(jié)構在開發(fā)之中也有了明確要求: · 簡單Java類的最主要的設計思想來源于數(shù)據(jù)表,所以一定要和數(shù)據(jù)表的結(jié)構映射上;
22、60; · 簡單Java類的名稱要與數(shù)據(jù)表的名稱保持一致,注意大小寫,例如:member_info表,類:MemberInfo; · 為了方便程序擴展,所有的簡單Java類必須實現(xiàn)java.io.Serializable接口; · 類之中的屬性必須使用private封裝,封裝后的屬性一定要編寫setter、getter方法;
23、160; · 類之中一定要提供有無參構造方法; · 類之中不允許使用基本數(shù)據(jù)類型,所有的基本類型要全部替換為包裝類; · 類之中不允許出現(xiàn)任何的輸出語句,所有的輸出必須交給被調(diào)用處執(zhí)行; · 類可以有
24、選擇性的覆寫Object類的:equals()、hashCode()、toString()。 簡單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; 此時類之中默認提供有一個無參構造方法,所以此時的類完全符合于簡單Java類的開發(fā)標準。4.4、開發(fā)數(shù)據(jù)層:DAO層 數(shù)據(jù)層又分稱為持久層,指的是進行持久化數(shù)據(jù)操作的。持久層屬于DAO層,所以在進行開發(fā)的時候首先要開發(fā)出操作的標準,而后進行子類的實現(xiàn)。4.4.1、持久層標準 因為持久層最終要交給業(yè)務層進行調(diào)用,所以持久層必須有一個自己的操作接口,用于定義標準,
27、但是此接口的命名是有要求的,如果當前操作的是emp表,那么這個接口應該命名為EmpDAO,但是為了區(qū)分接口還有類,所以現(xiàn)在要求在接口定義前增加一個字母I,所以emp表的持久層標準名稱:IEmpDAO,而且此接口要保存在cn.mldn.oracle.dao下。 在數(shù)據(jù)層之中定義的方法嚴格來講就只有兩類:
28、; · 數(shù)據(jù)更新操作:此類方法的命名以“doXxx()”的形式,例如:doCreate()、doUpdate()、doRemove(); · 數(shù)據(jù)查詢操作:查詢會分為兩個小類:
29、0; |- 數(shù)據(jù)查詢:此類方法以“findXxx()”命名,例如:findById()、findByJob()、findAll();
30、 |- 統(tǒng)計查詢:此類方法以“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ù)層實現(xiàn)類:EmpDAOImpl 接口標準定義完成之后,下面就可以進行實現(xiàn)類的編寫,編寫的實現(xiàn)類要保存在cn.mldn.oracle.dao.impl子包之中,而且名稱后面一定要加上Impl。但是對于實現(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; 如果此時的實現(xiàn)類按照如下的方式編寫,可能存在有兩個重要問題:· 根據(jù)異常的處理來講,如果在處理過程之中出現(xiàn)了數(shù)據(jù)庫的更新異常,那么就再也關不上了,而且在本程序之中,如果更新成功直接返回了,也無法關閉;· 一個業(yè)務層會調(diào)用多個數(shù)據(jù)層操作,現(xiàn)在把數(shù)據(jù)庫的打開和關閉操作放在了數(shù)據(jù)層的每一個方法里面,這就意味著
39、,一個業(yè)務操作的時候會打開和關閉數(shù)據(jù)庫多次,那么可以將數(shù)據(jù)庫的連接和關閉操作交給業(yè)務層處理;范例:標準實現(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; 雖然代碼較長,但是所有的代碼都是標準的JDBC操作,而且每一個方法都只完成一個基本的原子性操作。4.4.3、建立數(shù)據(jù)層工廠類 最終數(shù)據(jù)層是要交給業(yè)務層調(diào)用的,而業(yè)務層為了和
70、數(shù)據(jù)層之間不產(chǎn)生耦合,所以不允許直接使用子類為數(shù)據(jù)層接口實例化,必須通過工廠類來完成,工廠應該保存在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) ; 對于業(yè)務層在通過工廠類取得數(shù)據(jù)層接口實例的時候一定要傳遞連接對象。4.5、開發(fā)業(yè)務層:Service層 數(shù)據(jù)層完成后最終一定要交給業(yè)務層進行調(diào)用,所以在業(yè)務層里面就需要通過工
72、廠取得數(shù)據(jù)層接口對象,同時業(yè)務層由于最終也必須由控制層(本次不考慮控制層,只考慮客戶端)調(diào)用,所以也需要制定業(yè)務層接口標準和相關的子類實現(xiàn)。4.5.1、業(yè)務層操作標準 業(yè)務層的功能在之前已經(jīng)建立完成了,而且現(xiàn)在的業(yè)務層依然是圍繞emp表進行,所以業(yè)務層的接口名稱就為IEmpService,保存在cn.mldn.oracle.service包之中。同時業(yè)務層的方法沒有特別明確的標準,所以方法名稱只要求有意義。范例:定義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 ; 在這個接口之中,關鍵性的問題在于list()方法上,此方法返回的是多種數(shù)據(jù)的集合,所以使用Map。4.5.2、定義業(yè)務層實現(xiàn)類 如果要定義業(yè)務層實現(xiàn)類請一定要記住這個類要有兩個功能:打開和關閉數(shù)據(jù)庫(不管是否出異常, 數(shù)據(jù)庫都要關閉)、調(diào)用數(shù)據(jù)層方法。 &
76、#160; 實現(xiàn)類保存在cn.mldn.oracle.service.impl子包之中。范例:定義實現(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ù)據(jù)庫連接 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、務層的要求簡單,所以服務層看起來也很容易,但是這些是日后的基礎。4.5.3、定義業(yè)務層工廠類 業(yè)務層最終也是需要交給其它層進行調(diào)用的,所以依然需要定義工廠類,以取得Service層接口對象。范例:定義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() ; 這個時候一個最標準的后臺代碼就完成了。4.6、程序測試 后臺代碼完成之后下
99、面對于程序做一些測試,有兩種測試方法:利用主方法編寫、利用junit測試。4.6.1、編寫主方法測試 下面主要測試兩個功能:一個增加、模糊查詢。范例:測試增加操作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); 范例:測試查詢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(); 這種的測試方式只是最原始的測試方式。4.6.2、使用JUNIT測試 &
106、#160; JUNIT測試最大的好處是可以返回GREEN BAR、RED BAR直觀的視覺體驗。1、 選擇要測試的接口:IEmpService;2、 選擇好接口后,選擇新建。 3、 建立JUNIT中的Test Case。 4、 輸入程序保存的包;5、 選擇要測試的方法6、 在項目之中添加JUNIT的開發(fā)包 范例:編寫junit測試程序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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 腫瘤診療中的精準醫(yī)療技術2025年臨床應用效果分析報告001
- 安全檢查試題及答案
- 農(nóng)村一二三產(chǎn)業(yè)融合對農(nóng)村生態(tài)環(huán)境保護的法律法規(guī)保障研究報告
- 醫(yī)護合理用藥培訓課件
- 2025屆浙江省杭州市文瀾中學七年級英語第二學期期中經(jīng)典試題含答案
- 中國養(yǎng)老教學課件
- 公文培訓課件
- 旅行社掃黑除惡培訓課件
- 中國佛教發(fā)展史
- 個案護理查房技巧
- 2025年高考山東卷化學試題講評及備考策略指導(課件)
- 保潔學校管理制度
- 天臺保安考試題及答案
- 招聘渠道ROI評估模型-洞察及研究
- 2025年河北省中考麒麟卷生物(三)及答案
- 2025春季學期國開電大本科《人文英語4》一平臺機考真題及答案(第六套)
- 第七單元1認識小數(shù)(課件)-三年級數(shù)學下冊(人教版)
- 2025年河北省中考麒麟卷生物(二)及答案
- 2025年河北省萬唯中考定心卷地理(二)
- 2025年高考全國二卷英語高考真題含解析
- 2024年民族出版社招聘事業(yè)編制專業(yè)技術人員真題
評論
0/150
提交評論