org.sagacity.sqltoy.dao.SqlToyLazyDao Maven / Gradle / Ivy
package org.sagacity.sqltoy.dao;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.sql.DataSource;
import org.sagacity.sqltoy.SqlToyContext;
import org.sagacity.sqltoy.callback.StreamResultHandler;
import org.sagacity.sqltoy.callback.UpdateRowHandler;
import org.sagacity.sqltoy.config.model.EntityMeta;
import org.sagacity.sqltoy.config.model.SqlToyConfig;
import org.sagacity.sqltoy.config.model.SqlType;
import org.sagacity.sqltoy.link.Batch;
import org.sagacity.sqltoy.link.Delete;
import org.sagacity.sqltoy.link.Elastic;
import org.sagacity.sqltoy.link.Execute;
import org.sagacity.sqltoy.link.Load;
import org.sagacity.sqltoy.link.Mongo;
import org.sagacity.sqltoy.link.Query;
import org.sagacity.sqltoy.link.Save;
import org.sagacity.sqltoy.link.Store;
import org.sagacity.sqltoy.link.TreeTable;
import org.sagacity.sqltoy.link.Unique;
import org.sagacity.sqltoy.link.Update;
import org.sagacity.sqltoy.model.CacheMatchFilter;
import org.sagacity.sqltoy.model.ColumnMeta;
import org.sagacity.sqltoy.model.EntityQuery;
import org.sagacity.sqltoy.model.EntityUpdate;
import org.sagacity.sqltoy.model.LockMode;
import org.sagacity.sqltoy.model.Page;
import org.sagacity.sqltoy.model.ParallQuery;
import org.sagacity.sqltoy.model.ParallelConfig;
import org.sagacity.sqltoy.model.QueryExecutor;
import org.sagacity.sqltoy.model.QueryResult;
import org.sagacity.sqltoy.model.StoreResult;
import org.sagacity.sqltoy.model.TableMeta;
import org.sagacity.sqltoy.model.TreeTableModel;
import org.sagacity.sqltoy.translate.TranslateHandler;
/**
* @project sqltoy-orm
* @description 提供一个便捷的dao实现,供开发过程中直接通过service调用,避免大量的自定义Dao中仅仅是一些简单的中转调用
* @see 因SqlToyLazyDao是一开始逐步迭代的结果,为兼容历史项目,api存在命名规则统一性差的因素,因此重新创建了 LightDao
* @author zhongxuchen
* @version v1.0,Date:2015年11月27日
* @modify Date:2017-11-28 {增加link链式操作功能,开放全部SqlToyDaoSupport中的功能}
* @modify Date:2020-4-23 {对分页查询增加泛型支持}
* @modify Date:2020-10-20 {增加loadAll(list,lock)}
*/
@SuppressWarnings({ "rawtypes" })
public interface SqlToyLazyDao {
/**
* @TODO 获取sql对应的配置模型
* @param sqlKey 对应sqlId
* @param sqlType SqlType.search或传null
* @return SqlToyConfig
*/
public SqlToyConfig getSqlToyConfig(String sqlKey, SqlType sqlType);
/**
* @todo 获取实体对象的跟数据库相关的信息
* @param entityClass
* @return EntityMeta
*/
public EntityMeta getEntityMeta(Class entityClass);
/**
* @todo 判断对象属性在数据库中是否唯一
* @param entity
* @param paramsNamed 对象属性名称(不是数据库表字段名称)
* @return boolean true:唯一;false:不唯一
*/
public boolean isUnique(Serializable entity, String... paramsNamed);
/**
* @todo 获取符合条件的查询对应的记录数量
* @param sqlOrSqlId
* @param paramsNamed
* @param paramsValue
* @return Long 查询符合条件的记录数量
*/
public Long getCount(String sqlOrSqlId, String[] paramsNamed, Object[] paramsValue);
/**
* @TODO 通过map传参获取记录数量
* @param sqlOrSqlId
* @param paramsMap
* @return Long 查询符合条件的记录数量
*/
public Long getCount(String sqlOrSqlId, Map paramsMap);
/**
* @TODO 通过POJO产生count语句
* @param entityClass
* @param entityQuery 例如:EntityQuery.create().where("status=:status").names("status").values(1)
* @return Long 查询符合条件的记录数量
*/
public Long getCount(Class entityClass, EntityQuery entityQuery);
/**
* @todo 存储过程调用
* @param storeSqlOrKey 可以是xml中的sqlId 或者直接{call storeName (?,?)}
* @param inParamValues
* @return StoreResult 用:getRows()获得查询结果
*/
public StoreResult executeStore(final String storeSqlOrKey, final Object[] inParamValues);
/**
* @TODO 存储过程调用,outParams可以为null
* @param storeSqlOrKey 可以是xml中的sqlId 或者直接{call storeName (?,?)}
* @param inParamValues
* @param outParamsType 可以为null
* @param resultType 可以是VO、Map.class、LinkedHashMap.class、Array.class,null(二维List)
* @return StoreResult
*/
public StoreResult executeStore(String storeSqlOrKey, Object[] inParamValues, Integer[] outParamsType,
Class resultType);
/**
* @TODO 存储过程调用,outParams可以为null
* @param storeSqlOrKey 可以是xml中的sqlId 或者直接{call storeName (?,?)}
* @param inParamValues
* @param outParamsType 可以为null
* @param resultTypes 可以是VO、Map.class、LinkedHashMap.class、Array.class,null(二维List)
* @return StoreResult
*/
public StoreResult executeMoreResultStore(String storeSqlOrKey, Object[] inParamValues, Integer[] outParamsType,
Class... resultTypes);
/**
* @TODO 流式获取查询结果
* @param queryExecutor
* @param streamResultHandler
*/
public void fetchStream(final QueryExecutor queryExecutor, final StreamResultHandler streamResultHandler);
/**
* @todo 保存对象,并返回主键值
* @param entity
* @return Object 返回主键值
*/
public Object save(Serializable entity);
/**
* @TODO 批量保存对象,并返回数据更新记录量
* @param
* @param entities
* @return Long 数据库发生变更的记录量
*/
public Long saveAll(List entities);
/**
* @TODO 批量保存对象并忽视已经存在的记录
* @param
* @param entities
* @return Long 数据库发生变更的记录量
*/
public Long saveAllIgnoreExist(List entities);
/**
* @todo 修改数据并返回数据库记录变更数量(非强制修改属性,当属性值为null不参与修改)
* @param entity
* @param forceUpdateProps 强制修改的字段属性
* @return Long 数据库发生变更的记录量
*/
public Long update(Serializable entity, String... forceUpdateProps);
/**
* @TODO 适用于库存台账、客户资金账等高并发强事务场景,一次数据库交互实现:
*
*
1、锁查询;
* 2、记录存在则修改;
* 3、记录不存在则执行insert;
* 4、返回修改或插入的记录信息
*
* @param
* @param entity 尽量不要使用identity、sequence主键
* @param updateRowHandler
* @param uniqueProps 唯一性字段,用于做唯一性检索,不设置则按照主键进行查询
* @return
*/
public T updateSaveFetch(final T entity, final UpdateRowHandler updateRowHandler,
final String... uniqueProps);
/**
* @todo 深度修改,不管是否为null全部字段强制修改
* @param serializableVO
* @return Long 数据库发生变更的记录量
*/
public Long updateDeeply(Serializable serializableVO);
/**
* @TODO 基于对象单表对象查询进行数据更新
* @param entityClass
* @param entityUpdate 例如:EntityUpdate.create().set("createBy",
* "S0001").where("staffName like ?").values("张")
* @return Long 数据库发生变更的记录量
*/
public Long updateByQuery(Class entityClass, EntityUpdate entityUpdate);
/**
* @todo 级联修改数据并返回数据库记录变更数量
* @param entity
* @param forceUpdateProps
* @param forceCascadeClasses
* @param subTableForceUpdateProps
* @return Long 数据库发生变更的记录量
*/
public Long updateCascade(Serializable entity, String[] forceUpdateProps, Class[] forceCascadeClasses,
HashMap subTableForceUpdateProps);
/**
* @TODO 批量修改操作,并可以指定强制修改的属性(非强制修改属性,当属性值为null不参与修改)
* @param
* @param entities
* @param forceUpdateProps
* @return Long 数据库发生变更的记录量
*/
public Long updateAll(List entities, String... forceUpdateProps);
/**
* @TODO 批量深度修改,即全部字段参与修改(包括为null的属性)
* @param
* @param entities
* @return Long 数据库发生变更的记录量
*/
public Long updateAllDeeply(List entities);
/**
* @todo 保存或修改数据并返回数据库记录变更数量
* @param entity
* @param forceUpdateProps 强制修改的字段
* @return Long 数据库发生变更的记录量
*/
public Long saveOrUpdate(Serializable entity, String... forceUpdateProps);
/**
* @TODO 批量保存或修改操作(当已经存在就执行修改)
* @param
* @param entities
* @param forceUpdateProps 强制修改的字段
* @return Long 数据库发生变更的记录量
*/
public Long saveOrUpdateAll(List entities, String... forceUpdateProps);
/**
* @todo 删除单条对象并返回数据库记录影响的数量
* @param entity
* @return Long 数据库发生变更的记录量(删除数据量)
*/
public Long delete(final Serializable entity);
/**
* @todo 批量删除对象并返回数据库记录影响的数量
* @param entities
* @return Long 数据库记录变更量(删除数据量)
*/
public Long deleteAll(final List entities);
/**
* @TODO 根据id集合批量删除
* @param entityClass
* @param ids
* @return
*/
public Long deleteByIds(Class entityClass, Object... ids);
/**
* @TODO 基于单表查询进行删除操作,提供在代码中进行快捷操作
* @param entityClass
* @param entityQuery 例如:EntityQuery.create().where("status=?").values(0)
* @return Long 数据库记录变更量(插入数据量)
*/
public Long deleteByQuery(Class entityClass, EntityQuery entityQuery);
/**
* @todo truncate 刪除全表记录,通过entityClass获得表名
* @param entityClass
*/
public void truncate(final Class entityClass);
/**
* @todo 根据实体对象的主键值获取对象的详细信息
* @param entity
* @return entity
*/
public T load(final T entity);
/**
* @todo 根据主键获取对象,提供读取锁设定
* @param entity
* @param lockMode LockMode.UPGRADE 或LockMode.UPGRADE_NOWAIT等
* @return entity
*/
public T load(final T entity, final LockMode lockMode);
/**
* @todo 对象加载同时指定加载子类,实现级联加载
* @param entity
* @param lockMode
* @param cascadeTypes
* @return entity
*/
public T loadCascade(final T entity, final LockMode lockMode, final Class... cascadeTypes);
/**
* @todo 根据集合中的主键获取实体的详细信息(底层是批量加载优化了性能,同时控制了in 1000个问题)
* @param entities
* @return entities
*/
public List loadAll(List entities);
/**
* @todo 提供带锁记录的批量加载功能
* @param
* @param entities
* @param lockMode
* @return
*/
public List loadAll(List entities, final LockMode lockMode);
/**
* @TODO 通过EntityQuery模式加载单条记录
* @param
* @param entityClass
* @param entityQuery 例如:EntityQuery.create().select(a,b,c).where("tenantId=?
* and staffId=?").values("1","S0001")
* @return
*/
public T loadEntity(Class entityClass, EntityQuery entityQuery);
public T loadEntity(Class entityClass, EntityQuery entityQuery, Class resultType);
/**
* @TODO 通过EntityQuery 组织查询条件对POJO进行单表查询,为代码中进行逻辑处理提供便捷
* 如果要查询整个表记录:findEntity(entityClass,null) 即可
* @param
* @param entityClass
* @param entityQuery EntityQuery.create().where("status=:status #[and staffName
* like
* :staffName]").names("status","staffName").values(1,null).orderBy()
* 链式设置查询逻辑
* @return
*/
public List findEntity(Class entityClass, EntityQuery entityQuery);
/**
* @TODO 通过entity实体进行查询,但返回结果类型可自行指定
* @param
* @param entityClass
* @param entityQuery
* @param resultType 指定返回结果类型
* @return
*/
public List findEntity(Class entityClass, EntityQuery entityQuery, Class resultType);
/**
* @TODO 单表分页查询
*
* 1、对象传参: findPageEntity(new
* Page(),StaffInfo.class,EntityQuery.create().where("status=:status").values(staffInfo))
* 2、数组传参: findPageEntity(new
* Page(),StaffInfo.class,EntityQuery.create().where("status=?").values(1))
*
* @param
* @param page
* @param entityClass
* @param entityQuery
* @return
*/
public Page findPageEntity(final Page page, Class entityClass, EntityQuery entityQuery);
/**
* @TODO 单表分页查询,同时可以指定返回对象类型为非实体对象
* @param
* @param page
* @param entityClass
* @param entityQuery
* @param resultType
* @return
*/
public Page findPageEntity(final Page page, Class entityClass, EntityQuery entityQuery, Class resultType);
/**
* @todo 选择性的加载子表信息
* @param entities
* @param cascadeTypes
* @return
*/
public List loadAllCascade(List entities, final Class... cascadeTypes);
/**
* @TODO 锁住主表记录并级联加载子表数据
* @param
* @param entities
* @param lockMode
* @param cascadeTypes
* @return
*/
public List loadAllCascade(List entities, final LockMode lockMode,
final Class... cascadeTypes);
/**
* @TODO 根据id集合批量加载对象
* @param
* @param entityClass
* @param ids
* @return
*/
public List loadByIds(final Class entityClass, Object... ids);
/**
* @TODO 根据id集合批量加载对象,并加锁
* @param
* @param entityClass
* @param lockMode
* @param ids
* @return
*/
public List loadByIds(final Class entityClass, final LockMode lockMode,
Object... ids);
/**
* @todo 通过sql获取单条记录
* @param sqlOrSqlId 直接代码中写的sql或者xml中定义的sql id
* @param paramsNamed
* @param paramsValue
* @param resultType 可以是vo、dto、Map(默认驼峰命名)
* @return
*/
public T loadBySql(final String sqlOrSqlId, final String[] paramsNamed, final Object[] paramsValue,
final Class resultType);
/**
* @TODO 通过map传参模式获取单条对象记录
* @param
* @param sqlOrSqlId 可以直接传sql语句,也可以是xml中定义的sql id
* @param paramsMap
* @param resultType 可以是vo、dto、Map(默认驼峰命名)
* @return
*/
public T loadBySql(final String sqlOrSqlId, final Map paramsMap, final Class resultType);
/**
* @todo 通过对象实体传参数,框架结合sql中的参数名称来映射对象属性取值
* @param sqlOrSqlId
* @param entity
* @return
*/
public T loadBySql(final String sqlOrSqlId, final T entity);
/**
* @TODO 根据QueryExecutor来链式操作灵活定义查询sql、条件、数据源等
* @param query new QueryExecutor(sql).names().values().filters() 链式设置查询
* @return
*/
public Object loadByQuery(final QueryExecutor query);
/**
* @TODO 获取查询结果的第一条、第一列的值,一般用select max(x) from 等
* @param sqlOrSqlId
* @param paramsNamed
* @param paramsValue
* @return
* @see #getSingleValue(String, Map)
*/
@Deprecated
public Object getSingleValue(final String sqlOrSqlId, final String[] paramsNamed, final Object[] paramsValue);
/*
* @see getSingleValue(final String sqlOrSqlId, final String[] paramsNamed,
* final Object[] paramsValue)
*/
public Object getSingleValue(final String sqlOrSqlId, final Map paramsMap);
/**
* @TODO 获取查询结果的第一条、第一列的值,一般用select max(x) from 等
* @param
* @param sqlOrSqlId
* @param paramsMap
* @param resultType
* @return
*/
public T getSingleValue(final String sqlOrSqlId, final Map paramsMap,
final Class resultType);
/**
* @todo 通过Query构造查询条件进行数据查询
* @param query 范例:new QueryExecutor(sql).names(xxx).values(xxx).filters()
* 链式设置查询
* @return
*/
public QueryResult findByQuery(final QueryExecutor query);
/**
* @todo 通过对象传参数,简化paramName[],paramValue[] 模式传参
* @param
* @param sqlOrSqlId 可以是具体sql也可以是对应xml中的sqlId
* @param entity 通过对象传参数,并按对象类型返回结果
* @return
*/
public List findBySql(final String sqlOrSqlId, final T entity);
/**
* @todo 通过给定sql、sql中的参数、参数的数值以及返回结果的对象类型进行条件查询
* @param sqlOrSqlId
* @param paramsNamed 如果sql是select * from table where xxx=?
* 问号传参模式,paramNamed设置为null
* @param paramsValue 对应Named参数的值
* @param resultType 返回结果List中的对象类型(可以是VO、null:表示返回List;HashMap.class(驼峰命名),Array.class
* 返回List
* @param sqlOrSqlId
* @param dataSet 支持List、List(sql中?传参) ;List、List