package cn.iocoder.yudao.framework.common.base;

import cn.iocoder.yudao.framework.common.util.page.PageHelper;
import java.util.List;
import java.util.Map;

/**
 * 功能描述: IService 层 基础接口，其他 Service 接口 请继承该接口
 * <p>
 * 作者: July
 * 日期: 2020-09-16 18:57
 * @author Administrator
 */
public interface IService<T> {
    /**
     * 保存一个实体，null的属性也会保存，不会使用数据库默认值
     * @param entity
     * @return
     */
    int save(T entity);

    /**
     * 批量插入，支持批量插入的数据库可以使用，例如MySQL,H2等，另外该接口限制实体包含`id`属性并且必须为自增列
     * @param list
     * @return
     */
    int save(List<T> list);

    /**
     * 批量插入，支持批量插入的数据库可以使用，例如MySQL,H2等，另外该接口限制实体包含`id`属性并且必须为自增列
     * @param list
     * @return
     */
    int batchSave(List<T> list);

    /***
     * 保存一个实体，null的属性不会保存，会使用数据库默认值
     * @param entity
     * @return
     */
    int saveNotNull(T entity);

    /****
     * 根据主键字段进行删除，方法参数必须包含完整的主键属性
     * @param key
     * @return
     */
    int deleteByKey(Object key);

    /****
     * 根据主键字符串进行删除，类中只有存在一个带有@Id注解的字段
     * @param ids
     * @return
     */
    int deleteByIds(String ids);

    /***
     * 根据主键字符串进行删除，类中只有存在一个带有@Id注解的字段
     * @param ids
     * @return
     */
    int deleteByIds(Object[] ids);

    /***
     * 删除数据
     * @param month
     * @return
     */
    Long clean(Integer month);

    /***
     * 根据主键更新实体全部字段，null值会被更新
     * @param entity
     * @return
     */
    int update(T entity);

    /****
     * 根据主键更新属性不为null的值
     * @param entity
     * @return
     */
    int updateNotNull(T entity);

    /***
     * 批量根据主键更新属性不为null的值
     * @param list
     * @return
     */
    int batchUpdate(List<T> list);

    /***
     * 批量更新部分信息 Mapper 需要自己实现
     * @param list
     * @return
     */
    int batch(List<T> list);

    /***
     * 根据主键字段进行查询，方法参数必须包含完整的主键属性，查询条件使用等号
     * @param key
     * @return
     */
    T selectByKey(Object key);

    /****
     * 查询所有
     * @param entity
     * @return
     */
    List<T> select(T entity);

    /****
     * 查询所有
     * @param entity
     * @return
     */
    T selectOne(T entity);

    /****
     * 查询所有
     * @param entity
     * @return
     */
    T selectOneByExample(T entity);

    /***
     * 查询所有
     * @return
     */
    List<T> selectAll();

    /***
     * 根据主键字符串进行查询，类中只有存在一个带有@Id注解的字段
     * @param ids
     * @return
     */
    List<T> selectByIds(String ids);

    /***
     * 根据主键字符串进行查询，类中只有存在一个带有@Id注解的字段
     * @param ids
     * @return
     */
    List<T> selectByIds(Object[] ids);

    /***
     * 根据主键字符串进行查询，类中只有存在一个带有@Id注解的字段
     * @param ids
     * @return
     */
    List<T> selectByIds(List<Long> ids);

    /***
     * 根据Example条件进行查询
     * @param example
     * @return
     */
    List<T> selectByExample(Object example);

    /***
     * 根据Example条件删除数据
     * @param example
     * @return
     */
    int deleteByExample(Object example);

    /***
     * 根据Example条件分页
     * @param params
     * @return
     */
    PageHelper<T> queryPageList(Map<String, Object> params);

    /***
     * 根据Example条件分页
     * @param params
     * @param alias
     * @return
     */
    PageHelper<T> queryPageList(Map<String, Object> params, String alias);

    /***
     * 根据Example条件分页
     * @param params
     * @return
     */
    List<T> queryPage(Map<String, Object> params);

    /***
     * 根据Example条件分页
     * @param params
     * @return
     */
    List<T> pageList(Map<String, Object> params);

    /***
     * 根据Example条件分页
     * @param params
     * @param alias
     * @return
     */
    List<T> pageList(Map<String, Object> params, String alias);

    /***
     * 处理分页查询参数
     * @param params
     */
    void handlePageParam(Map<String, Object> params);

    /***
     * 处理分页查询参数
     * @param list
     */
    void handlePageData(List<T> list);
}
