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层就开发完毕了


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/40331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue中style scoped属性的作用

一、为什么要给style 节点加 scoped 属性&#xff08;vue&#xff09; 1、作用&#xff1a;当style标签里面有scoped属性时&#xff0c;它的css只作用于当前组建的元素。在单页面项目中可以使组件之间互不污染&#xff0c;实现模块化&#xff08;实现组件的私有化&#xff0c;不…

Ubuntu安装mysql5.7

目录 1. 更新系统软件包2. 安装MySQL 5.73. 启动MySQL 服务4. 设置MySQL root 密码5. 验证MySQL 安装6. 启用远程访问7. 创建新用户8. 为新用户授予权限9. mysql命令 以Ubuntu 18.04系统为例&#xff0c;安装MySQL 5.7。操作步骤如下&#xff1a; 1. 更新系统软件包 sudo apt…

Openai中的tokens怎么估计

大规模语言模型&#xff08;LLM&#xff09;的出现给自然语言处理领域带来了变革的可能性&#xff0c;Openai开放了chatgpt的API&#xff0c;方便了开发人员使用LLM的推理能力&#xff0c;注册时赠送5美元的使用额度&#xff0c;有效期3个月。 如果想便捷的使用chatgpt的API&a…

介绍 TensorFlow 的基本概念和使用场景

TensorFlow 是一种开源的机器学习框架&#xff0c;由 Google 开发。它是用来构建和训练机器学习模型的强大工具&#xff0c;支持很多种不同类型的机器学习算法&#xff0c;并使用数据流图来表示计算过程。 TensorFlow 的核心是张量 (Tensor) 和计算图 (Graph)。 张量 (Tensor)…

OpenCV之薄板样条插值(ThinPlateSpline)

官方文档&#xff1a;OpenCV: cv::ThinPlateSplineShapeTransformer Class Reference 使用方法&#xff1a; 头文件&#xff1a;#include <opencv2/shape/shape_transformer.hpp> &#xff08;1&#xff09;点匹配 一般根据有多少个样本&#xff08;或者点&#xff09;…

6.2 Spring Boot整合MyBatis

1、基于Spring BootMyBatis的学生信息系统的设计与实现案例 基于Spring BootMyBatis实现学生信息的新增、修改、删除、查询功能&#xff0c;并实现MySQL数据库的操作。 MySQL数据库创建学生表&#xff08;t_student&#xff09;&#xff0c;有主键、姓名、年龄、性别、出生日…

npm如何设置淘宝的镜像源模式

1. 查看当前npm的下载源 npm config get registry2. 全局配置npm使用淘宝镜像作为默认下载源 npm config set registry https://registry.npm.taobao.org --global3. 安装依赖包 npm install <package-name> 添加到devDependencies字段中&#xff1a; npm install &l…

Jmeter 二次开发 函数助手 AES加解密

Jmeter 二次开发 函数助手 AES加解密 1. 环境准备2. 关键技术说明2.1 离线导包2.2 示例代码 3. 代码包4. 结果演示 1. 环境准备 IDE &#xff1a;IntelliJ IDEA 2021.1.1 x64JAVA环境 &#xff1a;jdk1.8.0_251离线导包&#xff1a;导入Jmeter安装目录下lib/ext下的ApacheJmet…

Java课题笔记~ SpringMVC的四种跳转方式

默认的跳转是请求转发&#xff0c;直接跳转到jsp页面展示 还可以使用框架提供的关键字redirect&#xff0c;进行一个重定向操作&#xff0c;包括重定向页面和重定向action&#xff0c;使用框架提供的关键字forward&#xff0c;进行服务器内部转发操作&#xff0c;包括转发页面…

Martin_DHCP_V3.0 (DHCP自动化泛洪攻击GUI)

Github>https://github.com/MartinxMax/Martin_DHCP_V3.0 首页 Martin_DHCP_V3.0 自动化DHCP洪泛攻击 Martin_DHCP_V3.0 使用方法 安装三方库 #python3 1.RunMe_Install_Packet.py 攻击路由器 #python3 Martin_DHCP_Attack.py 填写网卡 填写攻击次数 开始运行

《Go 语言第一课》课程学习笔记(二)

初窥门径&#xff1a;一个 Go 程序的结构是怎样的&#xff1f; 创建“hello&#xff0c;world”示例程序 在 Go 语言中编写一个可以打印出“hello&#xff0c;world”的示例程序&#xff0c;我们只需要简单两步&#xff0c;一是创建文件夹&#xff0c;二是开始编写和运行。通…

高光谱 | 矿物识别和分类标签数据制作、农作物病虫害数据分类、土壤有机质含量回归与制图、木材含水量评估和制图

本课程提供一套基于Python编程工具的高光谱数据处理方法和应用案例。 本课程涵盖高光谱遥感的基础、方法和实践。基础篇以学员为中心&#xff0c;用通俗易懂的语言解释高光谱的基本概念和理论&#xff0c;旨在帮助学员深入理解科学原理。方法篇结合Python编程工具&#xff0c;…

阿里云服务器部署RabbitMQ流程

阿里云百科分享使用阿里云服务器部署RabbitMQ流程&#xff0c;RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff0c;用于在分布式系统中存储转发消息&#xff0c;有良好的易用性、扩展性和高可用性。本文介绍如何通过ECS实例部署Rabbi…

CentOS系统环境搭建(四)——Centos7安装Java

centos系统环境搭建专栏&#x1f517;点击跳转 Centos7安装Java 查看云端yum库中目前支持安装的jdk软件包 yum search java|grep jdk选择JDK版本&#xff0c;并安装 yum install -y java-1.8.0-openjdk检查是否安装成功 java -version查看JDK的安装目录 find / -name jav…

【Java面试】redis雪崩、穿透和击穿详解

一 Redis雪崩、穿透和击穿 1. Redis雪崩&#xff1a; Redis雪崩是指在某一时刻&#xff0c;缓存中大量的缓存数据同时失效或过期&#xff0c;导致大量的请求直接打到后端数据库&#xff0c;导致数据库负载剧增&#xff0c;引发性能问题甚至崩溃。这通常是因为缓存数据的过期时…

机器学习笔记:李宏毅 stable diffusion

1 基本框架 ①&#xff1a;文字变成向量 ②&#xff1a;喂入噪声文字encoder&#xff0c;产生中间产物 ③&#xff1a;decoder 还原图片 2 text encoder 这张图越往右下表示效果越好&#xff0c;可以看到text encoder尺寸越大&#xff0c;对后续生成图片的增益越多 3 评价图…

公园游玩必备!新零售模式如何吸引更多游客

随着科技的不断演进&#xff0c;新零售模式正以前所未有的速度改变着我们的购物方式和消费体验。其中&#xff0c;自动售货机作为新零售模式的重要组成部分&#xff0c;以其智能化、便捷性和多样性的特点&#xff0c;正逐渐成为城市中熠熠生辉的一道风景线。 从24小时不间断的运…

LeetCode Top100 Liked 题单(序号34~51)

​34. Find First and Last Position of Element in Sorted Array ​ 题意&#xff1a;找到非递减序列中目标的开头和结尾 我的思路 用二分法把每一个数字都找到&#xff0c;最后返回首尾两个数 代码 Runtime12 ms Beats 33.23% Memory14 MB Beats 5.16% class Solution {…

前端练手小项目--自定义时间(html+css+js)

自定义时间 写文章的因 关于要写这篇文章的原因 是记录在工作上遇到的困难需求&#xff0c;是希望能给大家提供一些解决问题的思路 接下来我描述这个需求的多样性&#xff0c;难点在哪。 勾选勾选框开始时间与结束时间默认显示昨天与今天。取消勾选框开始时间与结束时间清空。…

如何查看线程在哪个cpu核上

1、ps -eLF查看PSR值 2、 taskset -pc $pid&#xff08;进程/线程&#xff09; 参考链接&#xff1a;https://blog.csdn.net/test1280/article/details/87993669