当前位置: 首页 > news >正文

JavaWeb-DAO设计模式

目录

DAO设计模式

1.认识DAO

2.DAO各部分的详解

3.DAO设计模式流程


DAO设计模式

1.认识DAO

DAO(Data Acess Object 数据库访问对象)的主要功能是操作数据库,所以DAO在标准开发架构中数据数据层,以下是标准开发的架构

  1. 客户层:目前使用B/S开发架构居多,客户可以通过浏览器访问
  2. 显示层:使用Vue框架、 React框架、 JSP/Servlet等进行页面展示
  3. 业务层:负责将DAO层的操作进行组合,形成一个完整的业务逻辑
  4. 数据层:提供原子性操作,比如增删查改

2.DAO各部分的详解

DAO的设计流程包括六个部分,如下:

1.DataBaseConnection

设计一个专门负责打开连接数据库和关闭数据库操作的类

命名规则: xxx.dbc.DataBaseConnection

2.VO

设计VO(值对象),其主要由属性,setter和getter组成与数据库中的字段进行对应。

命名规则:xxx.vo.ttt ; 其中ttt要和数据库中的表的名字一致

3.DAO

定义一系列原子性操作,比如增删查改,和实现业务的接口

命名规则:xxx.dao.I.xxx.DAO

4.Impl

设计DAO接口真正的实现类,完成具体的操作,但是不负责数据库的开关

命名规则:xxx.dao.imp.xxxDAOImpI

5.Proxy

Proxy代理类的实现,主要将以上四个部分组合起来,完成整个操作过程

命名规则:xxx.dao.Proxy.xxx.Proxy

6.Factory

Factory类主要用于获得DAO类的实例对象

命名规则:xxx.factory.DAOFactory


3.DAO设计模式流程

通过一个案例讲解DAO设计模式的流程

现在需要实现一个能够注册和查询工作者的案例(JDBC与DAO结合)

1.首先需要实现数据库的创建与表单的创建

/*======================= 删除数据库 =======================*/
DROP DATABASE IF EXISTS smile ;
/*======================= 创建数据库 =======================*/
CREATE DATABASE smile ;
/*======================= 使用数据库 =======================*/
USE smile ;
/*======================= 删除数据表 =======================*/
DROP TABLE IF EXISTS worker ;
/*======================= 创建数据表 =======================*/
CREATE TABLE worker(empno			INT(4)			PRIMARY KEY,ename			VARCHAR(10),job				VARCHAR(9),hiredate			DATE,sal				FLOAT(7,2)
) ;
/*======================= 插入测试数据 =======================*/
INSERT INTO worker(empno,ename,job,hiredate,sal) VALUES (7369,'董鸣楠','销售','2003-10-09',1500.90) ;
INSERT INTO worker(empno,ename,job,hiredate,sal) VALUES (8964,'李祺','分析员','2003-10-01',3000) ;
INSERT INTO worker(empno,ename,job,hiredate,sal) VALUES (7698,'张惠','销售','2005-03-12',800) ;
INSERT INTO worker(empno,ename,job,hiredate,sal) VALUES (7782,'杨军','分析员','2005-01-12',2500) ;
INSERT INTO worker(empno,ename,job,hiredate,sal) VALUES (7762,'刘明','销售','2005-03-09',1000) ;
INSERT INTO worker(empno,ename,job,hiredate,sal) VALUES (7839,'王月','经理','2006-09-01',2500) ;

 2.定义VO类

package com.JavaWebDAO.vo;
import java.util.Date ;
//定义工人类
public class Worker {
//    设置工人属性private int empno ;private String ename ;private String job ;private Date hiredate ;private float sal ;
//    配置setter函数public void setEmpno(int empno){this.empno = empno ;}public void setEname(String ename){this.ename = ename ;}public void setJob(String job){this.job = job ;}public void setHiredate(Date hiredate){this.hiredate = hiredate ;}public void setSal(float sal){this.sal = sal ;}
//    配置getter函数public int getEmpno(){return this.empno ;}public String getEname(){return this.ename ;}public String getJob(){return this.job ;}public Date getHiredate(){return this.hiredate ;}public float getSal(){return this.sal ;}
}

3.定义数据库连接类

package com.JavaWebDAO.db;
import java.sql.Connection ;
import java.sql.DriverManager ;
public class DatabaseConnection {
//    配置相关信息private static final String DBDRIVER = "com.mysql.jdbc.Driver" ;private static final String DBURL = "jdbc:mysql://localhost:3306/smile" ;private static final String DBUSER = "root" ;private static final String DBPASSWORD = "357703" ;private Connection conn ;
//    连接函数public DatabaseConnection() throws Exception {
//        加载类库Class.forName(DBDRIVER) ;
//        建立连接this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ;}
//    返回连接对象public Connection getConnection(){return this.conn ;}//    断开连接函数public void close() throws Exception {if(this.conn != null){try{this.conn.close() ;}catch(Exception e){throw e ;}}}
}

 4.新建DAO接口

package com.JavaWebDAO.dao;
import java.util.* ;
import com.JavaWebDAO.vo.Worker;public interface IWorkerDAO {
//    业务需求--注册员工public boolean doCreate(Worker work) throws Exception ;
//    业务需求--查询员工public List<Worker> findAll(String keyWord) throws Exception ;
//    业务需求--通过id查询员工public Worker findById(int empno) throws Exception ;
}

 5.定义完DAO接口后就需要写好具体的实现类,实现类分为两种。

一种是真实实现类,一种是代理操作类。

真实实现类

package com.JavaWebDAO.dao.impI;import com.JavaWebDAO.dao.IWorkerDAO;
import com.JavaWebDAO.vo.Worker;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;//真实实现类,实现IWorker中所有业务需求
public class WorkerDAOImpl implements IWorkerDAO {private Connection conn = null ;private PreparedStatement pstmt = null ;
//    通过构造函数获取连接对象public WorkerDAOImpl(Connection conn){this.conn = conn ;}//    实现注册员工功能public boolean doCreate(Worker work) throws Exception{boolean flag = false ;String sql = "INSERT INTO worker(empno,ename,job,hiredate,sal) VALUES (?,?,?,?,?)" ;this.pstmt = this.conn.prepareStatement(sql) ;this.pstmt.setInt(1,work.getEmpno()) ;this.pstmt.setString(2,work.getEname()) ;this.pstmt.setString(3,work.getJob()) ;this.pstmt.setDate(4,new java.sql.Date(work.getHiredate().getTime())) ;this.pstmt.setFloat(5,work.getSal()) ;if(this.pstmt.executeUpdate() > 0){flag = true ;}this.pstmt.close() ;return flag ;}
//    实现查询员工的功能public List<Worker> findAll(String keyWord) throws Exception{List<Worker> all = new ArrayList<Worker>() ;String sql = "SELECT empno,ename,job,hiredate,sal FROM worker WHERE ename LIKE ? OR job LIKE ?" ;this.pstmt = this.conn.prepareStatement(sql) ;this.pstmt.setString(1,"%"+keyWord+"%") ;this.pstmt.setString(2,"%"+keyWord+"%") ;ResultSet rs = this.pstmt.executeQuery() ;Worker work = null ;while(rs.next()){work = new Worker() ;work.setEmpno(rs.getInt(1)) ;work.setEname(((ResultSet) rs).getString(2)) ;work.setJob(rs.getString(3)) ;work.setHiredate(rs.getDate(4)) ;work.setSal(rs.getFloat(5)) ;all.add(work) ;}this.pstmt.close() ;return all ;}
//    实现通过id查询员工的功能public Worker findById(int empno) throws Exception{Worker emp = null ;String sql = "SELECT empno,ename,job,hiredate,sal FROM worker WHERE empno=?" ;this.pstmt = this.conn.prepareStatement(sql) ;this.pstmt.setInt(1,empno) ;ResultSet rs = this.pstmt.executeQuery() ;if(rs.next()){emp = new Worker() ;emp.setEmpno(rs.getInt(1)) ;emp.setEname(rs.getString(2)) ;emp.setJob(rs.getString(3)) ;emp.setHiredate(rs.getDate(4)) ;emp.setSal(rs.getFloat(5)) ;}this.pstmt.close() ;return emp ;}
}

代理操作类

package com.JavaWebDAO.dao.proxy;import com.JavaWebDAO.dao.IWorkerDAO;
import com.JavaWebDAO.dao.impI.WorkerDAOImpl;
import com.JavaWebDAO.db.DatabaseConnection;
import com.JavaWebDAO.vo.Worker;import java.util.List;//代理操作IWorkerDAo中的业务需求
public class WorkerDAOProxy implements IWorkerDAO {private DatabaseConnection db = null ;private IWorkerDAO dao = null ;//    代理建立连接数据库public WorkerDAOProxy() throws Exception {this.db = new DatabaseConnection() ;this.dao = new WorkerDAOImpl(this.db.getConnection()) ;}
//    代理实现注册功能public boolean doCreate(Worker work) throws Exception{boolean flag = false ;try{if(this.dao.findById(work.getEmpno()) == null){flag = this.dao.doCreate(work) ;}}catch(Exception e){throw e ;}finally{this.db.close() ;}return flag ;}
//    代理实现查询用户功能public List<Worker> findAll(String keyWord) throws Exception{List<Worker> all = null ;try{all = this.dao.findAll(keyWord) ;}catch(Exception e){throw e ;}finally{this.db.close() ;}return all ;}
//    代理通过id查询用户的功能public Worker findById(int empno) throws Exception {Worker emp = null;try {emp = this.dao.findById(empno);} catch (Exception e) {throw e;} finally {this.db.close();}return emp;}
}

代理类只是调用了真实类中的方法,但是代理类可以让代码开发的结构更加清晰


6.定义工厂类

package com.JavaWebDAO.factory;import com.JavaWebDAO.dao.IWorkerDAO;
import com.JavaWebDAO.dao.proxy.WorkerDAOProxy;public class DAOFactory {
//    通过工厂获取代理类的实例public static IWorkerDAO getIWorkerDAOInstance() throws Exception{return new WorkerDAOProxy() ;}
}

 设计完所有类和接口后,为了保证定义后功能可用,则需要做一个测试类,来测试所有功能是否能够正常使用

package com.lzl.dao.test ;
import com.lzl.factory.DAOFactory ;
import com.lzl.vo.* ;
public class TestdoCreate{public static void main(String args[]) throws Exception{Worker work = null ;work = new Worker() ;work.setEmpno(1000) ;work.setEname("SMILE") ;work.setJob("程序员 " ) ;work.setHiredate(new java.util.Date()) ;work.setSal(10000) ;DAOFactory.getIWorkerDAOInstance().doCreate(work) ;}}
package com.lzl.dao.test ;
import java.util.* ;
import com.lzl.factory.DAOFactory ;
import com.lzl.vo.* ;
public class TestfindAll{public static void main(String args[]) throws Exception{List<Worker> all = DAOFactory.getIWorkerDAOInstance().findAll("") ;Iterator<Worker> iter = all.iterator() ;while(iter.hasNext()){Worker work = iter.next() ;System.out.println(work.getEmpno() + "、" + work.getEname() + " 、 " + work.getJob()+ "、"+work.getHiredate() + " 、 "+work.getSal()) ;}}
}


 整体项目结构

这样DAO层就开发完毕了


相关文章:

JavaWeb-DAO设计模式

目录 DAO设计模式 1.认识DAO 2.DAO各部分的详解 3.DAO设计模式流程 DAO设计模式 1.认识DAO DAO(Data Acess Object 数据库访问对象)的主要功能是操作数据库&#xff0c;所以DAO在标准开发架构中数据数据层&#xff0c;以下是标准开发的架构 客户层&#xff1a;目前使用B/…...

重温git和GitHub

1.初始化本地库:让git获取到这个目录的管理权 git init 查看文件夹的文件命令&#xff1a;ll 查看文件夹的隐藏的文件命令:ll -a 查看状态的命令&#xff1a;git status cat文件名&#xff1a;查看文件内容 工作区&#xff1a;当git status时&#xff0c;名字为红色则在工作区&…...

C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】

wpf iconfont 外部图标引入&#xff0c;无法正常显示问题。 1. 检查资源路径和引入格式是否正确2. 检查资源是否包含在程序集中 1. 检查资源路径和引入格式是否正确 正确的格式&#xff0c;注意字体文件 “xxxx.ttf” 应写为 “#xxxx” <TextBlock Text"&#xe7ae;…...

Hi-TRS:骨架点视频序列的层级式建模及层级式自监督学习

论文题目&#xff1a;Hierarchically Self-Supervised Transformer for Human Skeleton Representation Learning 论文下载地址&#xff1a;https://www.ecva.net/papers/eccv_2022/papers_ECCV/papers/136860181.pdf 代码地址&#xff1a;https://github.com/yuxiaochen1103…...

FPGA 之 xilinx DDS IP相位控制字及频率控制字浅析

浅析相位环在Xilinx DDS中的理解 本文仅为个人理解之用; 相关仿真结果如下:...

[鹏城杯 2022]简单包含

直接用php&#xff1a;// 有wtf 加脏数据绕过...

Required request parameter ‘XXX‘ for method parameter type XXX is not present问题

今日工作中遇到很奇葩的问题&#xff0c;用翻译软件翻译结果为 方法参数类型XXX所需的请求参数XXX不存在 也就是说前端没有给后端传值 后端的接收方式为 public Result demo(RequestParam("id") String id){}...

centOS 快速安装和配置 NVIDIA docker Container Toolkit

要在 CentOS 上正确安装和配置 NVIDIA Container Toolkit&#xff0c;您可以按照以下步骤进行操作&#xff0c;如果1和2都已经完成&#xff0c;可以直接进行第3步NVIDIA Container Toolkit安装配置。 1. 安装 NVIDIA GPU 驱动程序&#xff1a; 您可以从 NVIDIA 官方网站下载适…...

编程练习(2)

一.选择题 第一题&#xff1a; 考察转义字符和strlen函数求解字符串长度 进一步在VS中可以智能看出哪些字符是转义字符&#xff1a; 因此本体答案选择B 第二题&#xff1a; 本体较为简单&#xff0c;宏定义了三个数N,M,NUM,N值为2,M值为3&#xff0c;因此NUM值为8&#xff0c;…...

利用Figlet工具创建酷炫Linux Centos8服务器-登录欢迎界面-SHELL自动化编译安装代码

因为我们需要生成需要的特定字符,所以需要在当前服务器中安装Figlet,默认没有安装包的,其实如果我们也只要在一台环境中安装,然后需要什么字符只要复制到需要的服务器中,并不需要所有都安装。同样的,我们也可以利用此生成的字符用到脚本运行的开始起头部分,用ECHO分行标…...

Git Cherry-pick使用

概述 无论项目大小&#xff0c;当你和一群程序员一起工作时&#xff0c;处理多个 Git 分支之间的变更都会变得很困难。有时&#xff0c;与其把整个 Git 分支合并到另一个分支&#xff0c;不如选择并移动几个特定的提交。这个过程被称为 "挑拣", 即 Cherry-pick。 本…...

红帽8.5 ansible 安装和部署 |(简单版)

什么是ansible Ansible是一款基于OpenSSH开源的自动化运维工具&#xff0c;可以用它来配置系统、部署软件和编排更高级的 IT 任务&#xff0c;并且使用具有极高的安全性&#xff0c;ansible是当前市面上主流的自动化运维工具之一 为什么使用ansible 比较直观的说&#xff0c;…...

Visual Studio 2019 c++ 自定义注释 ----doxygen

可加入C 也可自定义。 <?xml version"1.0" encoding"utf-8"?> <CodeSnippets xmlns"http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"><CodeSnippet Format"1.0.0"><Header><Title>注释…...

面试题. 零矩阵

编写一种算法&#xff0c;若M N矩阵中某个元素为0&#xff0c;则将其所在的行与列清零。 示例 1&#xff1a; 输入&#xff1a; [[1,1,1],[1,0,1],[1,1,1] ] 输出&#xff1a; [[1,0,1],[0,0,0],[1,0,1] ] 示例 2&#xff1a; 输入&#xff1a; [[0,1,2,0],[3,4,5,2],[1,3…...

易语言下载器

静态网站整站下载器 https://bbs.125.la/forum.php?modviewthread&tid14791313&highlight%E4%B8%8B%E8%BD%BD%E5%99%A8 易语言 之音乐下载器 https://blog.51cto.com/u_15309652/3153642 &#xff08;File Download Assistant&#xff09;下载链接&#xff1a;https…...

原生js获取今天、昨天、近7天的时间(年月日时分秒)

有的时候我们需要将今天,昨天,近7天的时间(年月日时分秒)作为参数传递给后端,如下图: 那怎么生成这些时间呢?如下代码里,在methods里的toDay方法、yesterDay方法、weekDay方法分别用于生成今天、昨天和近7天的时间: <template><div class="box"&…...

最强自动化测试框架Playwright(29)-文件选择对象

FileChooser对象通过page.on("filechoose")事件监听。 如下代码实现点击百度搜图按钮&#xff0c;上传文件进行搜索。 from playwright.sync_api import Playwright, sync_playwright, expectdef run(playwright: Playwright) -> None:browser playwright.chro…...

【烂尾】K8S部署

0x01 初见K8S 在地下城的迷宫深处&#xff0c;有一个神奇的存在&#xff0c;它就是Kubernetes&#xff01;宛如一个勇敢的冒险者&#xff0c;它穿越着这个复杂的迷宫&#xff0c;带领着容器们战胜各种惊险的挑战。 Kubernetes就像是一位无所畏惧的剑士&#xff0c;手握着强大…...

电机故障诊断(python程序,模型为MSCNN结合LSTM结合注意力机制模型,有注释)

代码运行环境要求&#xff1a;TensorFlow版本>2.4.0&#xff0c;python版本>3.6.0 1.电机常见的故障类型有以下几种&#xff1a; 轴承故障&#xff1a;轴承是电机运转时最容易受损的部件之一。常见故障包括磨损、疲劳、过热和润滑不良&#xff0c;这些问题可能导致噪音增…...

二叉树(ACM版)

【数据结构1-2】二叉树 - 题单 - 洛谷 【数据结构】day2-树_J娇娇_的博客-CSDN博客 上学时的作业 P1827 [USACO3.4] 美国血统 American Heritage 二叉树特点写法&#xff08;非二叉树&#xff09; 截取字符串写法 #include<string> #include<cstring> #include…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物&#xff0c;因为每个访问一个线程局部变量的线程&#xff08;通过其 get 或 set 方法&#xff09;都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段&#xff0c;这些类希望将…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

python基础语法Ⅰ

python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器&#xff0c;来进行一些算术…...