package com.ycsoft.daos.core; import org.springframework.jdbc.core.JdbcTemplate; import com.ycsoft.daos.core.generator.SQLGenerator; /** * <p> 抽象的查询接口类 </p> * @author hh * @param <T> 实体对象 */ public abstract class AbstractQuery<T> implements Query<T> { protected String sql ; protected Object[] params ; protected SQLGenerator sqlGenerator ; protected JdbcTemplate jdbcTemplate ; //开始位置, private Integer start ; //显示的条数 private Integer limit ; public AbstractQuery(){ } /** * <p> 构造函数初始化SQL,及相关参数 </p> * @param sql * @param params */ public AbstractQuery( JdbcTemplate jdbcTemplate, SQLGenerator sqlGenerator, String sql, Object...params){ this.jdbcTemplate = jdbcTemplate; this.sqlGenerator = sqlGenerator; this.sql = sql ; this.params = params; } public String getSql() { return sql; } public Query<T> setSql(String sql) { this.sql = sql; return this; } public Object[] getParams() { return params; } public Query<T> setParams(Object[] params) { this.params = params; return this; } public Integer getStart() { return start; } public Query<T> setStart(Integer start) { this.start = start; return this; } public Integer getLimit() { return limit; } public Query<T> setLimit(Integer limit) { this.limit = limit; return this; } /** * 根据当前实例对象的参数值,如<code>start、limit</code>值, * 判断是否需要分页查询,如果两个值均不为NULL,则返回格式化后(分页信息)的SQL命令。 * 否则返回当前的SQL * @return */ protected String getPageSQL(){ if(isPage()) return sqlGenerator.getPage(sql, start, limit); return sql ; } /** * <p> 获得当前结果集的条数。如果是分页那么现实的就是总函数 </p> * @throws JDBCException */ public int count()throws JDBCException{ return jdbcTemplate.queryForInt(sqlGenerator.getPageCount(sql),params); } /** * <p>根据<code>start、limit</code>判断是否需要进行分页! * <tt>true</tt> is need ,<tt>false</tt> isn't need. * </p> */ protected boolean isPage(){ return null!=start && null!=limit; } /** * <p> 分页查询,通过设置<code>start、limit</code>两个属性的值。进行分页查询, * 如果没有设置相关属性的参数值,将同<code>list</code>函数的效果是一直的。 * </p> */ public Pager<T> page() throws JDBCException { if(false == isPage()) return new Pager<T>(list(),null); int total = count() ; sql = this.getPageSQL(); return new Pager<T>(list(),total); } }