package kernel.web; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.ArrayUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; public class JdbcTemplateWithPaging { private static final Logger logger = LoggerFactory.getLogger(JdbcTemplateWithPaging.class); private JdbcTemplate jdbcTemplate; private NamedParameterJdbcOperations namedParameterJdbcTemplate; public List> queryPage(String sql, Object[] args, int start, int limit) { if ((start <= 0) && (limit <= 0)) { return this.jdbcTemplate.queryForList(sql, args); } if (start <= 1) { sql = getLimitString(sql, false); args = ArrayUtils.add(args, args.length, Integer.valueOf(limit)); } else { sql = getLimitString(sql, true); args = ArrayUtils.add(args, args.length, Integer.valueOf(start + limit)); args = ArrayUtils.add(args, args.length, Integer.valueOf(start)); } logger.info("paging sql : \n" + sql); return this.jdbcTemplate.queryForList(sql, args); } public List> queryPage(String sql, int start, int limit) { Object[] args = new Object[0]; return queryPage(sql, args, start, limit); } public List queryPage(String sql, int start, int limit, RowMapper rowMapper) throws DataAccessException { if ((start <= 0) && (limit <= 0)) { return this.jdbcTemplate.query(sql, rowMapper); } Object[] args = new Object[0]; if (start <= 1) { sql = getLimitString(sql, false); args = ArrayUtils.add(args, args.length, Integer.valueOf(limit)); } else { sql = getLimitString(sql, true); args = ArrayUtils.add(args, args.length, Integer.valueOf(start + limit)); args = ArrayUtils.add(args, args.length, Integer.valueOf(start)); } Pattern pattern = Pattern.compile("\\?"); Matcher matcher = pattern.matcher(sql); for (int i = 0; i < args.length; matcher = pattern.matcher(sql)) { sql = matcher.replaceFirst(args[i].toString()); i++; } logger.info("paging sql : \n" + sql); return this.jdbcTemplate.query(sql, rowMapper); } private String getLimitString(String sql, boolean hasOffset) { sql = sql.trim(); boolean isForUpdate = false; if (sql.toLowerCase().endsWith(" for update")) { sql = sql.substring(0, sql.length() - 11); isForUpdate = true; } StringBuffer pagingSelect = new StringBuffer(sql.length() + 100); if (hasOffset) { pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( "); } else { pagingSelect.append("select * from ( "); } pagingSelect.append(sql); if (hasOffset) { pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?"); } else { pagingSelect.append(" ) where rownum <= ?"); } if (isForUpdate) { pagingSelect.append(" for update"); } return pagingSelect.toString(); } public int queryCountBySql(String sqlStr) { return ((Integer) this.jdbcTemplate.queryForObject(sqlStr, Integer.class)).intValue(); } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } }