第7讲DAO设计模式1.DAO概述1.1.DAODAO(dataaccessobject)数据访问对象:是一个sun的一个标准javaEE设计模式,这个模式中有个接口就是DAO,它负持久层的操作。为业务层提供接口。此对象用于访问数据库。通常和PO结合使用,DAO中包含了各种数据库的操作方法,例如:增加、修改、删除、查询等。1.2.O/RMappingObjectRelationalMapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据。在O/RMapping的世界里,有两个基本的也是重要的东西需要了解,即VO,PO。1.3.BO(businessobject)业务对象。从业务模型的角度看,见UML元件领域模型中的领域对象。封装业务逻辑的jaPOPO(persistantobject)持久对象。在o/r映射的时候出现的概念,如果没有o/r映射,没有这个概念存在了。通常对应数据模型(数据库),本身还有部分业务逻辑的处理。可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。1.4.VOVO(valueobject)值对象。通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要.个人觉得同DTO(数据传输对象),在web上传递。1.5.TOTO(TransferObject),数据传输对象。在应用程序不同tie(关系)之间传输的对象1.6.BOva对象,通过调用DAO方法,结合PO,VO进行业务操作。1.7.POJOPOJO(plainordinaryjavaobject)简单无规则java对象。纯的传统意义的java对象。就是说在一些Object/RelationMapping工具中,能够做到维护数据库表记录的persisentobject完全是一个符合JavaBean规范的纯Java对象,没有增加别的属性和方法。我的理解就是最基本的JavaBean,只有属性字段及setter和getter方法。1.8.实体ModelDALDataAccessLayer数据访问层IDALInterfaceDataAccessLayerDAL接口层DALFactoryDataAccessLayerFactory数据访问对象工厂BLLBusinessLogicLayer业务逻辑层BOFBusinessObjectFramework业务对象框架SOAServiceOrientArchitecture面向服务的设计EMFEclipseModelFrameworkEclipse建模框架1.9.企业分层架构显示层(或表现层):HTML、JSP/Servlet进行页面效果显示,负责收集用户请求,并显示处理结果。控制器层:由系列控制器组成,这些控制器用于拦截用户请求,并调用业务逻辑组件的业务逻辑方法,处理用户请求,并根据处理结果转发到不同的表现层组件。业务逻辑层:由一系列的业务逻辑对象组成,这些业务逻辑对象实现了系统所需要的业务逻辑方法。DAO层(或数据访问对象层或数据层):包含一系列的DAO组件,DAO组件提供多个原子性的DAO操作,譬如:增、删、改、查等。Domainobject层(领域对象层):一系列的POJO组成,这些对象包含了各自所需实现的业务逻辑方法。1.10.DAO设计模式+代理设计模式DAO设计模式主要包含5个部分,代理设计模式加上1个部分:1.VO类:包含属性和方法,属性与数据库表中的字段相对应。2.数据库连接类:负责数据库的打开和关闭。【一个接口,一个实现类】3.DAO接口:定义一组原子性操作,譬如,增、删、改、查。4.DAO实现类:实现DAO接口的方法。*5.DAO代理实现类:代理完成数据库的打开和关闭,同时调用DAO实现类对象的操作。6.DAO工厂类:取得一个DAO的实例对象。2.DAO实例编程2.1.MySQL创建数据库和表下载连接MySQL数据库的驱动数据库:mytest表名:employees字段名数据类型是否为空是否主键默认值描述eidintNoYes0员工编号enamevarchar(50)No员工姓名positionvarchar(50)No员工职位hiredateDateNoyyyy-MM-dd雇佣日期salaryfloatNo0员工工资2.2.VO类VO对象–PO对象packagecn.zjjhy.vo;importjava.util.Date;publicclassEmployee{privateinteid;privateStringename;privateStringposition;privateDatehiredate;privatefloatsalary;publicintgetEid(){returneid;}publicvoidsetEid(inteid){this.eid=eid;}publicStringgetEname(){returnename;}publicvoidsetEname(Stringename){this.ename=ename;}publicStringgetPosition(){returnposition;}publicvoidsetPosition(Stringposition){this.position=position;}publicDategetHiredate(){returnhiredate;}publicvoidsetHiredate(Datehiredate){this.hiredate=hiredate;}publicfloatgetSalary(){returnsalary;}publicvoidsetSalary(floatsalary){this.salary=salary;}}2.3.1.数据库连接接口packagecn.zjjhy.dbc;importjava.sql.Connection;publicinterfaceIDatabaseConnection{/***数据库连接方法*@returnConnection数据库连接对象*/publicabstractConnectiongetConnection();/***数据库关闭方法*/publicabstractvoidclose();}2.3.2.数据库连接类packagecn.zjjhy.dbc.impl;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importcn.zjjhy.dbc.IDatabaseConnection;publicclassMySqlDatabaseConnectionimplementsIDatabaseConnection{privatestaticfinalStringDBDriver=com.mysql.jdbc.Driver;privatestaticfinalStringDBURL=jdbc:mysql://localhost:3306/mytest;privatestaticfinalStringDBUSER=root;privatestaticfinalStringDBPW=123;privateConnectionconn;publicMySqlDatabaseConnection(){try{Class.forName(DBDriver);conn=DriverManager.getConnection(DBURL,DBUSER,DBPW);}catch(ClassNotFoundExceptione1){System.out.println(类找不到异常);}catch(SQLExceptione2){System.out.println(连接数据库异常);}catch(Exceptione3){System.out.println(连接数据库失败);}}publicConnectiongetConnection(){returnconn;}publicvoidclose(){if(conn!=null){try{conn.close();}catch(Exceptione){System.out.println(关闭数据库出现异常);}}}}2.4.DAO接口packagecn.zjjhy.dao;importjava.util.List;importcn.zjjhy.vo.Employee;publicinterfaceIEmployeeDAO{//插入booleaninsert(Employeeemp)throwsException;//删除booleandelete(inteid)throwsException;booleandelete(Stringename)throwsException;booleandelete(Employeeemp)throwsException;//修改booleanupdate(inteid,floatsalary)throwsException;//查询EmployeeselectById(inteid)throwsException;ListEmployeeselectAll(Stringkey)throwsException;}2.5.DAO实现类packagecn.zjjhy.dao.impl;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.util.ArrayList;importjava.util.List;importcn.zjjhy.dao.IEmployeeDAO;importcn.zjjhy.vo.Employee;publicclassEmployeeDAOimplementsIEmployeeDAO{privateConnectionconn;privatePreparedStatementpstmt;publicEmployeeDAO(Connectionconn){this.conn=conn;}publicbooleaninsert(Employeeemp)throwsException{booleanflag=false;StringinsertSql=insertintoemployees(eid,ename,position,hiredate,salary)values(?,?,?,?,?);pstmt=conn.prepareStatement(insertSql);pstmt.setInt(1,emp.getEid());pstmt.setString(2,emp.getEname());pstmt.setString(3,emp.getPosition());pstmt.setDate(4,newjava.sql.Date(emp.getHiredate().getTime()));pstmt.setFloat(5,emp.getSalary());intn=pstmt.executeUpdate();if(n0){flag=true;}pstmt.close();returnflag;}publicbooleandelete(inteid)throwsException{booleanflag=false;StringdeleteSql=deletefromemployeeswhereeid=?;pstmt=conn.prepareStatement(deleteSql