jsp中的分页问题

jsp中的分页是比较基础的问题,也是一个比较重要的问题,下面写我自己的一点的看法:
首先贴一段分页的代码(这是我写的,不唯一,且要使用的话需要修改一些东西):
// 实现分页功能
int pageSize = 5;
int pageNow = 1;
int pageCount = 0;
int rowCount = 0;
String pagenow = req.getParameter("pagenow");
if (pagenow != null) {
pageNow = Integer.parseInt(pagenow);
}
String page = req.getParameter("page");
if (page != null) {
pageNow = Integer.parseInt(page);
}
Class.forName(
"com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
// 得到连接
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=aixinshizhe";
String user = "sa";
String password = "sa";
conn = DriverManager.getConnection(url, user, password);
// 创建statement
String sql = "select count(*) from users";
ps = conn.prepareStatement(sql);
// 注意在写sql语句时不要忘写*,不要忘记写'
rs = ps.executeQuery();
if (rs.next()) {
rowCount = rs.getInt(1);
// pw.println(rowCount);
if (rowCount % pageSize == 0) {
pageCount = rowCount / pageSize;
} else {
pageCount = rowCount / pageSize + 1;
}
}
// pw.println(pageCount);
ps = conn.prepareStatement("select top "+ pageSize+ "* from users where userId not in(select top "+ pageSize * (pageNow - 1)+ " userId from users )");
// 给问号赋值
// ps.setInt(1,pageSize);
// ps.setInt(2,pageSize*(pageNow-1));
rs = ps.executeQuery();
pw.println("<body><center>");
pw.println("<table border=1>");
pw.println("<tr><th>userId</th><th>username</th><th>passwd</th><th>email</th><th>grade</th><th>删除</th><th>修改</th></tr>");
while (rs.next()) {
pw.println("<tr>");
pw.println("<td>" + rs.getInt(1) + "</td>");
pw.println("<td>" + rs.getString(2) + "</td>");
pw.println("<td>" + rs.getString(3) + "</td>");
pw.println("<td>" + rs.getString(4) + "</td>");
pw.println("<td>" + rs.getInt(5) + "</td>");
pw.println("<td><a href=>删除</a></td>");
pw.println("<td><a href=>修改</a></td>");
pw.println("</tr>");
}
pw.println("</table>");
pw.println("<a href=welcome?pagenow=1>首页</a>");
if (pageNow != 1) {
pw.println("<a href=welcome?pagenow=" + (pageNow - 1)+ ">上一页</a>");
}
// 按规定显示页码连接
int control = 0;
if (pageNow + 6 <= pageCount) {
control = pageNow + 6;
} else {
control = pageCount;
}
for (int i = pageNow; i <= control; i++) {
pw.println("<a href=welcome?pagenow=" + i + ">" + i+ "</a>");
}
if (pageNow != pageCount) {
pw.println("<a href=welcome?pagenow=" + (pageNow + 1)
+ ">下一页</a>");
}
pw.println("<a href=welcome?pagenow=" + pageCount
+ ">尾页</a><br>");
pw.println("<form action=welcome method=post>");
pw.println("跳转到:<input type=text name=page>");
pw.println("<input type=submit value=确定>");
pw.println("</form>");
pw.println("</center></body>");

}


我认为分页可以分为四部分,
首先,分别是确定pageSize,pageCount,pageNow,rowCount这四个变量,rowCount是从数据库中得到的,pageSize是根据自己指定的,pageNow是在跳转到哪一页时指定的,而pageCount是通过pageSize和rowCount计算出来的,
其次,从数据库中按照pageSize的大小读取数据(读出pageSize条数据)
再有,就是将读出的数据显示在表格中,
最后,加入页数的超链接,


注意:createStatement与prepareStatement的区别
2011-06-28 21:29
prepareStatement会先初始化SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率。
createStatement不会初始化,没有预处理,没次都是从0开始执行SQL


Statement ─ 由方法 createStatement 所创建。Statement 对象用于发送简单的 SQL 语句。 
PreparedStatement ─ 由方法 prepareStatement 所创建。PreparedStatement 对象用于发送带有一个或多个输入参数( IN 参数)的 SQL 语句。PreparedStatement 拥有一组方法,用于设置 IN 参数的值。执行语句时,这些 IN 参数将被送到数据库中。PreparedStatement 的实例扩展了 Statement ,因此它们都包括了 Statement 的方法。PreparedStatement 对象有可能比 Statement 对象的效率更高,因为它已被预编译过并存放在那以供将来使用。 
CallableStatement ─ 由方法 prepareCall 所创建。CallableStatement 对象用于执行 SQL 储存程序 ─ 一组可通过名称来调用(就象函数的调用那样)的 SQL 语句。CallableStatement 对象从 PreparedStatement 中继承了用于处理 IN 参数的方法,而且还增加了用于处理 OUT 参数和 INOUT 参数的方法。 

以下所列提供的方法可以快速决定应用哪个 Connection 方法来创建不同类型的 SQL 语句: 


createStatement 方法用于:
简单的 SQL 语句(不带参数) 


prepareStatement 方法用于: 
带一个或多个 IN 参数的 SQL 语句 


经常被执行的简单 SQL 语句
prepareCall 方法用于: 
调用已储存过程


例如:prepareStatement可以替换变量
在SQL语句中可以包含?,可以用ps=conn.prepareStatement("select * from Cust where ID=?");
int sid=1001;
ps.setInt(1, sid);
rs = ps.executeQuery();
可以把?替换成变量。
而Statement只能用
int sid=1001;
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from Cust where ID="+sid);
来实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值