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,一经查实,立即删除!

相关文章

Openai中的tokens怎么估计

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

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…

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 填写网卡 填写攻击次数 开始运行

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

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

阿里云服务器部署RabbitMQ流程

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

机器学习笔记:李宏毅 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;难点在哪。 勾选勾选框开始时间与结束时间默认显示昨天与今天。取消勾选框开始时间与结束时间清空。…

Nginx运行Vue项目:基本运行

需求 在Nginx服务器中&#xff0c;运行Vue项目。 说明 Vue项目打包生成的生产文件&#xff0c;是无法直接在浏览器打开的。需要放到Nginx服务器中&#xff0c;才能够访问。 本文章只介绍最基本的情况&#xff1a;Nginx中运行一个Vue项目。 实际生产环境&#xff0c;一个Ng…

解密 AI 客服;在不同硬件设备上运行大型语言模型的可能性

&#x1f989; AI新闻 &#x1f680; 微软必应首席执行官称必应聊天优于OpenAI的GPT-4&#xff0c;但成本更高 摘要&#xff1a;微软必应的首席执行官米哈伊尔・帕拉欣表示&#xff0c;必应聊天表现优于OpenAI的GPT-4&#xff0c;但使用了更高成本的检索增强推理技术。必应聊…

中科亿海微ROM使用

标题 ROM&#xff08;Read-Only Memory&#xff0c;只读存储器&#xff09;是一种在FPGA&#xff08;Field-Programmable Gate Array&#xff0c;现场可编程门阵列&#xff09;中常用的存储器类型。与RAM&#xff08;Random Access Memory&#xff0c;机存取存储器&#xff09;…

Nginx安全加固,版本隐藏及HTTP请求头修改方法

1 隐藏nginx版本号 1.1 引言 nginx作为目前较为流行的http server软件&#xff0c;其相关的安全漏洞也非常多&#xff0c;攻击者可以根据我们的nginx版本来了解到相关的漏洞从而针对性的进行攻击。 通过新版本的nginx都会修复一些老版本的已知漏洞&#xff0c;但有时候我们生…

提示丢失vcomp140.dll怎么办?如何快速修复vcomp140.dll丢失问题

最近我遇到了一个程序启动失败的问题&#xff0c;错误提示显示缺少了vcomp140.dll文件。经过一番研究和尝试&#xff0c;我终于成功修复了这个问题。在这里&#xff0c;我将分享一下我的修复方法。 目录 vcomp140.dll是什么&#xff1f; 如何快速修复呢&#xff1f; vcomp140…

sCrypt编程马拉松于8月13日在复旦大学成功举办

继6月在英国Exeter大学成功举办了为期一周的区块链编程马拉松后&#xff0c;美国sCrypt公司创始人兼CEO刘晓晖博士带领核心团队成员王一强、郑宏锋、周全&#xff0c;于8月13日在复旦大学再次成功举办了一场全新的sCrypt编程马拉松。 本次活动由上海可一澈科技有限公司与复旦大…

C++笔记之花括号和圆括号初始化区别,列表初始化和初始化列表区别

C笔记之花括号和圆括号初始化区别&#xff0c;列表初始化和初始化列表区别 code review! 文章目录 C笔记之花括号和圆括号初始化区别&#xff0c;列表初始化和初始化列表区别1.花括号{}进行初始化和圆括号()进行初始化2.列表初始化&#xff08;list initialization&#xff0…

Vitis高层次综合学习——FPGA

高层次综合 什么是高层次综合&#xff1f;就是使用高级语言&#xff08;如C/C&#xff09;来编写FPGA算法程序。 在高层次综合上并不需要制定微架构决策&#xff0c;如创建状态机、数据路径、寄存器流水线等。这些细节可以留给 HLS 工具&#xff0c;通过提供输入约束&#xff…

专访阿里云席明贤,视频云如何运用大模型与小模型来破茧升级2.0

不久前&#xff0c;LiveVideoStack与阿里云视频云负责人席明贤&#xff08;花名右贤&#xff09;展开一场深度的对话&#xff0c;一个是圈内专业的社区媒体&#xff0c;一个是20年的IT老兵&#xff0c;双方有交集、有碰撞、有火花。 面对风云变幻的内外环境&#xff0c;阿里云…

未来数字银行的样子

对银行长期发展来讲&#xff0c;这意味着将关闭和减少 低效率的实体分行&#xff0c;加速向数字化发展。实现成本节省和 IT 预算提效的需求&#xff0c;将为数字柜台和银行代理点创造新的机遇。 一个崭新的世界&#xff1a;未来数字银行趋势图 现在是银行迎头赶上并为客户提供超…

jenkins使用

安装插件 maven publish over ssh publish over ssh 会将打包后的jar包&#xff0c;通过ssh推送到指定的服务器上&#xff0c;&#xff0c;在jenkins中设置&#xff0c;推送后脚本&#xff0c;实现自动部署jar包&#xff0c;&#xff0c; 装了这个插件之后&#xff0c;可以在项…