李兴华JavaDao设计模式Word格式文档下载.docx
《李兴华JavaDao设计模式Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《李兴华JavaDao设计模式Word格式文档下载.docx(29页珍藏版)》请在冰豆网上搜索。
|-〖数据层〗直接修改雇员数据;
【业务层】实现雇员的删除操作;
|-〖数据层〗直接删除雇员数据;
【业务层】可以根据雇员编号查询出雇员的完整信息;
|-〖数据层〗直接根据编号做限定查询;
【业务层】可以显示全部雇员记录;
|-〖数据层〗查询雇员表的全部数据
【业务层】可以分页显示全部雇员记录,或者可以使用模糊查询进行关键字匹配,在返回全部记录的同时还需要返回本次查询的总数据量;
|-〖数据层〗使用LIKE模糊查询查询满足条件的数据信息;
|-〖数据层〗使用COUNT()函数统计满足条件的数据量。
通过以上的分析就可以清楚的发现,一个业务层还是调用了多个数据层,所以在日后用户所提出的全部要求的细分,基本上都是业务层分析,而只有确定了业务之后才可以确定出数据层。
4.3、代码的准备
首先需要打开Oracle的系统服务,而后建立一个新的项目——DAOProject,同时在项目之中配置好所需要的数据库驱动程序。
系统的开发之中需要有包的规范,现在假设父包名称为:
cn.mldn.oracle。
4.3.1、数据库连接类:
DatabaseConnection
在整个JDBC操作过程之中,数据库只有打开后才可以进行一系列的操作,而后数据库的连接又必须关闭。
那么为了方便控制,可以直接将数据库的打开和关闭操作封装在一个类之中。
数据库的连接类保存包为“cn.mldn.oracle.dbc”,而且此数据库的连接只针对于Oracle定义。
范例:
定义DatabaseConnection.java类
packagecn.mldn.oracle.dbc;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.SQLException;
publicclassDatabaseConnection{
privatestaticfinalStringDBDRIVER="
oracle.jdbc.driver.OracleDriver"
;
privatestaticfinalStringDBURL="
jdbc:
oracle:
thin:
@localhost:
1521:
MLDN"
privatestaticfinalStringDBUSER="
scott"
privatestaticfinalStringPASSWORD="
tiger"
privateConnectionconn;
//准备出一个数据库连接对象
publicDatabaseConnection(){
try{
Class.forName(DBDRIVER);
this.conn=DriverManager.getConnection(DBURL,DBUSER,PASSWORD);
}catch(Exceptione){
e.printStackTrace();
}
publicConnectiongetConnection(){
returnthis.conn;
publicvoidclose(){
if(this.conn!
=null){
this.conn.close();
}catch(SQLExceptione){
}
严格来讲以上的写法只是一个简便写法,因为日后是为了向框架开发靠拢,所有一些地方就需要做一些修改,而最早的时候,对于DAO设计模式的主要功能是为了解决掉数据库的可移植操作问题。
4.3.2、开发简单Java类
简单Java类指的就是类的结构比较单一,主要是由属性、setter/getter方法所组成,简单Java类的主要功能是作为一种数据的载体进行存放,而日后对于简单Java类也会出现如下的名称:
POJO(简单Java类)、VO(值对象)、TO(DTO,数据传输对象,主要用于分布式)、PO(持久化对象)。
可是对于简单Java类的组成结构在开发之中也有了明确要求:
简单Java类的最主要的设计思想来源于数据表,所以一定要和数据表的结构映射上;
简单Java类的名称要与数据表的名称保持一致,注意大小写,例如:
member_info表,类:
MemberInfo;
为了方便程序扩展,所有的简单Java类必须实现java.io.Serializable接口;
类之中的属性必须使用private封装,封装后的属性一定要编写setter、getter方法;
类之中一定要提供有无参构造方法;
类之中不允许使用基本数据类型,所有的基本类型要全部替换为包装类;
类之中不允许出现任何的输出语句,所有的输出必须交给被调用处执行;
类可以有选择性的覆写Object类的:
equals()、hashCode()、toString()。
简单Java类要求保存在cn.mldn.oracle.vo包中。
定义Member.java类
packagecn.mldn.oracle.vo;
importjava.io.Serializable;
importjava.util.Date;
@SuppressWarnings("
serial"
)
publicclassEmpimplementsSerializable{
privateIntegerempno;
privateStringename;
privateStringjob;
privateDatehiredate;
privateDoublesal;
privateDoublecomm;
//setter、getter略
此时类之中默认提供有一个无参构造方法,所以此时的类完全符合于简单Java类的开发标准。
4.4、开发数据层:
DAO层
数据层又分称为持久层,指的是进行持久化数据操作的。
持久层属于DAO层,所以在进行开发的时候首先要开发出操作的标准,而后进行子类的实现。
4.4.1、持久层标准
因为持久层最终要交给业务层进行调用,所以持久层必须有一个自己的操作接口,用于定义标准,但是此接口的命名是有要求的,如果当前操作的是emp表,那么这个接口应该命名为EmpDAO,但是为了区分接口还有类,所以现在要求在接口定义前增加一个字母I,所以emp表的持久层标准名称:
IEmpDAO,而且此接口要保存在cn.mldn.oracle.dao下。
在数据层之中定义的方法严格来讲就只有两类:
数据更新操作:
此类方法的命名以“doXxx()”的形式,例如:
doCreate()、doUpdate()、doRemove();
数据查询操作:
查询会分为两个小类:
|-数据查询:
此类方法以“findXxx()”命名,例如:
findById()、findByJob()、findAll();
|-统计查询:
此类方法以“getXxx()”命名,例如:
getAllCount()。
定义IEmpDAO接口
packagecn.mldn.oracle.dao;
importjava.util.List;
importcn.mldn.oracle.vo.Emp;
publicinterfaceIEmpDAO{
publicbooleandoCreate(Empvo)throwsException;
publicbooleandoUpdate(Empvo)throwsException;
publicbooleandoRemove(Integerid)throwsException;
publicEmpfindById(Integerid)throwsException;
publicListfindAll()throwsException;
publicListfindAll(Stringcolumn,StringkeyWord,
IntegercurrentPage,IntegerlineSize)throwsException;
publicIntegergetAllCount(Stringcolumn,StringkeyWord)throwsException;
以后的工作之中一定要按照以上的要求编写注释信息,这才叫合格代码。
4.4.2、定义数据层实现类:
EmpDAOImpl
接口标准定义完成之后,下面就可以进行实现类的编写,编写的实现类要保存在cn.mldn.oracle.dao.impl子包之中,而且名称后面一定要加上Impl。
但是对于实现类,现在采用如下的方式编写。
观察问题
@Override
publicbooleandoCreate(Empvo)throwsException{
Stringsql="
INSERTINTOemp(empno,ename,job,hiredate,sal,comm)VALUES(?
?
)"
DatabaseConnectiondbc=newDatabaseConnection();
Connectionconn=dbc.getConnection();
PreparedStatementpstmt=conn.prepareStatement(sql);
pstmt.setInt(1,vo.getEmpno());
pstmt.setString(2,vo.getEname());
pstmt.setString(3,vo.getJob());
pstmt.setDate(4,newjava.sql.Date(vo.getHiredate().getTime()));
pstmt.setDouble(5,vo.getSal());
pstmt.setDouble(6,vo.getComm());
if(pstmt.executeUpdate()>
0){
returntrue;
dbc.close();
returnfalse;
如果此时的实现类按照如下的方式编写,可能存在有两个重要问题:
根据异常的处理来讲,如果在处理过程之中出现了数据库的更新异常,那么就再也关不上了,而且在本程序之中,如果更新成功直接返回了,也无法关闭;
一个业务层会调用多个数据层操作,现在把数据库的打开和关闭操作放在了数据层的每一个方法里面,这就意味着,一个业务操作的时候会打开和关闭数据库多次,那么可以将数据库的连接和关闭操作交给业务层处理;
标准实现
packagecn.mldn.oracle.dao.impl;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.util.ArrayList;
importcn.mldn.oracle.dao.IEmpDAO;
publicclassEmpDAOImplimplementsIEmpDAO{
privateConnectionconn;
privatePreparedStatementpstmt;
publicEmpDAOImpl(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,newjava.sql.Date(vo.getHiredate().getTime()));
this.pstmt.setDouble(5,vo.getSal());
this.pstmt.setDouble(6,vo.getComm());
if(this.pstmt.executeUpdate()>
returntrue;
publicbooleandoUpdate(Empvo)throwsException{
UPDATEempSETename=?
job=?
hiredate=?
sal=?
comm=?
WHEREempno=?
"
this.pstmt.setString(1,vo.getEname());
this.pstmt.setString(2,vo.getJob());
this.pstmt.setDate(3,newjava.sql.Date(vo.getHiredate().getTime()));
this.pstmt.setDouble(4,vo.getSal());
this.pstmt.setDouble(5,vo.getComm());
this.pstmt.setInt(6,vo.getEmpno());
publicbooleandoRemove(Integerid)throwsException{
DELETEFROMempWHEREempno=?
this.pstmt.setInt(1,id);
publicEmpfindById(Integerid)throwsException{
Empvo=null;
SELECTempno,ename,job,hiredate,sal,commFROMempWHEREempno=?
ResultSetrs=this.pstmt.executeQuery();
if(rs.next()){//有数据返回
vo=newEmp();
vo.setEmpno(rs.getInt
(1));
vo.setEname(rs.getString
(2));
vo.setJob(rs.getString(3));
vo.setHiredate(rs.getDate(4));
vo.setSal(rs.getDouble(5));
vo.setComm(rs.getDouble(6));
returnvo;
publicListfindAll()throwsException{
Listall=newArrayList();
SELECTempno,ename,job,hiredate,sal,commFROMemp"
while(rs.next()){
Empvo=newEmp();
all.add(