package org.easyframe.enterprise.spring; import java.io.Serializable; import java.sql.SQLException; import java.util.List; import java.util.Map; import jef.common.wrapper.Page; import jef.database.IQueryableEntity; import jef.database.NamedQueryConfig; import jef.database.NativeQuery; import jef.database.RecordHolder; import jef.database.RecordsHolder; /** * 泛型的通用Dao子类必须实现泛型 * * @author Administrator * * @param <T> */ public interface GenericDao<T extends IQueryableEntity> { /** * 插入一条记录(无级联操作) * * @param entity * 要插入数据库的对象 * @return 被插入数据库的对象 */ public T insert(T entity); /** * 插入记录(带级联操作) * * @param entity * 要插入数据库的对象 * @return 被插入数据库对象 */ public T insertCascade(T entity); /** * 更新记录(无级联) * * @param entity * 要更新的对象模板 * @return 影响记录行数 */ public int update(T entity); /** * 更新记录 * * @param entity * 要更新的对象模板 * @return 影响记录行数 */ public int updateCascade(T entity); /** * 删除记录(注意,根据入参Query中的条件可以删除多条记录) 无级联操作 ,如果要使用带级联操作的remove方法,可以使用 * {@link #removeCascade} * * @param entity * 要删除的对象模板 * @return 影响记录行数 */ public int remove(T entity); /** * 删除记录(注意,根据入参Query中的条件可以删除多条记录) * * @param entity * 要删除的对象模板 * @return 影响记录行数 */ public int removeCascade(T entity); /** * 持久化一条记录,(如果记录存在则update,否则执行insert) * * @param entity * 要写入数据库的对象 * @return 被写入的数据库的对象 */ public T merge(T entity); /** * 载入一条记录(无级联) * * @param entity * 查询对象模板 * @param unique * 是否要求结果唯一 * @return 查询结果 */ public T load(T entity, boolean unique); /** * 载入一条记录(带级联) * * @param entity * 查询对象模板 * @param unique * 是否要求结果唯一 * @return 查询结果 * @since 1.7.0 * */ public T loadCascade(T entity, boolean unique); /** * 根据示例的对象删除记录 * * @param entity * 删除的对象模板 * @return 影响记录行数 */ public int removeByExample(T entity); /** * 当确定主键为单对象时,根据主键加载一个对象 * * @param key * 主键 * @return 根据主键加载的记录 */ public T get(Serializable key); /** * 查找记录(不带级联) * * @param Entity * 查询对象模板 * @return 查询结果 */ public List<T> find(T Entity); /** * 查找记录(带级联) * * @param Entity * 查询对象模板 * @return 查询结果 */ public List<T> findCascade(T Entity); /** * 得到整张表的全部数据。(单表操作,不带级联) * * @return 查询结果 */ public List<T> getAll(); /** * 根据设置过值的字段进行查找 * * @param entity * 查询的对象模板 * @return 查询结果 */ public List<T> findByExample(T entity); /** * 查找记录 * * @param query * 查询请求 * @return 查询结果 */ public List<T> find(jef.database.query.Query<T> query); /** * 使用指定的SQL查找记录,此方法支持绑定变量,可以在SQL中使用 ?1 ?2的格式指定变量,并在param中输入实际参数 * * @param entity * 返回结果类型 * @param query * E-SQL,变量必须以 ?1 ?2等形式写入 * @param param * 绑定变量 * @return */ public List<T> find(Class<T> entity, String query, Object... param); /** * 查找并分页(不带级联) * * @param entity * 返回结果类型 * @param start * 分页开始记录,第一条记录从0开始 * @param limit * 每页的大小 * @return 查询结果的当页数据 * @see Page */ public Page<T> findAndPage(T entity, int start, int limit); /** * 查找并分页(带级联) * * @param entity * 返回结果类型 * @param start * 开始记录数,第一条记录从0开始 * @param limit * 每页的大小 * @return 查询结果的当页数据 * @see Page */ public Page<T> findAndPageCascade(T entity, int start, int limit); /** * 批量插入 * * @param entities * 要插入的对象列表 * @return 影响记录条数 */ public int batchInsert(List<T> entities); /** * 批量插入 * * @param entities * 要插入的对象列表 * @param doGroup * 是否对每条记录重新分组。 * {@linkplain jef.database.Batch#isGroupForPartitionTable * 什么是重新分组} * @return 影响记录条数 */ public int batchInsert(List<T> entities, boolean doGroup); /** * 批量删除 * * @param entities * 要删除的对象列表 * @return 影响的记录条数 */ public int batchRemove(List<T> entities); /** * 批量删除 * * @param entities * 要删除的对象列表 * @param doGroup * 是否对每条记录重新分组。 * {@linkplain jef.database.Batch#isGroupForPartitionTable * 什么是重新分组} * @return 影响的记录条数 */ public int batchRemove(List<T> entities, boolean doGroup); /** * 批量(按主键)更新 * * @param entities * 要更新的记录 * @return 影响的记录条数 */ public int batchUpdate(List<T> entities); /** * 批量(按主键)更新 * * @param entities * 要更新的记录 * @param doGroup * 是否对每条记录重新分组。 * {@linkplain jef.database.Batch#isGroupForPartitionTable * 什么是重新分组} * @return 影响的记录条数 */ public int batchUpdate(List<T> entities, boolean doGroup); /** * 使用命名查询查找. {@linkplain NamedQueryConfig 什么是命名查询} * * @param nqName * 命名查询的名称 * @param param * 绑定变量参数 * @return 查询结果 */ public List<T> findByNq(String nqName, Map<String, Object> param); /** * 使用命名查询查找并分页. {@linkplain NamedQueryConfig 什么是命名查询} * * @param nqName * 命名查询的名称 * @param param * 绑定变量参数 * @param start * 开始记录数,第一条记录从0开始 * @param limit * 每页的大小 * @return 查询结果 * @see Page */ public Page<T> findAndPageByNq(String nqName, Map<String, Object> param, int start, int limit); /** * 执行命名查询. {@linkplain NamedQueryConfig 什么是命名查询} * * @param nqName * 命名查询的名称 * @param param * 绑定变量参数 * @return 影响记录行数 */ public int executeNq(String nqName, Map<String, Object> param); /** * 执行指定的SQL语句 这里的Query可以是insert或update,或者其他DML语句 * * @param sql * SQL语句,可使用 {@linkplain NativeQuery 增强的SQL (参见什么是E-SQL条目)}。 * @param param * 绑定变量参数 * @return 影响记录行数 */ public int executeQuery(String sql, Map<String, Object> param); /** * 根据指定的SQL查找 * * @param sql * SQL语句,可使用 {@linkplain NativeQuery 增强的SQL (参见什么是E-SQL条目)}。 * @param param * 绑定变量参数 * @return 查询结果 */ public List<T> findByQuery(String sql, Map<String, Object> param); /** * 根据单个的字段条件查找结果(仅返回第一条) * * @param field * 条件字段名 * @param value * 条件字段值 * @return 符合条件的结果。如果查询到多条记录,也只返回第一条 */ public T loadByField(String field, Serializable value, boolean unique); /** * 根据单个的字段条件查找结果 * * @param field * 条件字段名 * @param value * 条件字段值 * @return 符合条件的结果 */ public List<T> findByField(String field, Serializable value); /** * 根据单个的字段条件删除记录 * * @param field * 条件字段名 * @param value * 条件字段值 * @return 删除的记录数 */ public int deleteByField(String field, Serializable value); /** * 按个主键的值读取记录 (只支持单主键,不支持复合主键) * * @param pkValues * @return */ public List<T> batchLoad(List<? extends Serializable> pkValues); /** * 按主键批量删除 (只支持单主键,不支持复合主键) * * @param pkValues * @return */ public int batchDelete(List<? extends Serializable> pkValues); /** * 根据单个字段的值读取记录(批量) * * @param field * 条件字段 * @param values * 查询条件的值 * @return 符合条件的记录 */ public List<T> batchLoadByField(String field, List<? extends Serializable> values); /** * 根据单个字段的值删除记录(批量) * * @param field * @param values * @return */ public int batchDeleteByField(String field, List<? extends Serializable> values); /** * 返回一个可以更新操作的结果数据集合 实质对用JDBC中ResultSet的updateRow,deleteRow,insertRow等方法, <br> * 该操作模型需要持有ResultSet对象,因此注意使用完毕后要close()方法关闭结果集<br> * * RecordsHolder可以对选择出来结果集进行更新、删除、新增三种操作,操作完成后调用commit方法<br> * * @param obj * 查询请求 * @return RecordsHolder对象,这是一个可供操作的数据库结果集句柄。注意使用完后一定要关闭。 * @throws SQLException * 如果数据库操作错误,抛出。 * @see RecordsHolder */ RecordsHolder<T> selectForUpdate(T query); /** * 返回一个可以更新操作的结果数据{@link RecordHolder}<br> * 用户可以在这个RecordHolder上直接更新数据库中的数据,包括插入记录和删除记录<br> * * <h3>实现原理</h3> RecordHolder对象,是JDBC ResultSet的封装<br> * 实质对用JDBC中ResultSet的updateRow,deleteRow,insertRow等方法,<br> * 该操作模型需要持有ResultSet对象,因此注意使用完毕后要close()方法关闭结果集。 <h3>注意事项</h3> * RecordHolder对象需要手动关闭。如果不关闭将造成数据库游标泄露。 <h3>使用示例</h3> * * * @param obj * 查询对象 * @return 查询结果被放在RecordHolder对象中,用户可以直接在查询结果上修改数据。最后调用 * {@link RecordHolder#commit}方法提交到数据库。 * @throws SQLException * 如果数据库操作错误,抛出。 * @see RecordHolder */ RecordHolder<T> loadForUpdate(T obj); }