论坛首页 Java企业应用论坛

SqlServer的一个分页工具类

浏览 5500 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (7)
作者 正文
   发表时间:2010-04-13   最后修改:2010-04-13

SqlServer的一个分页工具类,主要功能有为据传入的参数生成sql语句,或者根据传入的参数直接返回一个ResultSet对象。

 

 

/**
 * 
 */
package com.woxiaoe.ework.util;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.log4j.Logger;
import org.gdb.common.DataSourceFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceUtils;

/**
 * 分页工具类
 * @author 小e
 *
 * 2010-1-1 下午07:46:04
 */
public class PaginationUtil {
	
	private Map<ResultSet,Connection> currentConn = new HashMap<ResultSet, Connection>();

	
	
	public String getPaginationSql(int start,int limit,String tableName,String fields,String filter,String orderBy){
		String sql = "SELECT TOP " + limit +" * FROM "
		+ "( "
        + "SELECT ROW_NUMBER() OVER (ORDER BY " + orderBy + ") AS RowNumber," + fields +" FROM "  + tableName +
        		((filter != null)?" where " + filter:"")
        + ") A "
        + "	WHERE RowNumber > " + start ;
		return sql;
	}
	
	public ResultSet query(int start,int limit,String tableName,String fields,String filter,String orderBy){
		Connection conn = DataSourceUtils.getConnection(DataSourceFactory.getDataSource());
		PreparedStatement pstmt;
		ResultSet rs = null;
		try {
			pstmt = conn.prepareStatement(getPaginationSql(start,limit,tableName,fields,filter,orderBy));
			rs = pstmt.executeQuery();
			currentConn.put(rs, conn);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rs;
	}

	public void releaseConn(ResultSet rs){
		Connection conn = currentConn.get(rs);
		currentConn.remove(rs);
		DataSourceUtils.releaseConnection(conn, DataSourceFactory.getDataSource());
	}
}
   发表时间:2010-04-13  
LZ有这样的想法,说明你也上道了,再花点时间写个SqlUtil吧

基本上直接和数据库交互的程序员都会写个SqlUtil或想写个(hibernate除外)

加油


另外,最好别用String,用Stringbuilder
0 请登录后投票
   发表时间:2010-04-13  
lyw985 写道
LZ有这样的想法,说明你也上道了,再花点时间写个SqlUtil吧

基本上直接和数据库交互的程序员都会写个SqlUtil或想写个(hibernate除外)

加油


另外,最好别用String,用Stringbuilder

的确,用StringBuilder或这个StringBuffer比较合适;

把这个public String getPaginationSql( 方法sql改下也可以应用到Oracle中。
0 请登录后投票
   发表时间:2010-04-13  
楼主不介意的话,我提点不同的意见。

1,职责不单一,PaginationUtil 既分页,又有管理连接的功能。
2,关键方法参数太多,不易于使用。


本人不太懂java,胡乱说的。实在罪过。
0 请登录后投票
   发表时间:2010-04-14  
想知道还有人嫩么用吗?
0 请登录后投票
   发表时间:2010-04-14  
觉得楼主开发的可能是基于SqlServer2005的工具吧,SqlServer2000分页工具好像比较复杂的,用StringBuilder最好,一般不用String的+操作
0 请登录后投票
   发表时间:2010-04-14  
justlive 写道
楼主不介意的话,我提点不同的意见。

1,职责不单一,PaginationUtil 既分页,又有管理连接的功能。
2,关键方法参数太多,不易于使用。


本人不太懂java,胡乱说的。实在罪过。


之前这个方法是调用存储过程分页,需要传入那些参数,同时需要管理Connection,后来将分页过层改为通过sql语句分页,当不希望之前的代码有太大变化,所以保留了之前的参数样式。query方法是为了和之前的兼容,同样是返回ResultSet对象,这样其他的地方就无需修改了。后面的操作都是基于getPaginationSql得到sql参数自己分页,几乎没用到query。
之前的项目中用SqlServer做数据库,分页搞了好久,最后用这种模式,大家用SqlServer开发的时候分页一般是用哪种方式?
0 请登录后投票
   发表时间:2010-04-14   最后修改:2010-04-14

 

 

LZ精神可嘉~ 呵呵 ,建议楼主看看HIBERNATE对列表和分页的处理 

 

这个是很久前写的了,也许符合楼主的需求!

 

http://webeasymail.iteye.com/blog/247881

0 请登录后投票
   发表时间:2010-04-14  
webeasymail 写道
 

 

LZ精神可嘉~ 呵呵 ,建议楼主看看HIBERNATE对列表和分页的处理 

 

这个是很久前写的了,也许符合楼主的需求!

 

http://webeasymail.iteye.com/blog/247881


之前的项目中项目经理不让用hibernate,所以要开发中就只能那样处理了。
0 请登录后投票
   发表时间:2010-04-14  
whaosoft 写道
想知道还有人嫩么用吗?


说的不错,但楼主应该只是展示个功能方法给大家讨论下,不必深究
0 请登录后投票
论坛首页 Java企业应用版

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