关于数据访问模式(三)—— Data Accessor模式
拐弯抹角了两篇Post,说了一下重要性和很常见的一个词汇:Metadata,终于都到言归正传的时候了。今天我们先来看看数据访问模式当中使用得很频繁的一种模式——Data Accessor(也称为DAO,数据访问器)。
不管你是用着ADO.NET还是JDBC,你都可以直接使用SQL(在ADO.NET中使用SqlCommand,JDBC则是使用Statement)去访问数据库。而且,在使用SQL之前,你还得建立与数据库的连接(Connection)。于是,像这些涉及数据访问的代码就会散布在应用程序当中,使得程序维护或是性能改善都难以实施。举个很简单的例子,如果在一个项目中,每个程序员都要自己去建立与数据库的连接,那么当你希望实现一个连接池(Connection Pool)以提高性能的时候,散布在应用程序各处的建立连接的代码就会令你疲于奔命。因为在这种紧密耦合的情况下,连接池的使用改变了建立连接的方式,从而导致大量的代码改动。为了能够让应用程序更具灵活性,我们通常都会采用一些策略来降低应用程序与数据库访问细节之间的耦合度。Data Accessor就是这些解耦合的策略相当重要的一条。
Data Accessor的实质就是封装了对数据库访问的细节,仅对应用程序公开逻辑操作。Data Accessor封装细节的程度也就决定了其实现的复杂程度。最简单的一种Data Accessor实现就是由一个Support类提供通用的获得连接的方法,然后进行数据操作的类都必须扩展这个Support类。具体代码如下所示:
public final Connection getConnection() {
// 获得连接
}
public final void releaseConnection(Connection conn) {
// 释放连接
}
}
public class UserDAO extends DAOSupport {
private Connection conn = getConnection();
}
在以上的代码中,DAOSupport+UserDAO类就可以看作是一个Data Accessor,虽然仅仅是对获得和释放Connection的细节进行了封装,但是这样简单的分离都会令整个开发过程受益匪浅。
上面的例子虽然实现了最简单的Data Accessor,但是事实上这样的Data Accessor还是太简陋了(原始社会的产品),毕竟你在UserDAO中操作数据表的话,还是得写SQL。好了,为了让这个Data Accessor更加名副其实,我们还要做进一步的抽象。通常对数据库表进行的操作不外乎CRUD,所以我们就可以在DAOSupport中增加相应的四个方法[1]:
public void insert(String table, List rows) throws SQLException;
public void update(String table, Row selectedRow, Row updateRow) throws SQLException;
public void delete(String table, Row selectedRow) throws SQLException;
其中Row是一个辅助类,用于表示数据库中的一行中的所有列或者某几列数据,可以通过一个HashMap来实现。上面定义的几个方法,实质上是要在方法体中实现SQL的自动构造,具体的实现就不在这里赘述了,有兴趣的朋友可以参考《数据访问模式——面向对象应用中的数据库交互》一书。 在增加了这四个方法之后,UserDAO中涉及数据访问的代码都可以通过调用这四个方法来完成了,完全脱离了具体的数据访问细节。当你为了优化查询的方法而修改read方法的时候,修改就会影响到所有的*DAO类,一处修改,处处受益。
虽然我们通过抽象而建立起来的四个方法可以让我们逃避了SQL的困扰,但并非一劳永逸。细心的你一定会发现,read方法的参数仅是表名和列名,这样返回的纪录集将会是数据表中的所有行,因此,我们还是得增加一个参数,使得read方法更加实用。于是read方法就变成了这样:
在增加了conditions这样参数以后,read方法可以根据条件的界定获得相应的某一行了。功能增加了,随之而来的就是方法复杂度的增加,抽象过程也显得愈加困难。总之,Data Accessor最关键的在于逻辑操作的抽象,复杂度与功能之间的均衡。
[1] 代码参考了《数据访问模式——面向对象应用中的数据库交互》
关于数据访问模式(三)—— Data Accessor模式相关推荐
- DAO数据访问对象(Data Access Object)
持久化是将程序中数据库在瞬时状态和持久状态间转换的机制JDBC是一种持久化的机制,将程序直接保存成文本文件也是持久化机制的一种实现 JDBC的封装: 原因: JDBC将程序中的数据持久化保存到MySQ ...
- 工厂模式——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...
工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method):又称为多形性工厂: 3) ...
- STM32单片机的启动模式 三种BOOT模式介绍
在绘制32单片机时,参考别人的原理图对单片机的启动方式BOOT有疑问, 这里写目录标题 自己的理解和应用 一.三种BOOT模式启动的介绍 二.自己开发BOOT模式的选择 官方的文档介绍 自己的理解和应 ...
- 开源数据访问组件Smark.Data 1.8入门编
本章节主要讲述如何使用Smark.Data 1.8进行快速的数据库应用开发,主要内容包括配置,执行SQL和存储过程等基础的数据操作. 配置 在组件使用之前必须进行一个初始化配置,主要配置数据访问设备和 ...
- 【OS学习笔记】十五 保护模式三:保护模式下的内存访问机制
上一篇文章学习了段描述符与段描述符各个标志位的含义:段描述符 本篇文章学习如何进入保护模式,并学习如何在保护模式下进行内存访问. 1.如何进入保护模式 假设我们已经用汇编语言将段描述符安装到GDT中( ...
- 《深入设计模式》笔记 -创建型模式三、生成器模式(建造者模式)
生成器模式 亦称:建造者模式.Builder 意图 生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象. 该模式允许你使用相同的创建代码生成不同类型和形式的对象. 问题 假设有这样一个复杂对 ...
- 开源数据访问组件Smark.Data 1.8
Smark.Data一直强调以最简单和高效的方式访问数据库,在这个版本中组件引入了Query<T>对象,它是一个查询值描述对象,通过它可以更方便地进行数据查询并获取结果.组件会分析T的具体 ...
- 开源数据访问组件Smark.Data 1.7新增功能
借助于扩展方法的功能,这一版本的改进可以让数据库操作变得更简单方便,在数据库操作相关会给你一种全新的体验.主要改进有以下几点: 条件表达式可以直接和string进行组合,从而更灵活地创建复杂的查询条件 ...
- 2021年大数据Hive(二):Hive的三种安装模式和MySQL搭配使用
全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive的三种安装模式和MySQL搭配使用 一.Hive的安装方 ...
最新文章
- Tomcat8配置tomcat-users.xml配置
- excel字段自动java类,Java 接口自动化系列--工具类之Excel测试数据解析封装
- go语言web开发框架_Iris框架讲解(六):Session的使用和控制
- Js中 call() 与 apply() exports
- 来自极客标签10款最新设计素材-系列七
- linux suse 安装redis,suse 配置redis远程访问
- oracle中变量前加冒号_ORACLE 变量的定义和使用
- 【CodeForces - 289C】Polo the Penguin and Strings (水题,字符串,思维构造,有坑)
- 计算机生成兵力方法,计算机生成兵力平台体系结构技术研究
- 行间事件传this的问题:
- caffe+CPU︱虚拟机+Ubuntu16.04+CPU+caffe安装笔记
- spark mlilib 聚类 混合高斯
- mac黑白打印和彩色打印
- 国标GB28181协议国标视频平台国标流媒体服务器EasyGBS向上级联多个平台设备及通道选择错位问题解析
- uni-app地址四级联动
- 暗斑怎么形成的_脸上出现暗斑的原因是什么?暗斑怎么形成的
- android怎么装windows系统,普通电脑怎么装Windows和安卓的双系统?
- wifi虚拟服务器名称怎么弄,虚拟wifi设置方法大全【图解】
- 手把手安排 --- JavaH5微信支付(移动端浏览器H5拉起微信支付)
- xcode 编译 c