1、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) returntruedbc.close() ;false;如果真的按照这种方式实现的程序,有两个重要问题:对于数据层
2、之中给出的若干方法,由服务层调用,一个服务层要执行N个数据层,那么每次执行的时候打开一次关闭一次数据库?按照异常的处理机制,如果现在执行的过程之中出现了错误,那么顺着throws就结束调用了,数据库就再也无法关闭了。按照之前的分析,一个业务要进行多个数据层操作,所以数据库连接与关闭交给业务层做最合适,而数据层只需要有一个Connection对象就可以操作了,它不需要关心这个对象是从那里来的,怎么来的,只关心能不能使用。packagecn.mldn.oracle.dao.impl;importjava.sql.Connection;java.sql.PreparedStatement;java.
3、sql.ResultSet;java.util.ArrayList;java.util.List;cn.mldn.oracle.dao.IEmpDAO;cn.mldn.oracle.vo.Emp;classEmpDAOImplimplementsIEmpDAO privateConnectionconn;PreparedStatementpstmt;EmpDAOImpl(Connection conn) this.conn= conn;this.pstmt=this.conn.prepareStatement(sql);this.pstmt.setInt(1, vo.getEmpno();th
4、is.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(Emp vo)UPDATE emp SET ename=?,job=?,hiredate=?,sal=?,comm=? WHERE empno=?this.pstmt.setStrin
5、g(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(intid)DELETE FROM emp WHERE empno=?this.pstmt.setInt(1, id);Emp findById(intEmp emp =null;SELECT empno,enam
6、e,job,hiredate,sal,comm FROM emp WHERE empno=?ResultSet rs =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 findAll() all =A
7、rrayList();SELECT empno,ename,job,hiredate,sal,comm FROM empwhileall.add(emp);all; findAll(String column, String keyWord,intcurrentPage,lineSize)SELECT * FROM (+SELECT empno,ename,job,hiredate,sal,comm,ROWNUM rn FROM emp WHERE + column + LIKE ? AND ROWNUM? this.pstmt.setString(1,%+ keyWord +);this.p
8、stmt.setInt(2, currentPage * lineSize);this.pstmt.setInt(3, (currentPage - 1) * lineSize);getAllCount(String column, String keyWord)SELECT COUNT(empno) FROM emp WHERE this.conn.prepareStatement(sql) ;this.pstmt.executeQuery() ;rs.getInt(1) ;0;3.4.3、定义DAO工厂类由于不同层之间只能依靠接口取得对象,所以就一定需要定义工厂操作类,工厂类定义在cn.m
9、ldn.oracle.factory包之中,名称为DAOFactory。定义工厂类cn.mldn.oracle.factory;cn.mldn.oracle.dao.impl.EmpDAOImpl;DAOFactory staticIEmpDAO getIEmpDAOInstance(Connection conn) EmpDAOImpl(conn) ;3.5、开发业务层(重点)3.5.1、开发业务层标准业务层以后也是需要留给其他层进行调用的,所以业务层定义的时候也需要首先定义出操作标准,而这个标准也依然使用接口完成,对于业务层,接口命名要求:表名称+ Service,例如:IEmpServi
10、ce,表示操作Emp表的业务。在cn.mldn.oracle.service包中定义IEmpService接口cn.mldn.oracle.service;java.util.Map;interfaceIEmpService /*调用数据库的增加操作,操作流程如下:li首先要使用IEmpDAO接口中的findById()方法,根据要增加的id查看指定的雇员信息是否存在;如果要增加的雇员信息不存在,则执行IEmpDAO接口的doCreate()方法,并将结果返回;paramvo包装数据的对象return如果增加成功,返回true,如果雇员编号存在或者是增加失败,返回falsethrowsExce
11、ption有异常交给被调用处处理*/insert(Emp vo)Exception;执行数据的更新操作,操作的时候直接调用IEmpDAO接口的doUpdate()方法,并将更新结果返回如果修改成功,返回true,如果数据不存在或修改失败,返回falseupdate(Emp vo)Exception ;执行数据的删除操作,删除操作的时候调用IEmpDAO接口的doRemove()方法id要删除雇员的id如果删除成功,返回true,如果数据不存在或删除失败,则返回falsedelete(int根据雇员的编号取得全部的信息雇员编号如果雇员存在则将数据包装为Emp对象返回,如果数据不存在则返回null
12、Emp get(int查询全部或者是模糊查询全部数据,查询的同时可以返回满足此查询的数据量,在调用的时候需要执行以下操作:查询全部的雇员信息:需要IEmpDAO接口的findAll()方法;查询满足条件的雇员数量:使用IEmpDAO接口的getAllCount()方法操作;column模糊查询的字段keyWord模糊查询的关键字currentPage当前所在页lineSize每页显示的数据长度由于在进行数据返回的时候,此方法要返回两类数据:、int,使用Map返回:返回值1:key = allEmps,value = findAll();返回值2:key = empCount,value =
13、getAllCount();Map list(String column, String keyWord,currentPage,3.5.2、定义业务层标准的实现类如果现在要想实现业务层的标准,必须有一个原则先把握住:一个业务层的方法操作要调用多个数据层,同时每个业务要处理数据库的打开和关闭。定义标准实现类cn.mldn.oracle.service.impl.EmpServiceImplcn.mldn.oracle.service.impl;java.util.HashMap;cn.mldn.oracle.dbc.DatabaseConnection;cn.mldn.oracle.facto
14、ry.DAOFactory;cn.mldn.oracle.service.IEmpService;EmpServiceImplDatabaseConnectiondbcDatabaseConnection() ;tryConnection conn =this.dbc.getConnection() ;/取得连接IEmpDAO dao = DAOFactory.getIEmpDAOInstance(conn) ;取得DAO接口对象(dao.findById(vo.getEmpno() =null) 没有要查询的雇员信息dao.doCreate(vo) ;返回DAO的结果数据存在,直接返回falsecatch(Exception e) throwe;finallythis.dbc.close();DAOFactory.getIEmpDAOInstance(this.dbc.getConnection().doUpdate(vo);