最近项目中使用到了JBDCTemplate ,小弟不才,没发现其中包括分页的功能,只好自己做了一个简单的分页功能。下面把心得和源代码分享给大家。
用到了2个类,都是封装好的,如下:
1.page类
用于分页的对象,算是BO了,不只是简单的封装Page的属性,还做了一点点逻辑
/**
*
*/
package com.hipay.bo;
import java.util.ArrayList;
import java.util.List;
/**
* @author TonyDev
*
*/
public class Page {
private int pageCount=1;
private int currentPage=1;
private int pageSize=10;
private int maxPage=1;
private List resultSet=new ArrayList();
public int getCurrentPage() {
checkPage();
return currentPage;
}
private void initMaxPage()
{
this.maxPage = (this.pageCount + this.pageSize - 1) / this.pageSize;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getMaxPage() {
return this.maxPage;
}
public void setMaxPage(int maxPage) {
this.maxPage = maxPage;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
initMaxPage();
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public List getResultSet() {
return resultSet;
}
public void setResultSet(List resultSet) {
this.resultSet = resultSet;
}
private void checkPage()
{
if(this.currentPage<1)
this.currentPage=1;
if(this.currentPage>this.maxPage)
this.currentPage=this.maxPage;
}
}
2.PageTemplate
用于分离出ResultSet,并装载Page对象
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SqlProvider;
import org.springframework.jdbc.core.StatementCallback;
import org.springframework.jdbc.support.JdbcUtils;
import org.springframework.util.Assert;
/**
* @author TonyDev
*
*/
public class PageTemplate extends JdbcTemplate {
private Page page = new Page();
public List queryForPage(final String sql, final RowMapper rowMapper)
throws DataAccessException {
Assert.notNull(sql, "SQL must not be null");
if (logger.isDebugEnabled()) {
logger.debug("Executing SQL query [" + sql + "]");
}
// 重新构造的statementCallback实现
class QueryStatementCallback implements StatementCallback, SqlProvider {
public Object doInStatement(Statement stmt) throws SQLException {
ResultSet rs = null;
try {
rs = stmt.executeQuery(sql);
return ResultSetForList(rs, rowMapper);
} finally {
JdbcUtils.closeResultSet(rs);
}
}
public String getSql() {
return sql;
}
}
return (List) execute(new QueryStatementCallback());
}
/**
* 分页之后,填充到以对象形式存储的List 中
*
* @param rs
* 记录集
* @param rm
* 对象转换填充器
* @return List
* @throws SQLException
*/
private List ResultSetForList(ResultSet rs, RowMapper rm) {
List listArray = new ArrayList();
try {
int i = 0;
rs.last();
page.setPageCount(rs.getRow());
rs.absolute(page.getPageSize() * (page.getCurrentPage() - 1) + 1);
while (i < page.getPageSize() && rs.getRow() > 0) {
listArray.add(rm.mapRow(rs, rs.getRow()));
rs.next();
i++;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
logger.error("SQLException: " + e.getMessage());
} finally {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
logger.error("SQLException: " + e.getMessage());
}
}
return listArray;
}
public Page getPage() {
return page;
}
public void setPage(Page page) {
this.page = page;
}
}
以上红色的部分是最重要的部分,分离ResultSet对象从这里开始。如果大侠们觉得我写得很烂可以自己实现这部分。
好了,记录集里的对象被填充到实体对象中去了。