论坛首页 Java企业应用论坛

(原创) Spring jdbctemplate 分页改造 (一)

浏览 4862 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-06-30  

最近项目中使用到了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对象从这里开始。如果大侠们觉得我写得很烂可以自己实现这部分。

好了,记录集里的对象被填充到实体对象中去了。

 

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics