package com.ag.base;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;

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


/**
 * 使用此接口需遵循一定的规则，规则内容可在SqlUtil中对转表名和转列名做适当的调整。<br/>
 * 该版本示例：对象名：IntegralUser-》表名：c_integral_user<br/>
 * 		字段名：integralTypeId-》列名：integral_type_id<br/>
 * ..另外，java中值类型（int,long,double,flout）!=null，数据库中相应（int,long,decimal）字段不能判断为空，varchar类型不受此影响<br/>
 * ..Java中boolean类型默认值为no，instanceof判断结果为String，请设计为int，便于扩展<br/>
 * 更多内容敬请期待。。。
 * @param <T>
 */
public interface IBaseRepository<T> {
	
	String limit_sql = " limit ?,?";

	JdbcTemplate getJdbcTemplate();
	/**
	 * 保存
	 * @param entity 实体类
	 */
	int save(T entity);
	
	/**
	 * 根据主键修改单个对象
	 * @param entity 主键字段不能空
	 * @param colName 主键列名，例如：type_id
	 */
	int update(T entity, Object... colName);

	int update(T entity, String[] needUpdCol, Object... colName);
	
	/**
	 * 根据主键删除单个对象(update删除字段，非delete语句)
	 * @param entity 主键字段和删除字段的值不能空
	 * @param pkColName 主键列名，例如：type_id
	 * @param deleteColName 需删除的列名，例如deleted，并且属性字段deleted值不能为空
	 */
	int deleteStatus(T entity, String pkColName, String deleteColName);

	/**
	 * delete脚本
	 * @param t
	 * @param colNames
	 * @return
	 */
	//int delete(T t, String pkColName);
	int delete(T t, Object... colNames);
	
	/**
	 * 根据主键查询单个对象
	 * @param entity 主键字段不能空
	 * @param returnType 返回值
	 * @param pkColName 主键列名，例如：type_id
	 */
	T findById(T entity, Class<T> returnType, String pkColName);

	/**
	 * 遍历单对象集合
	 */
	List<T> findAll(Class<T> claz);
	
	int update(String sql, Object... params);
	
	T get(String sql, Class<T> returnType, Object... params)
			throws DataAccessException;

	List<T> list(String sql, Class<T> returnType, Object... params);

	int count(String sql, Object... params);

	/**
	 * 分页查询对象，需要自己拼好sql

	List<T> queryByPage(String sql, Class<T> returnType, Page page);*/
	/**
	 * 支持通配符的分页查询

	List<T> queryByPage(String sql, Class<T> returnType, Page page, Object... params);*/
	/**
	 * 查询单列
	 */
	public List<T> listSingleColumn(String sql, Class<T> returnType, Object... params)
			throws DataAccessException;
	/**
	 * 简单条件查询，自动过滤查询条件为空或空值的字段
	 */
	List<T> findByEqCriteria(T entity, Class<T> returnType, Object... colName);

	int findByCount(T entity, Object... colName);

	//T packPOJO(Map<String, String> map, Class<T> clz);

	String findByEqSql(T entity, Object... colName);

	int[] saveAll(List<T> lst);

	int[] updateAll(List<T> lst, Object... colName);

	int[] updateAll(List<T> lst, String[] needUpdCol, Object... colName);

	//int[] deleteAll(List<T> lst, String pkColName);

	int[] deleteAll(List<T> lst, Object... colNames);

	List<Map<String, Object>> queryForList(String sql, Object... args);

	List<T> findInIds(Class<T> tClz, String ids, String idColName);

	List<T> findByEntity(T entity, Class<T> returnType, boolean isAllTable);

	List<T> findByEntity(T entity, Class<T> returnType);

	String getSelectByEntity(T entity, boolean isAllTable);

}
