数据访问对象 DAO(Data Access Object)本质是个名词,但我们更多语境中不是作名词用,需要的是一套通用的接口去使用,至于返回的对象是什么,可以是 Java Bean 或者 Map 键对值。
假设我们背后有一套数据访问机制,是 MyBatis、原生 JDBC 无所谓,只要能提供数据就可以了,那么目前需要设计一套标准的 DAO 接口,会是这样的。
我们的目的是尽量可能简单衔接底层的据访问机制,提供常见的 findById
、 findList
、 create
、 update
等的操作,而且还允许扩展。于是只要求用户继承 Java Interface 接口就好,不用写实现。
数据格式
这里说的数据格式,就是数据实体,至于是 PO/VO/BO/DTO/POJO 什么鬼的先别管——我们刻下讨论的是 Java Bean 还是 Map。
为简单起见,假设背后的数据访问机制返回的通通都是 Map。——为什么要用 Map 呢?一个是简单,另外一个在跨表查询的时候,Map 是比较适合的,因为一般一个 Bean 对应一张表,如果跨表,那跨表的字段该放哪里好呢?
DAO 基类接口 IDataServiceBase
提供常见的数据操作方法,统一返回 Map
/ List<Map>
数据格式。
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import com.ajaxjs.framework.PageResult;
/**
* DAO 基类接口
* <p>
* 子接口继承该接口后,不需要写实现
*
* @author Frank Cheung<sp42@qq.com>
*/
public interface IDataServiceBase {
/**
* 查询单个记录。如果找不到则返回 null
*
* @param id 记录 id
* @return 单个记录的 Bean
*/
Map<String, Object> findByIdAsMap(Serializable id);
/**
* 查询列表数据
*
* @return Map 格式的列表结果
*/
List<Map<String, Object>> findListAsListMap();
/**
* 查询分页数据
*
* @param start 开始行数
* @param limit 读取行数
* @return 分页结果对象
*/
PageResult<Map<String, Object>> findPagedListAsMap(int start, int limit);
/**
* 新建记录
*
* @param map Map 实体
* @return 新建记录之 id 序号
*/
Serializable create(Map<String, Object> map);
/**
* 修改记录
*
* @param map Map 实,应包含 id 字段
* @return 影响的行数,理应 = 1
*/
Integer update(Map<String, Object> map);
/**
* 单个删除
*
* @param beanOrMapOrId
* @return 是否删除成功
*/
Boolean delete(Object beanOrMapOrId);
/**
* 设置 SQL WHERE 的查询条件参数
*
* @param queryParams
* @return
*/
IDataServiceBase setQuery(Map<String, Object> queryParams);
/**