J2EE之DAO设计模式及简单实现

JAVAEE(Java Enterprise Edition ) 模式 : DAO模式
因此在了解DAO模式之前,我们先来学习一下Java EE的体系结构:
(一)JavaEE体系结构
这里写图片描述

客户端

  • 客户端层:DHTML(Dynanic HTML:HTML+CSS+JavaScript)、JavaApplication(带有main函数的Java程序)

服务器端

  • web层(接收请求,生成响应):Servlet、JSP

  • 业务逻辑层(编写程序业务处理流程):EJB(企业版JavaBean),例如容器管理,线程并发等都包含其中,因此体积庞大,使用复杂,中小型软件不使用

  • 持久层(数据库的增删改查)(数据访问层):Java访问数据库依赖于JDBC接口规范

上述JavaEE体系构成,规范了一个Java程序的构成。因此,假如要设计一款Java EE的软件就需要遵循上面的结构。即我想做一个功能,按照这套结构,从客户端开始,应该写4个程序(如上图所示)。

Struts:实现Servlet与JSP的传统功能
Spring:管理JavaBean的状态
Hibernate:完成数据库的增删改查

实际上,做一套软件,使用Servlet+JSP+JavaBean+JDBC完全可以完成,SSH是对传统开发方式的一个封装,可以在SSH框架的基础上继续进行开发,相对于从Servlet和JSP一点点进行开发,可以大大降低开发的复杂度。

服务器端三层也被称为经典三层结构,即web层(表现层),业务逻辑层,数据持久层,出现了很多结合三层JavaEE的设计模式,DAO模式就是数据持久层的设计模式

MVC 和 JavaEE经典三层结构的比较
实际上MVC 和 JavaEE经典三层结构是由两拨人分别提出的,两者间可以有着如下的对应:

  • 三层结构中业务层、数据持久层 —- Model
  • 三层结构中web层 JSP —- View
  • 三层结构中web层 Servlet —- Controller

(二)DAO(Data Access Object 数据访问对象)设计模式

1、DAO模式的功能:

  • 封装对于数据源的操作,数据源可能是文件、数据库等任意存储方式(可以与数据库或者文件进行交互,业务层在去操作数据层时,不需要知道数据层底层的存储实现)
  • 负责管理与数据源的连接
  • 负责数据的存取(CRUD)

其原理可以用如下图进行解释:

这里写图片描述

DAO模式更通俗的来说,数据层用DAO完全封装了数据源底层实现(相互间传递的是对象,不需要知道其具体实现),提供了增删改查功能;业务层如果操作数据源采用对象的方式,就是说业务层要存一个User的数据,只需要将User数据交给DAO层(数据层),DAO会将数据存到数据库或者文件当中,想查询,即返回一个对象即可。即业务层和数据层进行通信传递的都是对象就是DAO模式好处是业务层开发人员不需要会表写SQL,只要将对象封装好传给数据层即可,少儿英语培训教材通过对象操作完成对数据源增删改查。(使业务层和数据层分离)。

2、DAO模式的构成

DAO模式的构成可以通过如下图进行讲解:

这里写图片描述

  • Business Object :代表数据的使用者 (业务层程序)
  • DataAccessObject :抽象并封装了对底层数据源的操作 (数据层程序)
  • DataSource 数据源 — mysql数据库
  • TransferObject 表示数据的Java Bean

BussinessObject 通过 将transferObject 传递 DataAccessObject 完成对DataSource的增删改查

(三)用DAO模式重写对users表增删改查 (业务层传递一个对象到数据层完成数据库的增删改查)
业务层通过对象的操作,完成对数据源增删改查
DAO模式,将增删改查sql封装起来,方法参数和返回值都是对象,业务层通过操作这些对象,完成对数据库增删改查

接下来我们来写一个DAO模式的实例:
按照DAO模式的结构,我们创建4个package:

这里写图片描述

其中cn.megustas.service代表业务层BusinessObject,代表使用者;cn.megustas.dao代表DataAccessObject,封装了对源数据的增删改查操作,返回对象;cn.megustas.domain代表TransferObject,其中是表示数据的JavaBean;cn.megustas.jdbc是将常用的数据库连接等语句封装于Untils,方便直接调用使用。

假设在database中已经存在如下的table:

这里写图片描述

TransferObject:

*小技巧:对于JavaBean中的get/set方法的生成,可以选中成员变量,右键-Source-Generate Getters and Setters

JDBCUtils:

DataAccessObject:

*注意,(1)一定要在try{}catch{}后使用finally进行资源释放(2)sql中字符串需要使用‘’

BusinessObject:
可以发现,业务层进行数据的增删改查,无需写SQL语句,只需创建对应的对象,调用数据层(DataAccessObject)方法就可以实现(也就是说在实际工程中可以将业务进行分工,业务层的操作人员可以不必会SQL等相关操作也可以进行数据库的增删改查)

具体代码完整下载可以去Git:https://coding.net/u/TwistFate/p/DaoTest/git

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )