package com.pcloud.common.core.dao;

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

import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;

import com.pcloud.common.page.PageBean;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.page.PageParam;

/**
 * @描述：数据访问层基础支撑接口. @作者：DiSeng.H
 * @创建时间：2016年3月11日,下午4:02:32 @版本：1.0
 */
public interface BaseDao<T> {

    /**
     * 根据实体对象新增记录.
     *
     * @param entity .
     * @return id .
     */
    long insert(T entity);

    /**
     * 批量保存对象.
     *
     * @param entity .
     * @return id .
     */
    long insert(List<T> list);

    /**
     * 更新实体对应的记录.
     *
     * @param entity .
     * @return
     */
    long update(T entity);

    /**
     * 更新实体对应的记录.
     *
     * @param entity
     * @param sqlId
     * @return
     */
    long update(T entity, String sqlId);

    /**
     * 更新实体对应的记录.
     *
     * @param entity
     * @param sqlId
     * @param errorMessage 错误消息
     * @return
     */
    long update(T entity, String sqlId, String errorMessage);

    /**
     * 批量更新对象.
     *
     * @param entity .
     * @return int .
     */
    long update(List<T> list);

    /**
     * 根据ID查找记录.
     *
     * @param id .
     * @return entity .
     */
    T getById(long id);

    /**
     * 根据ID删除记录.
     *
     * @param id .
     * @return
     */
    long deleteById(long id);

    /**
     * 分页查询 .
     *
     * @param pageParam 分页参数.
     * @param paramMap  业务条件查询参数.
     * @return
     */
    PageBean listPage(PageParam pageParam, Map<String, Object> paramMap);

    PageBean listSimplePage(PageParam pageParam, Map<String, Object> paramMap, String sqlId);

    PageBean listPage(PageParam pageParam, Map<String, Object> paramMap, String sqlId);

    <C> PageBeanNew<C> listPageNew(PageParam pageParam, Map<String, Object> paramMap, String sqlId);

    PageBean listPage(PageParam pageParam, Map<String, Object> paramMap, String sqlId, String countSqlId);

    /**
     * 根据条件查询 listBy: <br/>
     *
     * @param paramMap
     * @return 返回集合
     */
    List<T> listBy(Map<String, Object> paramMap);

    List<Object> listBy(Map<String, Object> paramMap, String sqlId);

    /**
     * 根据条件查询 listBy: <br/>
     *
     * @param paramMap
     * @return 返回实体
     */
    T getBy(Map<String, Object> paramMap);

    Object getBy(Map<String, Object> paramMap, String sqlId);

    /**
     * 根据序列名称获取下一个值
     *
     * @return
     */
    String getSeqNextValue(String seqName);

    SqlSessionTemplate getSessionTemplate();

    SqlSession getSqlSession();
}
