经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
DAO(数据访问对象)设计模式——JSP的应用(使用PostgreSQL数据库)
来源:cnblogs  作者:没尾巴的刺刺鱼  时间:2021/3/29 9:11:08  对本文有异议

DAO(数据访问对象)

程序的标准架构为:

客户层(Client)-> 显示层(jsp/servlet)-> 业务层(BO) -> 数据层(BAO) -> 资源层(DataBase)

项目Gitee地址:https://gitee.com/hcflyambation/daoproject

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的实例开发

项目结构:

特别要注意的是:当启动web程序时,请将依赖的jar(postgresql-42.2.19.jar放入WEB-INF/lib/下,不然会检测不到)

JAR必须直接放在web项目的/ WEB-INF / lib文件夹中,而不用项目属性中的Build Path.该文件夹是webapp运行时类路径的标准部分

2.1,数据库脚本建立(使用PostgreSQL)

数据库名为:jsp

  1. create table emp (
  2. empno int primary key,
  3. ename varchar(10),
  4. job varchar(9),
  5. hiredate date,
  6. sal decimal
  7. );

2.2,编写与数据库对应的OV类(Emp.java)

  1. package com.hcfly.vo;
  2. import java.math.BigDecimal;
  3. import java.util.Date;
  4. public class Emp {
  5. private int empno;
  6. private String ename;
  7. private String job;
  8. private Date hiredate;
  9. private float sal;
  10. public int getEmpno() {
  11. return empno;
  12. }
  13. public void setEmpno(int empno) {
  14. this.empno = empno;
  15. }
  16. public String getEname() {
  17. return ename;
  18. }
  19. public void setEname(String ename) {
  20. this.ename = ename;
  21. }
  22. public String getJob() {
  23. return job;
  24. }
  25. public void setJob(String job) {
  26. this.job = job;
  27. }
  28. public Date getHiredate() {
  29. return hiredate;
  30. }
  31. public void setHiredate(Date hiredate) {
  32. this.hiredate = hiredate;
  33. }
  34. public float getSal() {
  35. return sal;
  36. }
  37. public void setSal(float sal) {
  38. this.sal = sal;
  39. }
  40. }

2.3, 编写数据库连接类(DatabaseConnection.java)

这个地方可以将DatabaseConnection抽象为一个接口,并且用不同的数据库访问类去实现它,来达到通用的水平。

  1. package com.hcfly.dbc;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. public class DatabaseConnection {
  5. // 数据库连接类
  6. private static final String DBDRIVER = "org.postgresql.Driver";
  7. private static final String DBURL = "jdbc:postgresql://localhost/jsp";
  8. private static final String DBUSER = "postgres";
  9. private static final String DBPASSWORD = "miaomiao";
  10. private Connection connection = null;
  11. public DatabaseConnection() throws Exception{
  12. try {
  13. Class.forName(DBDRIVER);
  14. this.connection = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);
  15. // System.out.println("连接成功");
  16. } catch (Exception e) {
  17. throw e;
  18. // TODO: handle exception
  19. }
  20. }
  21. public Connection getConnection() {
  22. return this.connection;
  23. }
  24. public void close() throws Exception {
  25. if(this.connection != null) {
  26. try {
  27. this.connection.close();
  28. } catch (Exception e) {
  29. throw e;
  30. // TODO: handle exception
  31. }
  32. }
  33. }
  34. }

2.4,定义DAO操作标准(IEmpDAO.java)

  1. package com.hcfly.dao;
  2. import java.util.List;
  3. import com.hcfly.vo.Emp;
  4. public interface IEmpDAO { // 定义DAO操作
  5. /**
  6. * 定义DAO的标准操作
  7. *
  8. */
  9. public boolean doCreate(Emp emp) throws Exception;
  10. /**
  11. * @param emp要增加的数据对象
  12. */
  13. public List<Emp> findAll(String keyWord) throws Exception;
  14. /**
  15. * 根据查询关键字进行搜索
  16. */
  17. public Emp findById(int empno) throws Exception;
  18. }

2.5,真实主题实现类(EmpDAOImpl.java)

  1. package com.hcfly.dao.impl;
  2. import java.sql.Connection;
  3. import java.sql.Date;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import com.hcfly.dao.IEmpDAO;
  9. import com.hcfly.vo.Emp;
  10. public class EmpDAOImpl implements IEmpDAO{
  11. /**
  12. * 真实主题类
  13. */
  14. private Connection connection = null;
  15. private PreparedStatement pstmt = null;
  16. public EmpDAOImpl(Connection connection) {
  17. // 获取数据库连接
  18. this.connection = connection;
  19. }
  20. @Override
  21. public boolean doCreate(Emp emp) throws Exception {
  22. boolean flag = false;
  23. String sql = "INSERT INTO emp (empno, ename, job, hiredate, sal) VALUES (?,?,?,?,?)";
  24. this.pstmt = this.connection.prepareStatement(sql);
  25. this.pstmt.setInt(1, emp.getEmpno());
  26. this.pstmt.setString(2, emp.getEname());
  27. this.pstmt.setString(3, emp.getJob());
  28. this.pstmt.setDate(4, new Date(emp.getHiredate().getTime()));
  29. this.pstmt.setFloat(5, emp.getSal());
  30. if(this.pstmt.executeUpdate() > 0) { // 更新记录行数大于1
  31. flag = true;
  32. }
  33. this.pstmt.close();
  34. return flag;
  35. }
  36. @Override
  37. public List<Emp> findAll(String keyWord) throws Exception {
  38. List<Emp> all = new ArrayList<Emp>();
  39. String sql = "SELECT empno, ename, job, hiredate, sal FROM emp WHERE ename LIKE ? OR job LIKE ?";
  40. this.pstmt = this.connection.prepareStatement(sql);
  41. this.pstmt.setString(1, "%"+keyWord +"%");
  42. this.pstmt.setString(2, "%"+keyWord +"%");
  43. ResultSet rSet = this.pstmt.executeQuery();
  44. Emp emp = null;
  45. while (rSet.next()) {
  46. emp = new Emp();
  47. emp.setEmpno(rSet.getInt("empno"));
  48. emp.setEname(rSet.getString("ename"));
  49. emp.setHiredate(rSet.getDate("hiredate"));
  50. emp.setJob(rSet.getString("job"));
  51. emp.setSal(rSet.getFloat("sal"));
  52. all.add(emp);
  53. }
  54. this.pstmt.close();
  55. // TODO Auto-generated method stub
  56. return all;
  57. }
  58. @Override
  59. public Emp findById(int empno) throws Exception {
  60. String sql = "SELECT empno, ename, job, hiredate, sal FROM emp WHERE empno=?";
  61. this.pstmt = this.connection.prepareStatement(sql);
  62. this.pstmt.setInt(1, empno);
  63. ResultSet rSet = this.pstmt.executeQuery();
  64. Emp emp = null;
  65. if(rSet.next()) {
  66. emp = new Emp();
  67. emp.setEmpno(rSet.getInt("empno"));
  68. emp.setEname(rSet.getString("ename"));
  69. emp.setHiredate(rSet.getDate("hiredate"));
  70. emp.setJob(rSet.getString("job"));
  71. emp.setSal(rSet.getFloat("sal"));
  72. }
  73. this.pstmt.close();
  74. // TODO Auto-generated method stub
  75. return emp;
  76. }
  77. }

2.5,代理主题实现类(IEmpDAOProxy.java)

  1. package com.hcfly.dao.proxy;
  2. import java.util.List;
  3. import com.hcfly.dao.IEmpDAO;
  4. import com.hcfly.dao.impl.EmpDAOImpl;
  5. import com.hcfly.dbc.DatabaseConnection;
  6. import com.hcfly.vo.Emp;
  7. public class EmpDAOProxy implements IEmpDAO{
  8. /**
  9. * 代理主题实现类
  10. */
  11. private DatabaseConnection dbc = null;
  12. private IEmpDAO dao = null;
  13. public EmpDAOProxy() throws Exception{
  14. this.dbc = new DatabaseConnection(); // 连接到数据库
  15. this.dao = new EmpDAOImpl(this.dbc.getConnection());
  16. }
  17. @Override
  18. public boolean doCreate(Emp emp) throws Exception {
  19. boolean flag = false;
  20. try {
  21. if(this.dao.findById(emp.getEmpno()) == null) {
  22. flag = this.dao.doCreate(emp);
  23. }
  24. } catch (Exception e) {
  25. throw e;
  26. }finally {
  27. this.dbc.close(); // 无论是否成功,将连接关闭
  28. }
  29. // TODO Auto-generated method stub
  30. return flag;
  31. }
  32. @Override
  33. public List<Emp> findAll(String keyWord) throws Exception {
  34. List<Emp> all = null;
  35. try {
  36. all = this.dao.findAll(keyWord);
  37. } catch (Exception e) {
  38. throw e;
  39. } finally {
  40. this.dbc.close();
  41. }
  42. return all;
  43. }
  44. @Override
  45. public Emp findById(int empno) throws Exception {
  46. Emp emp = null;
  47. try {
  48. emp = this.dao.findById(empno);
  49. } catch (Exception e) {
  50. throw e;
  51. }finally {
  52. this.dbc.close();
  53. }
  54. return emp;
  55. }
  56. }

2.6,DAO工厂类(DAOFactory.java)

  1. package com.hcfly.factory;
  2. import com.hcfly.dao.IEmpDAO;
  3. import com.hcfly.dao.proxy.EmpDAOProxy;
  4. public class DAOFactory {
  5. /**
  6. * 工厂类
  7. * @return
  8. * @throws Exception
  9. */
  10. public static IEmpDAO getIEmpDAOInstance() throws Exception{
  11. return new EmpDAOProxy();
  12. }
  13. }

2.7,测试类(TestDAOInsert.java)

  1. package com.hcfly.dao.test;
  2. import java.util.Date;
  3. import com.hcfly.factory.DAOFactory;
  4. import com.hcfly.vo.Emp;
  5. public class TestDAOInsert {
  6. public static void main(String[] args) throws Exception{
  7. // TODO Auto-generated method stub
  8. Emp emp = null;
  9. for(int x = 0; x < 5; x++) {
  10. emp = new Emp();
  11. emp.setEmpno(1000+x);
  12. emp.setEname("张憨憨" + x);
  13. emp.setJob("程序员 - " + x);
  14. emp.setHiredate(new Date());
  15. emp.setSal(500 * x);
  16. // DAOFactory.getIEmpDAOInstance().doCreate(emp);
  17. }
  18. System.out.println(DAOFactory.getIEmpDAOInstance().findById(1001));
  19. }
  20. }

2.8,总结

DAO 只是提供了一个数据的操作平台,不管在Application还是Web程序中,此DAO程序都不用做修改。

3,DAO的web使用实例(开发工具为Ecplise,如果要运行,请先配置数据库)

从注册页面提交信息给数据库,然后读出来,展示到表格中。

3.1, 登录注册页面(增加数据表单)(emp_insert.jsp)

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html lang="en">
  5. <head>
  6. <meta charset="UTF-8">
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  8. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  9. <title>注册</title>
  10. </head>
  11. <body>
  12. <form action="emp_insert_do.jsp" method="post" >
  13. 雇员编号:<input type="text" name="empno" id=""><br/>
  14. 雇员姓名:<input type="text" name="ename" id=""><br/>
  15. 雇员职位:<input type="text" name="job" id=""><br/>
  16. 雇员日期:<input type="text" name="hiredate" id=""><br/>
  17. 雇员工资:<input type="text" name="sal" id=""><br/>
  18. <input type="submit" value="注册">
  19. <input type="reset" value="重置">
  20. </form>
  21. <a href="emp_list.jsp">跳转到列表页面</a>
  22. </body>
  23. </html>

3.2, 处理数据页面(emp_insert_do.jsp)

  1. <%@page import="com.hcfly.factory.DAOFactory"%>
  2. <%@page import="java.text.SimpleDateFormat"%>
  3. <%@page import="com.hcfly.vo.Emp"%>
  4. <%@ page language="java" contentType="text/html; charset=UTF-8"
  5. pageEncoding="UTF-8"%>
  6. <!DOCTYPE html>
  7. <html>
  8. <head>
  9. <meta charset="UTF-8">
  10. <title>处理表单</title>
  11. <%request.setCharacterEncoding("utf-8");
  12. response.setHeader("refresh", "3;URL=emp_list.jsp"); // 设置跳转时间为3秒
  13. %>
  14. </head>
  15. <body>
  16. <%
  17. Emp emp = new Emp();
  18. emp.setEmpno(Integer.parseInt(request.getParameter("empno")));
  19. emp.setEname(request.getParameter("ename"));
  20. emp.setJob(request.getParameter("job"));
  21. emp.setHiredate(new SimpleDateFormat("yyyy-MM-dd").parse(request.getParameter("hiredate")));
  22. emp.setSal(Float.parseFloat(request.getParameter("sal")));
  23. try{
  24. if(DAOFactory.getIEmpDAOInstance().doCreate(emp)){
  25. out.print("<h3>雇员信息添加成功!</h3>");
  26. }else{
  27. out.print("<h3>雇员信息添加失败!</h3>");
  28. }
  29. }catch(Exception e){
  30. e.printStackTrace();
  31. }
  32. %>
  33. <h3>3秒后跳转到列表页</h3>
  34. </body>
  35. </html>

3.3,列表页面(emp_list.jsp)

  1. <%@page import="com.hcfly.vo.Emp"%>
  2. <%@page import="java.util.List"%>
  3. <%@page import="org.apache.jasper.tagplugins.jstl.core.Catch"%>
  4. <%@page import="java.util.Iterator"%>
  5. <%@page import="com.hcfly.factory.DAOFactory"%>
  6. <%@page import="java.util.Dictionary"%>
  7. <%@ page language="java" contentType="text/html; charset=UTF-8"
  8. pageEncoding="UTF-8"%>
  9. <!DOCTYPE html>
  10. <html>
  11. <head>
  12. <meta charset="UTF-8">
  13. <title>列表</title>
  14. <% request.setCharacterEncoding("utf-8"); %>
  15. </head>
  16. <body>
  17. <%
  18. try{
  19. String keyWord = request.getParameter("kw");
  20. if(keyWord == null){
  21. keyWord = "";
  22. }
  23. List<Emp> all = DAOFactory.getIEmpDAOInstance().findAll(keyWord);
  24. Iterator<Emp> iter = all.iterator();
  25. %>
  26. <center>
  27. <form action="" method="post">
  28. <input type="text" name="kw">
  29. <input type="submit" value="查询">
  30. </form>
  31. <table border="1" width="80%">
  32. <tr>
  33. <td>雇员编号:</td>
  34. <td>雇员姓名:</td>
  35. <td>雇员工作:</td>
  36. <td>雇员工资:</td>
  37. <td>雇员日期:</td>
  38. </tr>
  39. <% while(iter.hasNext()){
  40. Emp emp = iter.next();
  41. %>
  42. <tr>
  43. <td><%= emp.getEmpno() %></td>
  44. <td><%= emp.getEname() %></td>
  45. <td><%= emp.getJob() %></td>
  46. <td><%= emp.getSal() %></td>
  47. <td><%= emp.getHiredate() %></td>
  48. </tr>
  49. <%
  50. }
  51. %>
  52. </table>
  53. <a href="emp_insert.jsp">跳转到插入页面</a>
  54. </center>
  55. <%
  56. }catch(Exception e){
  57. e.printStackTrace();
  58. }
  59. %>
  60. </body>
  61. </html>

3.4,结果展示

3.4.1 数据库

3.4.2,注册界面

3.4.3,列表页面

原文链接:http://www.cnblogs.com/jlxa162hhf/p/14578675.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号