用 javabean 来实现 mysql 的分页显示
●○●○●○●○●○●○●○●○●○●○●○●○●○●○
○ 作者:刘湛 日期:2000-02-04 jeru@163.net ●
● http://www.cyberlabs.com/~jeru/ ○
○ 欢迎访问爪哇人,获取更多资料 ●
●○●○●○●○●○●○●○●○●○●○●○●○●○●○
今天写了个 mysql 分页的 javabean,是用 mysql 里的 limit 来实现的.
sql = "select * from test limit 5, 10";
这句话的意思就是从第五条记录开始往下读 10 条记录出来,这个 bean 没有连接数据库的功能,
你可以使用自己的类来链接数据库,当然可以用我那个写的很烂的 dbclass.java 来连,^_^
这里给出三个程序的源代码。
dbclass.java — 用来连接 mysql 数据库。
pagequery.java — 重写了 dbclass 返回的 resultset,使其具备分页功能。
example.jsp — jsp 文件,可以看到,我只用了两行就实现了分页的功能,当然,
sql 语句是不鼓励直接写在 jsp 里的,这里为了让大家看清楚,所以这么做了。
自知水平不高,只想抛砖引玉,有什么错漏之处还望高手指出。
=========================== example.jsp ===================================
<%@ page language="java" import="java.sql.*, dbclass.*" %>
<%@ page contenttype="text/html; charset=gb2312" %>
<jsp:usebean id="pq" scope="page" class="dbclass.pagequery" />
<html>
<body bgcolor="#8ba9c9">
<table bgcolor="#fecda9" cellspacing=0>
<%
string query = "select * from systempass"; // 注意这个" from "一定要大写
resultset rs = pq.myquery(query, request);
string bar = pq.pagelegend(); //读取分页提示栏
out.println("<tr><td colspan=2>"+bar+"</td></tr>");
out.println("<tr><td colspan=2><hr size=1 color=blue></td></tr>");
while (rs.next()) { %>
<tr><td><%=rs.getstring(9)%></td><td><%=rs.getstring(10)%></td></tr>
<% } %>
</table>
</body>
</html>
=========================== pagequery.java ===================================
package dbclass;
/**
* pagequery v 1.0
* 这个类原名叫 tviewpage ,作者 sharetop ,用 php 写的。
* 同事 macro 曾用 php 改写过这个类,添加了不少功能。
* 我感觉封装的很好,使用十分方便,使用 jsp 后,便有了
* 想法用 jsp 来改写,这次为了简明起见,我省去了很多功能,
* 尽量让它好读,以后有空添加更多的功能,
*
* mender :
* jeru liu
* homepage :
* http://www.cyberlabs.com/~jeru/
* email: jeru@163.net
*
* 本类没有提供连接数据库的功能,所以需在外部打开相应的数据库。
* 需在外部自定义数据显示格式。
*/
import java.util.*;
import java.sql.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class pagequery {
int offset; // 记录偏移量
int total; // 记录总数
int maxline; // 记录每页显示记录数
resultset rs; // 读出的结果
int tpages; // 总页数
int cpages; // 当前页数
string pagequery; // 分页显示要传递的参数
string query; // query 语句
string querypart; // " from " 以后的 query 部分
string filepath;
dbclass db; // object of dbclass
//constructer do nothing
public pagequery() {
// 每页显示十行
maxline = 10;
db = new dbclass();
}
//********读取记录***************
// 主要工作函数,根据所给的条件从表中读取相应的记录
public resultset myquery(string query, httpservletrequest req) throws sqlexception {
string query_part, os;
int begin, offset;
// 截取 " from " 以后的 query 语句
begin = query.indexof(" from ");
query_part = query.substring(begin, query.length()).trim();
// 计算偏移量
os = req.getparameter("offset");
if (os == null) offset = 0;
else offset = integer.parseint(os);
// 获取文件名
filepath = req.getrequesturi();
query = query;
querypart = query_part;
// 计算总的记录条数
string sql = "select count(*) as total " + this.querypart;
rs = db.executequery(sql);
if (rs.next())
total = rs.getint(1);
// 设置当前页数和总页数
tpages = (int)math.ceil((double)this.total/this.maxline);
cpages = (int)math.floor((double)offset/this.maxline+1);
// 根据条件判断,取出所需记录
if (total > 0) {
sql = query + " limit " + offset + " , " + maxline;
rs = db.executequery(sql);
}
return rs;
}
// 显示总页数
public int gettotalpages() {
return tpages;
}
//显示当前所在页数
public int getcurrenpages() {
return cpages;
}
//**********显示翻页提示栏*************
// 显示首页、下页、上页、尾页
// 你可以改成你喜欢的样式
public string pagelegend() {
string str = "";
int first, next, prev, last;
first = 0;
next = offset + maxline;
prev = offset – maxline;
last = (this.tpages – 1) * maxline;
if(offset >= maxline)
str += " <a href=" + filepath + "?offset=" + first + ">首页</a> ";
else str += " 首页 ";
if(prev >= 0)
str += " <a href=" + filepath + "?offset=" + prev + ">前页</a> ";
else str += " 前页 ";
if(next < total)
str += " <a href=" + filepath + "?offset=" + next + ">后页</a> ";
else str += " 后页 ";
if(tpages != 0 && cpages < tpages)
str += " <a href=" + filepath + "?offset=" + last + ">尾页</a>";
else str += " 尾页 ";
str += " 页次:" + getcurrenpages() + "/" + gettotalpages() + "页 ";
str += maxline + "条/页 " + "共" + total + "条";
return str;
}
}
=========================== dbclass.java ===================================
/**
* a class use to connect the mysql database and do some query
* use mm.mysql.drive
* jeru liu ,november 2, 2000 , ver – 1.1
*
*/
package dbclass;
import java.sql.*;
public class dbclass {
// public: connection parameters
string dbname = "kernel";
string login = "root";
string password = "mysql";
string dbdriver = "org.gjt.mm.mysql.driver";
string connstr = "jdbc:mysql://localhost/"+dbname+"?user="+login+";password="+password;
connection con = null;
statement stmt = null;
resultset rs = null;
resultsetmetadata resultsmeta =null;
int rows = 0;
// public: constructor to load driver and connect db
public dbclass() {
// load mm.mysql.driver
try
{
class.forname("org.gjt.mm.mysql.driver");
}
// display corresponding error message when onload error occur
catch (java.lang.classnotfoundexception e)
{
system.out.println("class not found exception occur. message is:");
system.out.println(e.getmessage());
}
// establish connection to the database throught driver
try
{
con = drivermanager.getconnection(connstr);
}
// display sql error message
catch (sqlexception e)
{
system.out.print("sql exception occur. message is:");
system.out.print(e.getmessage());
}
}
// perform a query with records returned
public resultset executequery(string sql) throws sqlexception
{
resultset rs = null;
try
{
stmt = con.createstatement();
rs = stmt.executequery(sql);
while(rs.next())
this.rows ++;
rs = stmt.executequery(sql);
}
catch (sqlexception e)
{
system.out.print("query:"+e.getmessage());
}
this.rs = rs;
return rs;
}
// perform a query without records returned
public boolean executeupdate(string sql)
{
try
{
stmt = con.createstatement();
stmt.executeupdate(sql);
return true;
}
catch(sqlexception e)
{
system.out.print("update:"+e.getmessage());
return false;
}
}
// return the num of columns
public int getcolumns()
{
int columns = 0;
try
{
this.resultsmeta = this.rs.getmetadata();
columns = this.resultsmeta.getcolumncount();
}
catch (sqlexception e) {}
return columns;
}
// return the num of rows
public int getrows()
{
return this.rows;
}
public string getdbname() {
return this.dbname;
}
}
