package org.sothis.dal;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import org.sothis.core.util.Cursor;
import org.sothis.core.util.Pager;
import org.sothis.dal.query.Chain;
import org.sothis.dal.query.Cnd;
/**
* 数据库访问接口。定义了数据库访问的常用方法。
*
* @author velna
*
* @param <E>
* @param <K>
*/
public interface Dao<E extends Entity, K extends Serializable> {
/**
* 返回本DAO对应的数据库实体类
*
* @return
*/
Class<E> getEntityClass();
/**
* 根据条件查询数据库,并返回一个列表。<br>
* {@code dao.find(Cnd.make("age", 22).asc("id"), Pager.make(0, 10), Chain.make("username").add("gender"));}
* <br>
* 相当于select username, gender from mytable where age=22 order by id asc
* limit 0, 10
*
* @param cnd
* 查询条件
* @param pager
* 分页,如果为null则返回所有数据记录
* @param fields
* 需要返回的字段集,如果为null则查询所有字段
* @return
*/
List<E> find(Cnd cnd, Pager pager, Chain fields);
/**
* 相当于{@code find(cnd, pager, fields)}<br>
* {@code pager.setTotalRows(count(cnd))}
*
* @param cnd
* @param pager
* @param fields
* @return
*/
List<E> findAndCount(Cnd cnd, Pager pager, Chain fields);
/**
* 相当于{@code find(cnd, pager, null)}<br>
* {@code pager.setTotalRows(count(cnd))}
*
* @param cnd
* @param pager
* @return
*/
List<E> findAndCount(Cnd cnd, Pager pager);
/**
* 相当于{@code find(cnd, pager, null)}
*
* @param cnd
* @param pager
* @return
*/
List<E> find(Cnd cnd, Pager pager);
/**
* 相当于{@code find(cnd, null, null)}
*
* @param cnd
* @return
*/
List<E> find(Cnd cnd);
/**
* 以迭代方式查询。
*
* @param cnd
* @param fields
* @return
*/
Cursor<E> cursor(Cnd cnd, Chain fields);
/**
* 相当于{@code find(cnd, Pager.make(0,1), fields)}
*
* @param cnd
* @param fields
* @return
*/
E findOne(Cnd cnd, Chain fields);
/**
* 相当于{@code find(cnd, Pager.make(0,1), null)}
*
* @param cnd
* @return
*/
E findOne(Cnd cnd);
/**
* 根据id查找对象
*
* @param id
* @return
*/
E findById(K id);
/**
* 根据id列表查找所有对象,返回的列表根据传入的idList排序
*
* @param idList
* @return
*/
List<E> findByIds(Collection<K> idList);
/**
* 根据查询条件{@code cnd}更新数据库。<br>
* {@code dao.update(Cnd.make("age", 24), Chain.make("age", 23));}<br>
* 相当于:update mytable set age=23 where age=24
*
* @param cnd
* @param update
* @return 受影响的记录数
*/
int update(Cnd cnd, Chain update);
/**
* 根据id更新数据<br>
*
* @param id
* @param update
* @return
*/
int updateById(K id, Chain update);
/**
* 根据主键将实体类中的所有字段更新入数据库中。
*
* @param entity
* @return 受影响的记录数
*/
E update(E entity);
/**
* 根据查询条件删除记录。
*
* @param cnd
* @return 受影响的记录数
*/
int delete(Cnd cnd);
/**
* 根据id删除一条数据
*
* @param id
* @return 受影响的记录数
*/
int deleteById(K id);
/**
* 根据id列表删除一批数据
*
* @param idList
* @return 受影响的记录数
*/
int deleteByIds(List<K> idList);
/**
* 插入一条记录。
*
* @param entity
* @return
*/
E insert(E entity);
/**
* 批量插入
*
* @param entityList
* @return
*/
List<E> insert(List<E> entityList);
/**
* 得到数据表的所有记录条数。
*
* @return
*/
int count();
/**
* 根据查询条件得到满足该条件的记录数。
*
* @param cnd
* @return
*/
int count(Cnd cnd);
}