package com.elab.core.dao;/**
 * Created by liukx on 2018/1/4.
 */

import com.elab.core.aop.annotations.FieldParam;
import com.elab.core.bean.PageModel;
import com.elab.core.dao.model.ListDynamicSearch;
import org.springframework.jdbc.core.RowMapper;

import java.util.List;
import java.util.Map;

/**
 * 单表公共操作处理
 *
 * @author Liukx
 * @create 2018-01-04 11:18
 * @email liukx@elab-plus.com
 **/
public interface IBaseDaoSupport<T> {

    /**
     * 插入一个对象
     *
     * @param obj 对象内容 必须是构造参数
     * @return
     * @throws Exception
     */
    public int insert(T obj) throws Exception;

    /**
     * 根据主键修改内容
     *
     * @param obj
     * @return
     * @throws Exception
     */
    public int updateById(T obj) throws Exception;

    /**
     * 删除一个对象
     *
     * @param obj
     * @return
     * @throws Exception
     */
    public int delete(T obj) throws Exception;

    /**
     * 查询一个对象
     *
     * @param obj
     * @return
     * @throws Exception
     */
    public T selectByObject(T obj) throws Exception;

    /**
     * 根据主键查询对象
     *
     * @param id
     * @return
     * @throws Exception
     */
    public T selectById(@FieldParam("id") String id) throws Exception;

    /**
     * 查询一个集合,参数可以是任意的
     *
     * @param obj
     * @return
     * @throws Exception
     */
    public List<T> selectByList(T obj) throws Exception;

    /**
     * 查询一个集合，
     *
     * @param obj    相等的参数
     * @param search 其他查询操作
     * @return
     * @throws Exception
     */
    public List<T> selectByList(T obj, ListDynamicSearch search) throws Exception;

    /**
     * 根据查询对象获取总数信息
     *
     * @param obj
     * @param search
     * @return
     * @throws Exception
     */
    public Integer selectByObjectToCount(T obj, ListDynamicSearch search) throws Exception;

    /**
     * 根据查询对象获取总数信息
     *
     * @param obj
     * @return
     * @throws Exception
     */
    public Integer selectByObjectToCount(T obj) throws Exception;


    /**
     * 查询一个分页集合
     *
     * @param pageModel 分页参数
     * @param o         查询字段
     * @return
     * @throws Exception
     */
    public PageModel<T> selectByPage(PageModel pageModel, T o) throws Exception;


    /**
     * 查询一个Mapper对象
     * 功能描述: 查询一个由RowMapper封装的返回结果对象
     * 不调用反射去构建一个Bean对象,把set赋值操作交给用户
     *
     * @param obj
     * @param rowMapper
     * @return
     * @throws Exception
     */
    public List<T> selectByMapper(T obj, RowMapper<T> rowMapper) throws Exception;

    /**
     * 批量添加
     *
     * @param list
     * @return
     */
    public int[] batchInsertByObject(List<T> list);

    /**
     * 批量添加
     *
     * @param list
     * @return
     */
    public int[] batchInsertByMap(List<Map> list);

    /**
     * 根据对象批量修改;
     * <p>这里需要注意的是即便传递进来的是null值也会被应用,最好新写SQL然后再应用。默认的SQL是涵盖所有字段,比如你对象传递,但是创建时间肯定是null的,那么也可能覆盖掉,请谨慎</p>
     *
     * @param list
     * @return
     */
    public int[] batchUpdateByObject(List<T> list);

    /**
     * 根据Map批量修改，
     * <p>这里需要注意的是即便传递进来的值为null也会被应用，最好新写SQL然后再应用。默认的SQL是涵盖所有字段,</p>
     *
     * @param list
     * @return
     */
    public int[] batchUpdateByMap(List<Map> list);

}
