设计模式在Java 数据库操作组件中的应用
2019-04-26武宗品
文/武宗品
信息化系统包含信息的采集、处理、分析和统计,在此过程中,需要进行信息的持久化存储。信息系统当前大多数使用关系型数据库来存储信息。
根据TIOBE 排行榜,Java 依然是排名第一的开发语言,因此公司使用Java 开发信息化系统。面向对象是Java 的一大特点,在使用面向对象方法进行系统开发时,需要用实体对象来表示所处理的信息。因此,就需要不断的对信息进行关系型数据和实体对象的互转,即所谓的对象关系映射(Object-Relational Mapping,简称ORM)。
目前有多种框架帮助开发者简化ORM 的开发,例如Hiberante 和iBatis。这些框架有诸多优势,但同时也存在天然缺陷:由于是在程序运行时才会生产数据库操作,导致在开发时难以调试,难以进行SQL 优化。
针对上述问题,本文提出并实现了一个轻量级的Java 数据库操作组件——DatabaseOperator,该组件为开发人员提供一个简单、高效、方便调试和优化的数据库操作方法。由于可以自行控制SQL 语句,并且无需关注JDBC 的各种状态维护,为开发人员提供了更大的灵活性,减轻了许多冗余代码。该组件已经在公司开发的多套系统中使用。
1 技术概述
数据库操作组件DatabaseOperator 为了保留调试和SQL 优化的特性,选择采用JDBC来直接操作数据库。同时,为了简化开发人员的操作,降低代码冗余,减少开发人员对数据库连接的维护工作,组件将采用状态模式和观察者模式这两个设计模式作为设计指导。
1.1 设计模式
Erich Gamma 等人给出了设计模式的定义,可以这样去理解它:设计模式和语言无关,通常是一种针对某类问题或场景,将变化的部分抽离出去,将不变的部分保留下来,最终形成的一个解决问题的套路或思考范式。本小节将对用到的两个设计模式进行简单介绍。
图1:标准数据库操作
图2:数据库操作状态
1.1.1 状态模式
该模式的定义:状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。普遍的说,当要处理的事情有不同的状态,并且在不同的状态有不同的行为,状态与状态之间有明确的转换触发条件,对于存在这种情况的可以使用状态模式来指导设计,规范代码结构。
1.1.2 观察者模式
该模式的定义:观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。普遍的说,当要处理的事情有一个明确的第三方,该第三方需要获取相关对象的行为,并在全部或者某些行为时第三方有自己的行动,对于存在这种情况的可以使用观察者模式来指导设计。
1.2 JDBC
Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java 语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
2 设计与实现
本小节首先介绍标准的数据库操作方法,然后通过分析,设计出一套简洁高效的数据库操作组件并进行实现。
2.1 标准数据库操作
如图1所示,是一个Java 上的标准数据库操作步骤:①定义变量;②连接数据库;③业务操作(本例是一个最简单的业务查询操作);④处理业务异常;⑤关闭数据库连接。
2.2 分析与设计
上节所介绍的标准数据库操作中,对于开发人员需要关注的只有“③业务操作”这一部分,可以看到其余都是无需关注的,如何抽离那些无需关注的而只保留需要关注的部分是实现组件的关键。
通过分析,可知在操作数据库的时候,经历了如下几个步骤:参数初始化;连接数据库;处理业务;完成并关闭。在每一个步骤中,都会有不同的操作,并且步骤之间的转换都是通过固定的操作来完成的。针对这种场景,使用“状态模式”来进行设计:将数据库操作的每一步都看作一个状态,在独立的状态中,只需关注当前状态要做的事情,状态与状态之间的转换,交给几个专门的处理方法来完成即可。图1所示的数据库操作只是基本的业务查询操作,考虑到还有批量操作、存储过程操作和事务操作,最终设计的状态机如图2所示:init(初始状态);transaction(事务状态);sqlDone(业务状态);callable(存储过程状态);batch(批量业务状态)。触发状态转换的操作有:startTransaction,开启事务;commit,提交事务;setSql,设定数据库操作语句;setPS,动态SQL 参数;execute/query,增删改查;setCallable,设定存储过程;setCallableHandler,设定存储过程回掉;addSql,添加批量SQL;addBatch,添加批量操作;executeBatch,执行批量操作;end,结束操作。
图3:实现
通过分析,数据库在操作的过程中,为了让开发人员专注于业务,而无需关注和维护当前数据库连接的建立与关闭,需要有第三方来监控现在的操作状态,并在操作结束时关闭数据库连接、回收对象。针对这种场景,使用“观察者模式”来指导设计:当开始进行数据库操作的时候,监控对象订阅数据库操作对象的通知,数据库操作结束时发出通知,监控对象负责完成关闭数据库连接和回收对象的工作。
2.3 实现
根据分析与设计,数据库操作组件的实现如图3所示。
开发人员在使用该组件的时候,需要操作图1所示的业务时,实际代码如图4所示。由此可见,不仅保留了SQL 的可调式性,也大大减少了开发的工作量。
3 总结
在结合了状态模式和观察者模式之后,对JDBC 进行了重新的封装,完成了DatabaseOperator 数据库操作组件的开发。使用该组件,无需引用大量的框架,能够快速搭建信息系统,简化代码工作量,保持SQL 可调式,确保数据库优化的可控性,为公司多个项目的开发提高了效率,降低了出错率。同时,在实践中也发现该组件还有可以不断优化的地方,例如:与数据库的连接除了自己创建之外,还可以交给数据库连接池来进行管理,从而提高连接效率;数据查询后的结果,可以使用反射机制将查询后的结果直接转变成对象。
图4:使用组件后的数据库操作