# DAOProject **Repository Path**: hcflyambation/daoproject ## Basic Information - **Project Name**: DAOProject - **Description**: 使用DAO(数据访问对象)的设计模式,来开发了一个数据访问接口(PostgreSQL)。 使用JSP简单使用了这个接口。 客户层(Client)-> 显示层(jsp/servlet)-> 业务层(BO) -> 数据层(BAO) -> 资源层(DataBase) - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-25 - **Last Updated**: 2021-03-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## DAO(数据访问对象) > 程序的标准架构为: > > 客户层(Client)-> 显示层(jsp/servlet)-> 业务层(BO) -> 数据层(BAO) -> 资源层(DataBase) ### 1,组成部分(Java命名规范) > + 1,DatabaseConnection: 专门负责数据库打开和关闭操作的类;(xxx.dbc.DatabaseConnection) > + 2,VO:主要由属性、setter、geter组成,VO类中的属性与表中的字段相对应。(xxx.vo.Xxx) > + 3,DAO: 主要定义操作的接口,定义一系列的数据库的原子性操作,如,增删改查。(xxx.dao.XxxDAO) > + 4,Impl:DAO接口的真实实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭。(xxx.dao.impl.XxxDAOImpl) > + 5,Proxy:代理实现类,主要完成数据库的打开和关闭,并且调用真实实现类对象的操作。(xxx.dao.proxy.XxxDAOProxy) > + 6,Factory:工厂类,通过工厂类获得一个DAO的实例化对象。(xxx.factory.DAOFactory) ### 2,DAO的实例开发 > 项目结构: > > ![image-20210325170339548](https://gitee.com/hcflyambation/daoproject/raw/master/IMGs/emp_gouzao.png) #### 2.1,数据库脚本建立(使用PostgreSQL) > 数据库名为:jsp ~~~sql create table emp ( empno int primary key, ename varchar(10), job varchar(9), hiredate date, sal decimal ); ~~~ #### 2.2,编写与数据库对应的OV类(Emp.java) ~~~java package com.hcfly.vo; import java.math.BigDecimal; import java.util.Date; public class Emp { private int empno; private String ename; private String job; private Date hiredate; private float sal; public int getEmpno() { return empno; } public void setEmpno(int empno) { this.empno = empno; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public Date getHiredate() { return hiredate; } public void setHiredate(Date hiredate) { this.hiredate = hiredate; } public float getSal() { return sal; } public void setSal(float sal) { this.sal = sal; } } ~~~ #### 2.3, 编写数据库连接类(DatabaseConnection.java) > 这个地方可以将DatabaseConnection抽象为一个接口,并且用不同的数据库去实现它,来达到通用的水平。 ~~~java package com.hcfly.dbc; import java.sql.Connection; import java.sql.DriverManager; public class DatabaseConnection { // 数据库连接类 private static final String DBDRIVER = "org.postgresql.Driver"; private static final String DBURL = "jdbc:postgresql://localhost/jsp"; private static final String DBUSER = "postgres"; private static final String DBPASSWORD = "miaomiao"; private Connection connection = null; public DatabaseConnection() throws Exception{ try { Class.forName(DBDRIVER); this.connection = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD); // System.out.println("连接成功"); } catch (Exception e) { throw e; // TODO: handle exception } } public Connection getConnection() { return this.connection; } public void close() throws Exception { if(this.connection != null) { try { this.connection.close(); } catch (Exception e) { throw e; // TODO: handle exception } } } } ~~~ #### 2.4,定义DAO操作标准(IEmpDAO.java) ~~~java package com.hcfly.dao; import java.util.List; import com.hcfly.vo.Emp; public interface IEmpDAO { // 定义DAO操作 /** * 定义DAO的标准操作 * */ public boolean doCreate(Emp emp) throws Exception; /** * @param emp要增加的数据对象 */ public List findAll(String keyWord) throws Exception; /** * 根据查询关键字进行搜索 */ public Emp findById(int empno) throws Exception; } ~~~ #### 2.5,真实主题实现类(EmpDAOImpl.java) ~~~java package com.hcfly.dao.impl; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import com.hcfly.dao.IEmpDAO; import com.hcfly.vo.Emp; public class EmpDAOImpl implements IEmpDAO{ /** * 真实主题类 */ private Connection connection = null; private PreparedStatement pstmt = null; public EmpDAOImpl(Connection connection) { // 获取数据库连接 this.connection = connection; } @Override public boolean doCreate(Emp emp) throws Exception { boolean flag = false; String sql = "INSERT INTO emp (empno, ename, job, hiredate, sal) VALUES (?,?,?,?,?)"; this.pstmt = this.connection.prepareStatement(sql); this.pstmt.setInt(1, emp.getEmpno()); this.pstmt.setString(2, emp.getEname()); this.pstmt.setString(3, emp.getJob()); this.pstmt.setDate(4, new Date(emp.getHiredate().getTime())); this.pstmt.setFloat(5, emp.getSal()); if(this.pstmt.executeUpdate() > 0) { // 更新记录行数大于1 flag = true; } this.pstmt.close(); return flag; } @Override public List findAll(String keyWord) throws Exception { List all = new ArrayList(); String sql = "SELECT empno, ename, job, hiredate, sal FROM emp WHERE ename LIKE ? OR job LIKE ?"; this.pstmt = this.connection.prepareStatement(sql); this.pstmt.setString(1, "%"+keyWord +"%"); this.pstmt.setString(2, "%"+keyWord +"%"); ResultSet rSet = this.pstmt.executeQuery(); Emp emp = null; while (rSet.next()) { emp = new Emp(); emp.setEmpno(rSet.getInt("empno")); emp.setEname(rSet.getString("ename")); emp.setHiredate(rSet.getDate("hiredate")); emp.setJob(rSet.getString("job")); emp.setSal(rSet.getFloat("sal")); all.add(emp); } this.pstmt.close(); // TODO Auto-generated method stub return all; } @Override public Emp findById(int empno) throws Exception { String sql = "SELECT empno, ename, job, hiredate, sal FROM emp WHERE empno=?"; this.pstmt = this.connection.prepareStatement(sql); this.pstmt.setInt(1, empno); ResultSet rSet = this.pstmt.executeQuery(); Emp emp = null; if(rSet.next()) { emp = new Emp(); emp.setEmpno(rSet.getInt("empno")); emp.setEname(rSet.getString("ename")); emp.setHiredate(rSet.getDate("hiredate")); emp.setJob(rSet.getString("job")); emp.setSal(rSet.getFloat("sal")); } this.pstmt.close(); // TODO Auto-generated method stub return emp; } } ~~~ #### 2.5,代理主题实现类(IEmpDAOProxy.java) ~~~java package com.hcfly.dao.proxy; import java.util.List; import com.hcfly.dao.IEmpDAO; import com.hcfly.dao.impl.EmpDAOImpl; import com.hcfly.dbc.DatabaseConnection; import com.hcfly.vo.Emp; public class EmpDAOProxy implements IEmpDAO{ /** * 代理主题实现类 */ private DatabaseConnection dbc = null; private IEmpDAO dao = null; public EmpDAOProxy() throws Exception{ this.dbc = new DatabaseConnection(); // 连接到数据库 this.dao = new EmpDAOImpl(this.dbc.getConnection()); } @Override public boolean doCreate(Emp emp) throws Exception { boolean flag = false; try { if(this.dao.findById(emp.getEmpno()) == null) { flag = this.dao.doCreate(emp); } } catch (Exception e) { throw e; }finally { this.dbc.close(); // 无论是否成功,将连接关闭 } // TODO Auto-generated method stub return flag; } @Override public List findAll(String keyWord) throws Exception { List all = null; try { all = this.dao.findAll(keyWord); } catch (Exception e) { throw e; } finally { this.dbc.close(); } return all; } @Override public Emp findById(int empno) throws Exception { Emp emp = null; try { emp = this.dao.findById(empno); } catch (Exception e) { throw e; }finally { this.dbc.close(); } return emp; } } ~~~ #### 2.6,DAO工厂类(DAOFactory.java) ~~~java package com.hcfly.factory; import com.hcfly.dao.IEmpDAO; import com.hcfly.dao.proxy.EmpDAOProxy; public class DAOFactory { /** * 工厂类 * @return * @throws Exception */ public static IEmpDAO getIEmpDAOInstance() throws Exception{ return new EmpDAOProxy(); } } ~~~ #### 2.7,测试类(TestDAOInsert.java) ~~~java package com.hcfly.dao.test; import java.util.Date; import com.hcfly.factory.DAOFactory; import com.hcfly.vo.Emp; public class TestDAOInsert { public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub Emp emp = null; for(int x = 0; x < 5; x++) { emp = new Emp(); emp.setEmpno(1000+x); emp.setEname("张憨憨" + x); emp.setJob("程序员 - " + x); emp.setHiredate(new Date()); emp.setSal(500 * x); // DAOFactory.getIEmpDAOInstance().doCreate(emp); } System.out.println(DAOFactory.getIEmpDAOInstance().findById(1001)); } } ~~~ #### 2.8,总结 > DAO 只是提供了一个数据的操作平台,不管在Application还是Web程序中,此DAO程序都不用做修改。 ### 3,DAO的web使用实例(开发工具为Ecplise,如果要运行,请先配置数据库) > 从注册页面提交信息给数据库,然后读出来,展示到表格中。 #### 3.1, 登录注册页面(增加数据表单)(emp_insert.jsp) ~~~jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 注册
雇员编号:
雇员姓名:
雇员职位:
雇员日期:
雇员工资:
跳转到列表页面 ~~~ #### 3.2, 处理数据页面(emp_insert_do.jsp) ~~~jsp <%@page import="com.hcfly.factory.DAOFactory"%> <%@page import="java.text.SimpleDateFormat"%> <%@page import="com.hcfly.vo.Emp"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 处理表单 <%request.setCharacterEncoding("utf-8"); response.setHeader("refresh", "3;URL=emp_list.jsp"); // 设置跳转时间为3秒 %> <% Emp emp = new Emp(); emp.setEmpno(Integer.parseInt(request.getParameter("empno"))); emp.setEname(request.getParameter("ename")); emp.setJob(request.getParameter("job")); emp.setHiredate(new SimpleDateFormat("yyyy-MM-dd").parse(request.getParameter("hiredate"))); emp.setSal(Float.parseFloat(request.getParameter("sal"))); try{ if(DAOFactory.getIEmpDAOInstance().doCreate(emp)){ out.print("

雇员信息添加成功!

"); }else{ out.print("

雇员信息添加失败!

"); } }catch(Exception e){ e.printStackTrace(); } %>

3秒后跳转到列表页

~~~ #### 3.3,列表页面(emp_list.jsp) ~~~jsp <%@page import="com.hcfly.vo.Emp"%> <%@page import="java.util.List"%> <%@page import="org.apache.jasper.tagplugins.jstl.core.Catch"%> <%@page import="java.util.Iterator"%> <%@page import="com.hcfly.factory.DAOFactory"%> <%@page import="java.util.Dictionary"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 列表 <% request.setCharacterEncoding("utf-8"); %> <% try{ String keyWord = request.getParameter("kw"); if(keyWord == null){ keyWord = ""; } List all = DAOFactory.getIEmpDAOInstance().findAll(keyWord); Iterator iter = all.iterator(); %>
<% while(iter.hasNext()){ Emp emp = iter.next(); %> <% } %>
雇员编号: 雇员姓名: 雇员工作: 雇员工资: 雇员日期:
<%= emp.getEmpno() %> <%= emp.getEname() %> <%= emp.getJob() %> <%= emp.getSal() %> <%= emp.getHiredate() %>
跳转到插入页面
<% }catch(Exception e){ e.printStackTrace(); } %> ~~~ #### 3.4,结果展示 ##### 3.4.1 数据库 ![](https://gitee.com/hcflyambation/daoproject/raw/master/IMGs/emp_database.png) ##### 3.4.2,注册界面 ![](https://gitee.com/hcflyambation/daoproject/raw/master/IMGs/emp_register.png) ##### 3.4.3,列表页面 ![](https://gitee.com/hcflyambation/daoproject/raw/master/IMGs/emp_search.png)