jsp中分页显示数据库中记录

1.为什么要使用CachedRowSetImpl

很多情况我们使用ResultSet 就会因为这样那样的问题,rs被关闭或数据链接被关闭,导致ResultSe不能使用。其实这个问题我们可以用CachedRowSetImpl来解决。我的理解是这是一个结果的缓存类,保存在其中的数据不会随着数据库和ResultSet的连接的关闭而丢失,可以传递。-------参考博客

2.几个关于CachedRowSetlmpl的方法

 ResultSet getColumns(String catalog,String schemaPattern,String tableNamePattern,String columnNamePattern); //获取表列信息

3.分页显示数据库中的数据记录

我这里是使用的javabean来进行演示的,其中逻辑部分是全部使用java来实现,在写java代码的时候因为要使用到javabean所以必须要实现set和get方法。

showRecordByPage.java实现

package sql;
import java.sql.*;

import com.sun.rowset.CachedRowSetImpl;
import com.sun.*;
/**
 *  对数据库中数据进行分页显示
 * @author sun
 *
 */
public class showRecordByPage {
int pageSize=10; 	 //每页显示的记录数
int pageAllCount=0;  //分页后的总页数
int showPage=0;		//当前展示的页数
StringBuffer peresentPageResult;//显示当前页面的内容
CachedRowSetImpl  rowSet;//用于存储ResultSet中的数据
String databaseName;
String tableName;
String uri;
String user;
String password;
String field[]=new String[100];//字段
int fieldSize=0;//总计字段个数
public showRecordByPage() {
	peresentPageResult=new StringBuffer();//用于存储当前页面的内容
	try {
		Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	}catch(Exception e) {
		System.out.println(e);//打印异常
	}
}
/*
 * 设置
 */
public int getPageSize() {
	return this.pageSize;
}
public void setPageSize(int size) {
	pageSize=size;
	fieldSize=0;   //字段个数设置为零
	String uri="jdbc:sqlserver://127.0.0.1:1433;"
			+ "DatabaseName="+databaseName;
	try {
		Connection con=DriverManager.getConnection(uri, user,"123456");
		DatabaseMetaData metadata=con.getMetaData();
		ResultSet rs1=metadata.getColumns(null,null, tableName, null);
		int k=0;
		while(rs1.next()) {
			fieldSize++;
			field[k]=rs1.getString(4);//获取字段的名字
			k++;
		}
		System.out.println("fieldSize:"+fieldSize);
		Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
				ResultSet.CONCUR_READ_ONLY);
		ResultSet rs=stmt.executeQuery("select *  from "+tableName);
		rowSet=new CachedRowSetImpl();//创建行级对象
		rowSet.populate(rs);//填充对象,将resultset数据存到rowset对象中
		con.close();
		rowSet.last();//数据库指针指到最后一行 
		int m=rowSet.getRow();//得到总行数  
		int n=pageSize;//自己输入的每页显示的行数  
		pageAllCount=((m%n)==0)? (m/n):(m/n+1);//得到一共要分多少页
	}catch(Exception e) {
		System.out.println("连接数据库抛出异常"+e); 
	}
}
public int getPageAllCount() {
	return pageAllCount;
}
public void setShowPage(int n) {
	this.showPage=n;
}
public int getShowPage() {
	return this.showPage;
}
/**
 * 得到当前页的结果集
 * @return
 */
public StringBuffer getPeresentPageResult() {
	if(showPage>pageAllCount) //pageAllCount总页数  showpage当前页
		showPage=1;
	if(showPage<=0)
		showPage=pageAllCount;
	peresentPageResult=show(showPage);//得到页的内容
	System.out.println("输出当前页中的内容:"+peresentPageResult);
	return peresentPageResult;
}
/**
 * 得到页的内容
 * @param page
 * @return
 */
public StringBuffer show(int page) {
	StringBuffer str=new StringBuffer();
	str.append("<table border=1>");
	str.append("<tr>");
	for(int i=0;i<fieldSize;i++) {
		str.append("<th>"+field[i]+"</th>");
	}
	System.out.println("这是fieldSize"+fieldSize);
	str.append("</tr>");
	try {
		//连接相同的东西
		//获取自己获得 的结果集
		rowSet.absolute((page-1)*pageSize+1);
		boolean boo=true;
		for(int i=1;i<pageSize&&boo;i++) {
			str.append("<tr>");
			for(int k=1;k<=fieldSize;k++) {
				str.append("<td>"+rowSet.getString(k)+"</td>");
				System.out.println(rowSet.getString(k));
			}
			str.append("</tr>");
			boo=rowSet.next();
		}
	}catch(Exception e) {
		System.out.println(e);
	}
	return str;
	//返回结果
}
public void setDatabaseName(String name) {
	this.databaseName=name.trim();
}
public String getDatabaseName() {
	return this.databaseName;
}
public void setTableName(String name) {
	this.tableName=name.trim();
}
public String getTableName() {
	return this.tableName;
}
public void setPassword(String password) {
	this.password=password;
}
public String getPassword() {
	return this.password;
}
public void setUser(String user) {
	this.user=user;
}
public String getUser() {
	return this.user;
}
}

showRecordByPage.jsp中代码实现

<!-- 分页展示数据库中的数据 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 导入相应的包 -->
<%@ page import="sql.showRecordByPage" %>
<%@ page import="java.sql.*" %>
<jsp:useBean id="look" class="sql.showRecordByPage" scope="session" />
<jsp:setProperty name="look" property="databaseName" value="temp"/>
<jsp:setProperty name="look" property="tableName" value="password"/>
<jsp:setProperty name="look" property="user" value="sa"/>
<jsp:setProperty name="look" property="password" value="123456"/>
<jsp:setProperty name="look" property="pageSize" value="5"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>showRecord by page</title>
</head>
<h1  align="center">数据库</h1>
<body>
<jsp:getProperty name="look" property="databaseName" />中
<jsp:getProperty name="look" property="tableName"/>表的记录将被分页显示
<jsp:getProperty name="look" property="pageAllCount" />页<br> 
每页的大小为
<jsp:getProperty name="look" property="pageSize"/><br> 
当前页为
<jsp:getProperty name="look" property="showPage" /><br> 
<jsp:getProperty name="look" property="peresentPageResult"/>
<br>单机“前一页”或“后一页”查看记录(当前显示第
<jsp:getProperty name="look" property="showPage" />
页)。
<table>
<tr>
<td>
<form action="">
<input type="hidden" name="showPage" value="<%=look.getShowPage()-1%>">
<input type="submit" name="g" value="前一页"/>
</form>
</td>
<td>
<form action=""> 
<input type="hidden" name="showPage" value="<%=look.getShowPage()+1 %>">
<input type="submit" name="g" value="后一页" />
</form>
</td>
<td>
<form action="">
<label>输入页码</label>
<input type="text" name="showPage" size=3/>
<input type="submit" value="提交" />
</form>
<%!  int a=1;%>
<%
String page1=null;
page1=request.getParameter("showPage");
try{
if(page1!=null)
{
	a=Integer.parseInt(page1);
}
}
catch(Exception e ){
	System.out.println("输入的不是一个数字");
}
%>
<jsp:setProperty name="look" property="showPage" value="<%=a %>"/>
</td>
</tr>
</table> 
</body>
</html>

网页中的各种表单没有样式美化,作为一种测试实现的方法。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    评论
  • 4
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:终极编程指南 设计师:CSDN官方博客 返回首页

打赏作者

laoyao_legend

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值