DAO设计模式2Word文件下载.docx
《DAO设计模式2Word文件下载.docx》由会员分享,可在线阅读,更多相关《DAO设计模式2Word文件下载.docx(28页珍藏版)》请在冰点文库上搜索。
![DAO设计模式2Word文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/a33a04f1-cc57-4528-8821-65e2fb6b3df3/a33a04f1-cc57-4528-8821-65e2fb6b3df31.gif)
pstmt.setInt(1,vo.getEmpno());
pstmt.setString(2,vo.getEname());
pstmt.setString(3,vo.getJob());
pstmt.setDate(4,
java.sql.Date(vo.getHiredate().getTime()));
pstmt.setDouble(5,vo.getSal());
pstmt.setDouble(6,vo.getComm());
if
(pstmt.executeUpdate()>
0){
return
true
}
dbc.close();
false;
如果真的按照这种方式实现的程序,有两个重要问题:
对于数据层之中给出的若干方法,由服务层调用,一个服务层要执行N个数据层,那么每次执行的时候打开一次关闭一次数据库?
按照异常的处理机制,如果现在执行的过程之中出现了错误,那么顺着throws就结束调用了,数据库就再也无法关闭了。
按照之前的分析,一个业务要进行多个数据层操作,所以数据库连接与关闭交给业务层做最合适,而数据层只需要有一个Connection对象就可以操作了,它不需要关心这个对象是从那里来的,怎么来的,只关心能不能使用。
package
cn.mldn.oracle.dao.impl;
import
java.sql.Connection;
java.sql.PreparedStatement;
java.sql.ResultSet;
java.util.ArrayList;
java.util.List;
cn.mldn.oracle.dao.IEmpDAO;
cn.mldn.oracle.vo.Emp;
class
EmpDAOImpl
implements
IEmpDAO{
private
Connection
conn;
PreparedStatement
pstmt;
EmpDAOImpl(Connectionconn){
this.conn
=conn;
this.pstmt
=
this.conn.prepareStatement(sql);
this.pstmt.setInt(1,vo.getEmpno());
this.pstmt.setString(2,vo.getEname());
this.pstmt.setString(3,vo.getJob());
this.pstmt.setDate(4,
this.pstmt.setDouble(5,vo.getSal());
this.pstmt.setDouble(6,vo.getComm());
(this.pstmt.executeUpdate()>
true;
doUpdate(Empvo)
UPDATEempSETename=?
job=?
hiredate=?
sal=?
comm=?
WHEREempno=?
this.pstmt.setString(1,vo.getEname());
this.pstmt.setString(2,vo.getJob());
this.pstmt.setDate(3,
this.pstmt.setDouble(4,vo.getSal());
this.pstmt.setDouble(5,vo.getComm());
this.pstmt.setInt(6,vo.getEmpno());
doRemove(int
id)
DELETEFROMempWHEREempno=?
this.pstmt.setInt(1,id);
EmpfindById(int
Empemp=
null;
SELECTempno,ename,job,hiredate,sal,commFROMempWHEREempno=?
ResultSetrs=
this.pstmt.executeQuery();
(rs.next()){
emp=
Emp();
emp.setEmpno(rs.getInt
(1));
emp.setEname(rs.getString
(2));
emp.setJob(rs.getString(3));
emp.setHiredate(rs.getDate(4));
emp.setSal(rs.getDouble(5));
emp.setComm(rs.getDouble(6));
emp;
List<
Emp>
findAll()
all=
ArrayList<
();
SELECTempno,ename,job,hiredate,sal,commFROMemp"
while
all.add(emp);
all;
findAll(Stringcolumn,StringkeyWord,
int
currentPage,
lineSize)
SELECT*FROM("
+
SELECTempno,ename,job,hiredate,sal,comm,ROWNUMrnFROMempWHERE"
+column+
LIKE?
ANDROWNUM<
=?
)temp"
WHEREtemp.rn>
?
"
this.pstmt.setString(1,
%"
+keyWord+
);
this.pstmt.setInt(2,currentPage*lineSize);
this.pstmt.setInt(3,(currentPage-1)*lineSize);
getAllCount(Stringcolumn,StringkeyWord)
SELECTCOUNT(empno)FROMempWHERE"
this.conn.prepareStatement(sql);
this.pstmt.executeQuery();
rs.getInt
(1);
0;
3.4.3
、定义DAO工厂类
由于不同层之间只能依靠接口取得对象,所以就一定需要定义工厂操作类,工厂类定义在cn.mldn.oracle.factory包之中,名称为DAOFactory。
定义工厂类
cn.mldn.oracle.factory;
cn.mldn.oracle.dao.impl.EmpDAOImpl;
DAOFactory{
static
IEmpDAOgetIEmpDAOInstance(Connectionconn){
EmpDAOImpl(conn);
3.5、开发业务层(重点)
3.5.1
、开发业务层标准
业务层以后也是需要留给其他层进行调用的,所以业务层定义的时候也需要首先定义出操作标准,而这个标准也依然使用接口完成,对于业务层,接口命名要求:
表名称
+Service,例如:
IEmpService,表示操作Emp表的业务。
在cn.mldn.oracle.service包中定义IEmpService接口
cn.mldn.oracle.service;
java.util.Map;
interface
IEmpService{
/**
*
调用数据库的增加操作,操作流程如下:
<
br>
li>
首先要使用IEmpDAO接口中的findById()方法,根据要增加的id查看指定的雇员信息是否存在;
如果要增加的雇员信息不存在,则执行IEmpDAO接口的doCreate()方法,并将结果返回;
@param
vo
包装数据的对象
@return
如果增加成功,返回true,如果雇员编号存在或者是增加失败,返回false
@throws
Exception
有异常交给被调用处处理
*/
insert(Empvo)
Exception;
执行数据的更新操作,操作的时候直接调用IEmpDAO接口的doUpdate()方法,并将更新结果返回
如果修改成功,返回true,如果数据不存在或修改失败,返回false
update(Empvo)
Exception;
执行数据的删除操作,删除操作的时候调用IEmpDAO接口的doRemove()方法
id
要删除雇员的id
如果删除成功,返回true,如果数据不存在或删除失败,则返回false
delete(int
根据雇员的编号取得全部的信息
雇员编号
如果雇员存在则将数据包装为Emp对象返回,如果数据不存在则返回null
Empget(int
查询全部或者是模糊查询全部数据,查询的同时可以返回满足此查询的数据量,在调用的时候需要执行以下操作:
查询全部的雇员信息:
需要IEmpDAO接口的findAll()方法;
查询满足条件的雇员数量:
使用IEmpDAO接口的getAllCount()方法操作;
column
模糊查询的字段
keyWord
模糊查询的关键字
currentPage
当前所在页
lineSize
每页显示的数据长度
由于在进行数据返回的时候,此方法要返回两类数据:
、int,使用Map返回:
返回值1:
key=allEmps,value=findAll();
返回值2:
key=empCount,value=getAllCount();
Map<
String,Object>
list(Stringcolumn,StringkeyWord,
currentPage,
3.5.2
、定义业务层标准的实现类
如果现在要想实现业务层的标准,必须有一个原则先把握住:
一个业务层的方法操作要调用多个数据层,同时每个业务要处理数据库的打开和关闭。
定义标准实现类
——
cn.mldn.oracle.service.impl.EmpServiceImpl
cn.mldn.oracle.service.impl;
java.util.HashMap;
cn.mldn.oracle.dbc.DatabaseConnection;
cn.mldn.oracle.factory.DAOFactory;
cn.mldn.oracle.service.IEmpService;
EmpServiceImpl
DatabaseConnection
dbc
DatabaseConnection();
try
{
Connectionconn=
this.dbc.getConnection();
//
取得连接
IEmpDAOdao=DAOFactory.getIEmpDAOInstance(conn);
取得DAO接口对象
(dao.findById(vo.getEmpno())==
null){
没有要查询的雇员信息
dao.doCreate(vo);
返回DAO的结果
数据存在,直接返回false
}
catch
(Exceptione){
throw
e;
finally
this.dbc.close();
DAOFactory.getIEmpDAOInstance(this.dbc.getConnection())
.doUpdate(vo);