概述
江苏南大先腾J2EE持久化框架研发目的不是为了取代MyBatis、Hibernate、Spring JDBC这样的成熟的持久化平台,而是为了让开发人员根容易的使用这些平台。这个框架一共有7个模块,其中一个共用模块,其他的分别是基于MyBatis、Hibernate、Spring JDBC开发的持久化框架和对应的spring 4 配置类。
设计这样持久化框架的目标有两个:
- 通过在Hibernate、MyBatis、Spring JDBC的基础上实现一些通用的方法,简化它们的使用难度,较少开发人员的学习成本。
- 通过对Hibernate、MyBatis、Spring JDBC的封装,让它们支持参数驱动sql, 然它们处理一些常见的场景拥有类似的方式,让不同喜好的开发人员可以更好的交流。当然这三个技术差别很大,框架中的特性也不是全部都能在它们之中无差别实现的。
对于Hibernate、MyBatis、Spring JDBC笔者认为Hibernate功能最完备,同时也是学习难度较大的,先腾持久化框架中笔者强力推荐Spring JDBC模块,因为这个模块式最灵活的,框架所有的特性支持的最好的,并且框架还通过Spring jdbc对JPA的一个子集进行了实现这样使用Spring jdbc就更加便捷了。下面的内容主要是讲述了先腾jdbc框架实现的内容。
框架内容
先腾持久化设计的内容包括:
- 通用的分页查询。
- 多数据源支持。
- 数据范围权限支持
- 业务数据逻辑删除(MyBatis不支持这个特性)。
- 通用的增删改操作。
- 各种sql语句查询、存储过程调用方法。
- 参数驱动sql的支持。
- DDL语句的支持。
由于Hibernate和jdbc都实现了jpa所以它们的使用方式非常接近,MyBatis和它们的差别较大。
通用的分页查询
框架通过一个BaseDaoImpl的抽象类实现了常用的增删改查功能。分页查询也在这个类中实现。(MyBatis例外)。
PageDesc类
PageDesc 类包含页码pageNo、页大小pageSize和总条目数totalRows三个属性,在分页查询中一般有一个既是入参又是出参的参数类型。
List<T> listObjects(String shql, Map<String, Object> filterDesc,
PageDesc pageDesc);
在这个函数中,利用QueryUtils中的buildGetCountSQL 方法获得数据总条数并设置到pageDesc的totalRows中,这样开发人员就不用自己去编写求总数的sql语句了。
pageQuery和pageCount 方法
BaseDaoImpl还实现了pageQuery和pageCount 两个分页查询的方式,这个主要是为了和MyBatis保持一致,因为MyBatis的查询不能同时执行两个sql语句。需要保存一致是因为先腾框架的系统维护模块可以切换不同的持久化模块。
多数据源支持
数据范围权限支持
在参数驱动SQL(三)数据范围权限 [附源码]已经说明框架是通过参数驱动sql来实现数据范围权限的,持久化框架中还设计了DataPowerFilter类用来存放用户相关的权限数据信息,和一些通用的权限验证函数。
业务数据逻辑删除
这个特性值适用于hibernate和jdbc框架,在对应的po上添加EntityWithDeleteTag接口的实现,在用deleteObject方法删除是,这个记录就是逻辑删除的。需要注意的是:
- 在查询时还是可以查询到删除的条目的,但是如果这个表是作为其他表的子表在OneToMany关联时式关联不到已逻辑删除的记录的(这个特性只有jdbc框架支持)。
- 不能直接用执行delete语句来删除数据。
通用的增删改操作
public abstract class BaseDaoImpl<T extends Serializable, PK extends Serializable>
在这个类中实现了通用的增删改操作,还包括用于业务逻辑操作的查询操作。这个查询和页面查询不一样,页面查询主要是用于向用户展示,一般需要分页,并且需要将代码等字段转换为文字,用于逻辑的查询一般返回的量比较小,需要转换为对象共业务操作,一般也不需要分页,这个是hibernate等支持jpa的持久化框架最擅长的。
各种sql语句查询、存储过程调用方法
DatabaseOptUtils类在三个版本的持久化平台中都有,它包括:
- 批量增删改操作
- 原生sql查询操作,返回一般为JSONArray
- 存储过程调用方法
- Sequence序列操作方法
参数驱动sql的支持
参见参数驱动SQL(四)与MyBatis框架整合 [附源码]。
DDL语句的支持
DDLOperationsWork类在三个版本的持久化平台中也都有,它抽象了一个表的信息描述对象,提供对表的添加和重构操作,前提式数据库授予了当前用户这个权力。