Skip to content

DasClient DAO 使用手册

Shengyuan Lu 卢声远 edited this page Oct 28, 2019 · 12 revisions

简介

很多时候用户会把基于某个特定表的数据库访问方法放在同一个DAO里面集中维护。目前虽然DasClient提供了全面的数据库访问API,但从设计角度考虑,不希望用户继承。为了满足用户的需要,我们提供两种基于表的DAO方便用户继承和扩展:

  1. TableDao 支持单表操作的DAO
  2. LogicDeletionDao 支持单表逻辑删除操作的DAO

这两种DAO中都包含了基于Pojo的数据库方法,方法名和DasClient中基于Pojo的方法一致。由于所有方法操作的是同一类型的实体,因此DAO本身参数化为用户定义的实体类型。用户可以根据自己的情况任选。

TableDao简介:

方法 说明
T queryByPk(T pk, Hints...hints) throws SQLException 按照主键进行查询。如果是分库分表的情况,需提供分库分表字段或指定具体的分片值或分片ID
List queryBySample(T sample, Hints...hints) throws SQLException 按照给定样例进行查询,样例中每个非空字段都会转换为相等(=)的匹配模式,并通过AND联合起来
List queryBySample(T sample, PageRange range, Hints...hints) throws SQLException 按照给定样例进行查询,样例中每个非空字段都会转换为相等(=)的匹配模式,并通过AND联合起来。同时指定查询所在的页面和结果集排序方式
long countBySample(T sample, Hints...hints) throws SQLException 按照给定样例进行统计,样例中每个非空字段都会转换为相等(=)的匹配模式,并通过AND联合起来
int insert(T entity, Hints...hints) throws SQLException 插入一个记录
int insert(List entities, Hints...hints) throws SQLException 插入一列记录,语法是insert into xxx values(),(),,,
int[] batchInsert(List entities, Hints...hints) throws SQLException 插入一列记录,利用JDBC本身提供的batch操作功能
int deleteByPk(T pk, Hints...hints) throws SQLException 按主键进行删除。如果是分库分表的情况,需提供分库分表字段或指定具体的分片值或分片ID
int deleteBySample(T sample, Hints...hints) throws SQLException 按照给定样例进行删除,样例中每个非空字段都会转换为相等(=)的匹配模式,并通过AND联合起来
int[] batchDelete(List entities, Hints...hints) throws SQLException 删除一列记录,利用JDBC本身提供的batch操作功能
int update(T entity, Hints...hints) throws SQLException 更新一条记录
int[] batchUpdate(List entities, Hints...hints) throws SQLException 更新一列记录,利用JDBC本身提供的batch操作功能

LogicDeletionDao简介:

一般原则:

  • 逻辑删除含义

逻辑删除是指在发起删除操作的时候,并不实际删除底层记录,而是在记录某些字段上设置特殊标记,通过这种标记,标明记录处于删除状态。

  • 参数校验

在调用数据库操作的时候,如果记录本身是删除状态的话,是不参与操作的。如果传入的参数包含删除标记,则直接报错。

  • 结果过滤

dao提供的查询方法会加上排除已删除记录的条件,返回结果中如果包含已删除数据,则直接过滤掉。

方法简介

LogicDeletionDao继承自TableDao,因此具有TableDao所有的方法。每种方法都会做参数校验或结果过滤。

构造方法

public LogicDeletionDao(String logicDbName, Class<T> entityType, LogicDeletionSupport<T> deletionSupport) throws SQLException
public LogicDeletionDao(String logicDbName, Class<T> entityType, LogicDeletionSupport<T> deletionSupport, boolean validateInput, boolean filterOutput) throws SQLException 

LogicDeletionDao有两个构造方法,与LogicDeletionSupport配合使用。

第一个构造方法会以validateInputfilterOutput都为true的形式调用第二个构造方法。

第二个构造方法提供了对输入和输出更多的控制,用户可以选择:

  1. validateInput:是否对输入做校验,在检查到已删除记录时报警。
  2. filterOutput:是否自动过滤掉输出中的被删除记录。

LogicDeletionSupport的用法在下面的部分有说明。

帮助方法

由于逻辑删除的特殊性,为了方便用户操作,提供了如下方法:

方法 说明
final boolean isDeleted(T entity) 判断实体是否标记为删除状态
final List filterDeleted(List entities) 从原始列表里面删除所有标记为删除状态的记录并返回所有删除的记录
final boolean containsDeleted(List entities) 判断列表内是否包含标记为删除的记录
final Object[] getActiveCondition(TableDefinition tableDef) 根据表定义获取活跃记录的表达式,用于查询或更新的条件
final void validateInput(T entity) throws SQLException 校验记录的有效性,如果当前记录为已删除状态,则报错
final void validateInput(List entities) throws SQLException 校验记录列表的有效性,如果包含标记为删除状态的记录,则报错
final T processOutput(T result) throws SQLException 处理输出,如果记录标记为已删除状态则返回null
final List processOutput(List results) throws SQLException 处理输出,如果记录列表包含标记为已删除状态的记录,则过滤这些记录,返回未标记删除状态的记录
final void setActiveFlag(T entity) 将记录设置为非删除状态
final void setActiveFlag(List entities) 将记录列表设置为非删除状态
final void setDeletionFlag(T entity) 将记录设置为删除状态
final void setDeletionFlag(List entities) 将记录列表设置为删除状态
final void clearDeletionFlag(T entity) 清空记录的删除状态
final void clearDeletionFlag(List entities) 清空记录列表的删除状态

注意 💡 : 由于操作的特殊性,为了避免出现误操作,LogicDeletionDao的公开方法都设置为final,以防止用户无意中覆盖。

如果有特殊要求必须重载某个公开方法,请与DAS开发人员联系。

扩展说明

用户可以自由的扩展TableDaoLogicDeletionDao,并在子类中添加相关的方法。

LogicDeletionSupport

为了使LogicDeletionDao的适用场景更加通用,DAS定义了LogicDeletionSupport来抽象逻辑删除的核心逻辑。其中包含以下接口。 以下是方法说明:

方法 说明
boolean isDeleted(T entity) 判断实体是否标记为删除状态
void setActiveFlag(T entity) 将记录设置为非删除状态
void setDeletionFlag(T entity) 将记录设置为删除状态
void clearDeletionFlag(T entity) 清空记录的删除状态
Object[] getActiveCondition(TableDefinition tableDef) 根据表定义获取活跃记录的表达式,用于查询或更新的条件
Object[] getDeletionCondition(TableDefinition tableDef) 根据表定义获取非活跃记录的表达式,用于查询或更新的条件;注意,该方法目前没有使用
Object[] setDeletionFlag(TableDefinition tableDef) 根据表定义获取设置记录活跃字段的表达式,用于更新语句的SET部分

DeletionFieldSupport

DAS缺省提供了DeletionFieldSupport作为LogicDeletionSupport的实现类。用户可以简单的使用该类来实例化LogicDeletionDao

该类的构造函数如下:

public DeletionFieldSupport(Class<T> entityType, ColumnDefinition deletionColumn, Object deleted, Object active)

参数说明:

  • entityType:实体类的class
  • deletionColumn:删除状态对应的字段
  • deleted:代表删除状态的值
  • active:代表活跃状态的值

示例: 假设person表的provinceID是逻辑删除的标志位,0代表删除状态,1代表活跃。创建逻辑删除DAO的方法如下:

DeletionFieldSupport<Person> support = new DeletionFieldSupport<>(Person.class, Person.PERSON.ProvinceID, DELETED, ACTIVE);
logicDelDao = new LogicDeletionDao<>(getDbName(dbCategory), Person.class, support);