package com.ycsoft.daos.core.impl; import static com.ycsoft.commons.helper.LoggerHelper.debug; import static com.ycsoft.commons.helper.LoggerHelper.isDebugEnabled; import java.util.List; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowMapper; import com.ycsoft.daos.core.AbstractQuery; import com.ycsoft.daos.core.JDBCException; import com.ycsoft.daos.core.generator.SQLGenerator; /** * <p> 执行查询的核心类,主要将查询的结果封装至实体Bean中, * 支持分页查询。</p> * @see com.ycsoft.daos.core.mapper.EntityMapper * @see com.ycsoft.daos.core.impl.SQLQueryImpl * @author hh */ public class QueryImpl<T> extends AbstractQuery<T> { private RowMapper<T> mapper; /** * <p> 构造函数初始化SQL,及相关参数 </p> * @param sql * @param params */ public QueryImpl( Class<T> entity , JdbcTemplate jdbcTemplate, SQLGenerator sqlGenerator, String sql, Object...params){ super(jdbcTemplate,sqlGenerator,sql,params); this.mapper = ParameterizedBeanPropertyRowMapper.newInstance( entity ); } private void outPrintSql(int resultSize) { if (isDebugEnabled(getClass())) { StringBuffer p = new StringBuffer(); p.append("query result ").append(resultSize).append(" "); p.append(sql); if (params.length > 0) { p.append("{"); for (Object s : params) { p.append(s).append(","); } p.append("}"); } debug(getClass(), p.toString()); } } /** * 重载一个构造参数可传入自定义Mapper的查询器 * @param mapper * @param jdbcTemplate * @param sqlGenerator * @param sql * @param params */ public QueryImpl( RowMapper<T> mapper, JdbcTemplate jdbcTemplate, SQLGenerator sqlGenerator, String sql, Object...params){ super(jdbcTemplate,sqlGenerator,sql,params); this.mapper = mapper; } /** * <p> 根据所传递的SQL命令,查询结果,结果集将被封装至实体对象中。 </p> */ public List<T> list() throws JDBCException { List<T> result = jdbcTemplate.query(sql, params, this.mapper); outPrintSql(result.size()); return result; } public T first() throws JDBCException { List<T> result = jdbcTemplate.query(sql, params, this.mapper); outPrintSql(result.size()); return result.size() == 0 ? null : result.get(0); } }