关于JDBC数据分页跨数据库小结_数据库连接与分页汇总
关于JDBC数据分页跨数据库小结由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数据库连接与分页汇总”。
关于JDBC数据分页跨数据库小结
一、关于数据连接connection如何区分数据库类型
// 获取数据生产商名称
String databaseProductName = conn.getMetaData().getDatabaseProductName();// 获取数据库版本号
String productVersion = conn.getMetaData().getDatabaseProductVersion();
测试结果:
Oracle // // //
databaseProductName :Oracle
productVersion :Oracle Database 10g Enterprise Edition Release 10.2.0.1.01)* page.getPageSize();int endRow = startRow + page.getPageSize();String osql = “select * from(select t.*,rownum as rn from(”
+ sql+ “)t where rownum” + startRow;
} return osql;
三、MYSQL数据库分页方案采用 limit 关键字
1.SQL语句:
select trty.* from(select * from table)trty limit startrow ,endrow
2.生成分页SQL代码:
/**
* MySql数据库分页专用
* @param sql
* @param page
* @return String
* @see 未测试
*/
private static String wrapPage4MySql(String sql, Page page){
int startRow =(page.getPageNo()1)* page.getPageSize();int endRow = page.getPageNo()* page.getPageSize();Statement statement = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = statement.executeQuery(sql);
// 查询范围超过,返回空rows rs.last();int rownum = rs.getRow();if((startRow+1)> rownum){ }
// 判断分页总数是否超过实际数量 int startnum = startRow + 1;int endnum = endRow + 1;if(rownum
rs.absolute(startnum);while(startnum
} } return rows;
五、Microsoft SQL Server数据库分页方案探索
1.方案一 采用top关键字
SQL语句:
SELECT TOP 10 * FROM TestTable WHERE ID NOT IN
(SELECT TOP 20 id FROM TestTable ORDER BY ID)ORDER BY ID
2.方案二 用top关键字
SELECT TOP 10 * FROM TestTable WHERE ID >
(SELECT MAX(id)FROM(SELECT TOP 20 id FROM TestTable ORDER BY id)AS T)ORDER BY ID
3.方案一和二本质一样,但是方案二的效率比较高。对于复杂的SQL不能采用此中分页方式,除非有逻辑严谨的拆解SQL语句的程序。
4.方案三采用存储过程分页,在JAVA程序中调用存储过程。
1)存储过程代码如下
IF NOT EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Pr_QueryByPage]')AND OBJECTPROPERTY(id,N'IsProcedure')= 1)BEGIN
EXEC dbo.sp_executesql @statement = N'create procedure [dbo].[Pr_QueryByPage]
@sqlstr nvarchar(4000),--查询sql @currentpage int,--第页记录条数 @pagesize int--每页显示记录
as
set nocount on
declare @P1 int,--P1是游标的ID @rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize)as TotalPage,@rowcount as [RowCount]
set @currentpage=(@currentpage-1)*@pagesize+1 exec sp_cursorfetch @P1,16,@currentpage,@pagesize exec sp_cursorclose @P1 set nocount off ' END GO
2)代码调用
/**
List> rows = * Microsoft SQL Server 2000分页专用
*
* @param conn
* @param sql
* @param page
* @return
* @throws Exception
* @see 测试通过
*/
private static List> wrapPage4SQLServer2000(Connection conn, String sql, Page page)throws Exception { new ArrayList>();
// 设置存储过程参数
cs.setString(1, sql);cs.setInt(2, pageno);cs.setInt(3, pagsize);cs.execute();boolean hasResultSet = cs.execute();if(hasResultSet){
} return rows;} ResultSet rs = null;/** 跳过第一个结果集 */ rs = cs.getResultSet();/** 第二个结果集为查询分页数据 */ if(cs.getMoreResults()){
} rs = cs.getResultSet();while(rs.next()){ } rows.add(buildOneRow(rs));// 调用存储过程分页
CallableStatement cs = conn.prepareCall(“{call Pr_QueryByPage(?,?,?)}”);int pageno = page.getPageNo();int pagsize = page.getPageSize();5.关于SQLSERVER2005分页方案的选择
1)2005分页方案可以采用存储过程,和2000的方案兼容。2)2005第二种分页方案采用RowNumber()函数可以实现。
SQL实例:
SELECT * FROM(SELECT
ROW_NUMBER()OVER(ORDER BY Namec)AS RowNumber, FROM
dbo.mem_member)_myResults WHERE
RowNumber between 10000 and 10020 缺点:此种方案关键函数 ROW_NUMBER()必须进行order by排序。如果采用此种方案必须拆分SQL语句。