package com.pj.project4sp.public4mapper;

import com.pj.utils.so.SoMap;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 公用Mapper，封装一些常见的Mapper操作，避免某些及其简单的逻辑也要写一堆xml方法
 * @author kong
 * 更新于2020-12-1 新增部分方法 
 *
 */
@Mapper
public interface PublicMapper {

	
	// ------------------------ 一些工具方法 ------------------------

	/**
	 * 返回上一句SQL插入的自增主键值 
	 * @return
	 */
	public long getPrimarykey();

	
	// ------------------------ 新增SQL相关 ------------------------

	
	// ------------------------ 删除SQL相关 ------------------------

	/**
	 * 根据id删除一条记录 
	 * @param tableName 表名字 
	 * @param id id值
	 * @return
	 */
	public int deleteById(
            @Param("tableName") String tableName,
            @Param("id") Object id
    );

	/**
	 * 根据指定列指定值删除一条记录
	 * @param tableName 表名
	 * @param whereName 条件列
	 * @param whereValue 条件列值
	 * @return
	 */
	public int deleteBy(
            @Param("tableName") String tableName,
            @Param("whereName") String whereName,
            @Param("whereValue") Object whereValue
    );

	/**
	 * 根据id列表批量删除
	 * @param tableName 表名字
	 * @param ids id列表
	 * @return
	 */
	public int deleteByIds(
            @Param("tableName") String tableName,
            @Param("ids") List<?> ids
    );

	/**
	 * 根据指定列指定值删除多条记录
	 * @param tableName 表名
	 * @param whereName 条件列名
	 * @param whereList 条件列值
	 * @return
	 */
	public int deleteByWhereList(
            @Param("tableName") String tableName,
            @Param("whereName") String whereName,
            @Param("whereList") List<?> whereList
    );


	// ------------------------ 修改SQL相关 ------------------------

	/**
	 * 指定表的指定字段增加指定值，可以为负值
	 * @param tableName 表名字
	 * @param columnName 列值
	 * @param num 增加的值
	 * @param id id值
	 * @return
	 */
	public int columnAdd(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("num") long num,
            @Param("id") Object id
    );

	/**
	 * 指定表的指定字段增加指定值，可以为负值
	 * @param tableName 表名字
	 * @param columnName 列名字
	 * @param num 增加的值
	 * @param ids id列表
	 * @return
	 */
	public int columnAddByIds(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("num") long num,
            @Param("ids") List<?> ids
    );

	/**
	 * 指定表的指定字段更新为指定值,根据指定id
	 * @param tableName 表名子
	 * @param columnName 列名
	 * @param value 值
	 * @param id id值
	 * @return
	 */
	public int updateColumnById(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("value") Object value,
            @Param("id") Object id
    );

	/**
	 * 指定表的指定字段更新为指定值,根据指定id列表
	 * @param tableName 表名子
	 * @param columnName 列名
	 * @param value 值
	 * @param ids id值
	 * @return
	 */
	public int updateColumnByIds(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("value") Object value,
            @Param("ids") List<?> ids
    );

	/**
	 * 指定表的指定字段更新为指定值, 根据指定列的指定值
	 * @param tableName 表名
	 * @param columnName 列名
	 * @param columnValue 列值
	 * @param whereName 条件列名
	 * @param whereValue 条件列值
	 * @return
	 */
	public int updateColumnBy(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("columnValue") Object columnValue,
            @Param("whereName") String whereName,
            @Param("whereValue") Object whereValue
    );

	/**
	 * 指定表的指定字段SoMap集合更新为指定值,根据指定id
	 * @param tableName 表名
	 * @param soMap 要修改的列
	 * @param id id值
	 * @return
	 */
	public int updateBySoMapById(
            @Param("tableName") String tableName,
            @Param("soMap") SoMap soMap,
            @Param("id") Object id
    );

	/**
	 * 指定表的指定字段SoMap集合更新为指定值,指定列的指定值
	 * @param tableName 表名子
	 * @param soMap 要修改的列
	 * @param whereName 条件列值
	 * @param whereValue 条件列值
	 * @return
	 */
	public int updateBySoMapBy(
            @Param("tableName") String tableName,
            @Param("soMap") SoMap soMap,
            @Param("whereName") String whereName,
            @Param("whereValue") Object whereValue
    );


	// ------------------------ 查询SQL相关 ------------------------

	/**
	 * 获取指定表的指定字段值,根据id值
	 * @param tableName 表名
	 * @param columnName 列名
	 * @param id id值
	 * @return
	 */
	public String getColumnById(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("id") Object id
    );

	/**
	 * 获取指定表的指定字段值,并转化为long,根据id值
	 * @param tableName 表名
	 * @param columnName 列名
	 * @param id id值
	 * @return
	 */
	public long getColumnByIdToLong(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("id") Object id
    );

	/**
	 * 获取指定表的指定字段值,根据指定条件(whereName=whereValue)
	 * @param tableName 表名
	 * @param columnName 列名
	 * @param whereName 条件列名
	 * @param whereValue 条件列值
	 * @return
	 */
	public String getColumnByWhere(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("whereName") String whereName,
            @Param("whereValue") Object whereValue
    );

	/**
	 * 获取指定表的指定字段值列表,并转化为long, 根据指定条件(whereName=whereValue)
	 * @param tableName 表名
	 * @param columnName 列名
	 * @param whereName 条件列名
	 * @param whereValue 条件列值
	 * @return
	 */
	public List<Long> getColumnListToLongByWhere(
            @Param("tableName") String tableName,
            @Param("columnName") String columnName,
            @Param("whereName") String whereName,
            @Param("whereValue") Object whereValue
    );

	/**
	 * 获取指定表的count数据,根据指定条件(whereName=whereValue)
	 * @param tableName 表名
	 * @param whereName 条件列名
	 * @param whereValue 条件列值
	 * @return
	 */
	public long getCountBy(
            @Param("tableName") String tableName,
            @Param("whereName") String whereName,
            @Param("whereValue") Object whereValue
    );

	// ------------------------ 查询集合SQL相关 ------------------------

	/**
	 * 获取指定表的全部字段全部数据转化为Map
	 * @param tableName 表名子
	 * @return
	 */
	public List<SoMap> getListMap(@Param("tableName") String tableName);

	/**
	 * 获取指定表的全部字段全部数据转化为Map, 根据指定条件(whereName=whereValue)
	 * @param tableName 表名字
	 * @param whereName 条件列名
	 * @param whereValue 条件列值
	 * @return
	 */
	public List<SoMap> getListMapByWhere(
            @Param("tableName") String tableName,
            @Param("whereName") String whereName,
            @Param("whereValue") Object whereValue
    );

	/**
	 * 获取指定表的全部字段全部数据转化为Map, 根据指定条件(id=id)
	 * @param tableName 表名子
	 * @param id id值
	 * @return
	 */
	public List<SoMap> getListMapById(
            @Param("tableName") String tableName,
            @Param("id") Object id
    );

	
}
