package com.yonge.toolset.mybatis.service;

/**
 * GenericService.java 
 * Copyright © 2015-2015
 * 
 * @author pengdc
 * @create 2015年7月13日
 */

import com.yonge.toolset.base.page.PageInfo;
import com.yonge.toolset.base.page.QueryInfo;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface BaseService<PK extends Serializable, T> {
	/**
	 * 通过主键id获取对象
	 * @author pengdc
	 * @param id
	 * @return T
	 */
	public T get(final PK id);

	/**
	 * 更新实体对象
	 * @author pengdc
	 * @param bean
	 * @return int
	 */
	public int update(T bean);

	/**
	 * 通过主键id删除对象
	 * @author pengdc
	 * @param id
	 * @return int
	 */
	public int delete(final PK id);

    /**
     * 删除对象
     * @param bean
     * @return
     */
    public int delete(T bean);

	/**
	 * 写入实体对象
	 * @author pengdc
	 * @param bean
	 * @return int
	 */
	public long insert(T bean);

	/**
	 * 通过参数查找所有结果集
	 * @author pengdc
	 * @param params
	 * @return
	 */
	public List<T> findAll(Map<String, Object> params);

    /**
     * 通过对象信息查找结果集，也适合分页场景
     * @param entity
     * @return
     */
    public List<T> findList(T entity);

	/**
	 * 通过参数查找结果集，适合分页场景
	 * @author pengdc
	 * @param params
	 * @return
	 */
	public PageInfo<T> queryPage(QueryInfo params);

	/**
	 * 通过参数查找结果集数目
	 * @author pengdc
	 * @param params
	 * @return
	 */
	public int findCount(Map<String, Object> params);

	/**
	 * @describe 获取columnKey-columnValue集合
	 * @author Joburgess
	 * @date 2020.06.23
	 * @param columnKey: key所对应的列名
	 * @param columnValue: value所对应的列名
	 * @param ids: key条件
	 * @return java.util.List<java.util.Map>
	 */
	<K extends Collection, Y, Z> Map<Y,Z> getMap(String tableName, String columnKey, String columnValue, K ids, Integer tenantId, Class<Y> keyType, Class<Z> valueType);

	/**
	 * @describe 获取columnKey-columnValue集合
	 * @author Joburgess
	 * @date 2020.06.23
	 * @param columnKey: key所对应的列名
	 * @param columnValue: value所对应的列名
	 * @param ids: key条件
	 * @return java.util.List<java.util.Map>
	 */
	<K extends List, Y, Z> Map<Y,Z> getMap(String tableName, String columnKey, String columnValue, String ids, Class<Y> keyType, Class<Z> valueType);

	/**
	 * @describe 获取columnKey-columnValue集合
	 * @author Joburgess
	 * @date 2020.06.23
	 * @param columnKey: key所对应的列名
	 * @param columnValue: value所对应的列名
	 * @return java.util.List<java.util.Map>
	 */
	<K extends List, Y, Z> Map<Y,Z> getMap(String tableName, String columnKey, String columnValue, Boolean hasDelFlag, Integer tenantId, Class<Y> keyType, Class<Z> valueType);


}
