现在分页已经有了。但是如果查询的数据量超过10万的话,那么速度就很慢了。
有没有高手可以给点提示,如何解决一下,比如一次查询就差出来一页的数据量,10条,那么翻页就查出来下一个10条,这样速度就提上去了。不知道如何实现,在那里突破;现在的每次翻页都是把数据库里面的全部查询一次,只是显示选择的页而已。
有没有高手可以给点提示,如何解决一下,比如一次查询就差出来一页的数据量,10条,那么翻页就查出来下一个10条,这样速度就提上去了。不知道如何实现,在那里突破;现在的每次翻页都是把数据库里面的全部查询一次,只是显示选择的页而已。
解决方案 »
- 求一个smartupload实例
- 关于javabean的问题??
- 大家讨论一下怎么学习JSP和J2EE框架..
- 如何在servlet里面得到select框的所有值?(在线等!)
- 急~jsp对textarea的处理~望大人解决一下
- 请问DX们,如何在启动Tomcat时后以自动打印出一条语句?
- 谁有支持JAVA平台的Crystal Report9.0或低版本?
- 菜鸟的从servlet中发送图象的问题,先给20分,有满意答案100分奉上。
- 可以在jsp函数中调用javascript中的数组么?如可以,该如何调用?
- 如何格式化数据,我现在要取小数点的三位就行了,可不知怎办?
- 求一个在Struts2中实现分页的例子,在线等~~!
- 关于myeclipse8.5版本问题。
sql2000 top
oracle rownum
mysql: SELECT * FROM USER limit (n - 1) * x, x
sql2000: SELECT * FROM (SELECT TOP n * x FROM USER) WHERE id NOT IN (SELECT TOP (n - 1) * x id FROM USER);
oracle: SELECT * FROM (
SELECT users.*, ROWNUM RN FROM (SELECT * FROM USER) users
WHERE ROWNUM < (n * x)
)
WHERE RN >= (n - 1) * x
USER
id | username | password
------------------------
| |
| |
| |
楼主不会是直接把所有的数据全部都load出来了吧~~
适合于数据量小 并且适合换数据库
第二种就是每次只查询每页显示的条数
第二种方法实现的方式有很多 我最喜欢用的就是
搞一个自定义分页标签 这样每次查询的时候只要直接拿过来
修改表名等信息 就可以了
但是自定义标签好像不可以和ajax做集成(数据展示用到ajax)
至于具体的自定义标签网上一大把
java.lang.RuntimeException: Error in [Microsoft][SQLServer 2000 Driver for JDBC]
[SQLServer]在关键字 'FROM' 附近有语法错误。
9楼和10楼 是目前最好的解决办法了
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;/**
* Pager, 基于 JDBC 2.0 滚动机制的分页程序, 在 MySQL, SQLServer, Access, Oracle 下测试通过.
*
*/
public class Pager {
/** Used database connection */
Connection conn = null;
public Pager() {
}
/**
*
* 分页功能, 返回当页的数据(JDBC 2.0 实现).
* @param currentPage
* 当前页面数(取值范围: 从 1 开始有效, 0 自动改为 1)
* @param pageCount
* 每页显示记录
* @return a Vector - 数据列表
*/
public Vector pageData(int currentPage, int pageCount) {
Vector results = new Vector();
String tableName = "table_name";// 要处理的表格名
ResultSet rs = null;
String sql = "SELECT * FROM " + tableName;
Statement stmt = null;
try {
// 生成可滚动的结果集表达式
stmt = conn.createStatement(ResultSet.
TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
int count = recordCount(); // 总记录数
int totalPage = (int) Math.ceil(1.0 * count / pageCount); // 总页面数
if (currentPage <= 0) {
currentPage = 1;
}
// 超出页码范围, 不返回数据
if (currentPage > totalPage) {
currentPage = totalPage;
return results;
}
if ((currentPage - 1) * pageCount > 0) {
// 移动结果集数据到当前页
rs.absolute((currentPage - 1) * pageCount);
}
// rs.absolute(0); 在 ODBC 下会导致如下异常:java.sql.SQLException: Cursor
// position (0) is invalid
int i = 0; // Readed pages
while (rs.next() && i < pageCount) {
i++;
}
} catch (Exception exception) {
System.out.println("Occur a error in " + getClass()
+ ".pageData() : " + exception.getMessage());
} finally {
closeJDBCResource(stmt);
closeJDBCResource(rs);
closeJDBCResource(conn);
}
return results; } /**
*
* 返回当前数据库中记录的总数.
* @return int 记录总数
*/
public int recordCount() {
int allCount = -1;
String tableName = "table_name";// 要处理的表格名
String sql = "SELECT COUNT(*) FROM " + tableName;
ResultSet rs = null;
Statement stmt = null;
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) {
allCount = rs.getInt(1);
}
} catch (Exception exception) {
System.out
.println("Occur a error in " + getClass()
+ ".recordCount() : " + exception.getMessage());
} finally {
closeJDBCResource(stmt);
closeJDBCResource(rs);
closeJDBCResource(conn);
}
return allCount; } /**
* Close a jdbc resource, such as ResultSet, Statement, Connection.... All
* these objects must have a method signature is void close().
* @param resource -
* jdbc resouce to close
*
*/
public static void closeJDBCResource(Object resource) {
try {
Class clazz = resource.getClass();
java.lang.reflect.Method method = clazz.getMethod("close", null);
method.invoke(resource, null);
} catch (Exception e) {
e.printStackTrace();
} }
/**
*
* Test page.
* @param args
*
*/
public static void main(String[] args) { // 分页, 读取第一页数据, 共读取5个记录
Vector data = new Pager().pageData(1, 5);
// TODO: process value object, 更改类名
/*
* for(int i = 0; results != null && i < data.size(); i++) {
*
* ValueObject bean = (ValueObject)data.get(i);
* }
*/
}}
主键是id
当前要查询第2页, 每页显示5条数据
sqlserver 环境
SELECT * FROM (SELECT TOP n * x FROM USER) WHERE id NOT IN (SELECT TOP (n - 1) * x id FROM USER); FROM子句中的n*x 就等于2 * 5 = 10;
WHERE子句中的(n - 1) * x 就等于(2-1)*5 = 5;
最后得到的sql(呵呵..不好意思...上面的语法有点问题.)SELECT * FROM (SELECT TOP 10 * FROM user) AS users WHERE users.id NOT IN (SELECT TOP 5 id FROM user); 这里是使用了主键...其实...任何的unique的列都是可以作为WHERE子句中的那个集合条件的....当然..如果你的数据库设计的够规范(主键与业务无关)....那么用主键是最好不过了....毕竟, 其他与业务有关的东西是可能会变更成为非unique的列的.
不过还是谢谢各位的经典回帖。
谢谢!
top n方式分页,关键是表中 要有一个不重复的数值型字段,一般用主键,有时有些表没有这样的设计,可以加个字段,我通常加个recnum字段(整型,标识为一,自动增量),如条数i,页数n,则语句如下:select top i * from tab where recnum not in (select top (n-1)*i recnum from tab)
其中的运算主要是recnum整型字段,速度一般很快,即使数据量大负荷也不是很大,占用负荷的主要是“not in”这个运算,但在sqlserver中没有办法。要么换成.net要么换成oracle,它至少每个结果集都有一个隐藏字段--记录数,可以用where rec<n*i and rec>(n-1)*i取得
下面的是第一种方法,可用来参考:pageRow:当前的行数,pageNum当前的行数的页数
public List<Topicsinfo>cutPage(String pageRow,String mid,String pageNum)
{
String sql="select top "+pageRow+" * from topicsinfo where modid="+mid+" and topid not in(select top "
+(Integer.parseInt(pageNum)-1)*Integer.parseInt(pageRow)+" topid from topicsinfo where modid="+mid+")";
return RunSeal.query(Topicsinfo.class, sql);
}