zoukankan      html  css  js  c++  java
  • jquery easy ui 分页

    为了解决大数据量下显示数据的问题,我们需要这样的一个效果:用户每次操作分页工具栏的时候向数据库获取新的数据,服务器根据传递回的参数确定需要获取的数据段,然后查询数据库获取指定若干行的数据,再传递给前台由Datagrid显示出来。

    首先,设置datagrid的初始化

    1. $(function() {  
    2. $('#tableTrainee').datagrid('getPager').pagination({  
    3.                 pageSize: 10, //每页显示的记录条数,默认为10    
    4.                 pageList: [10, 15, 20, 25], //可以设置每页记录条数的列表  
    5.                 onSelectPage: function(pageNumber, pageSize) {  
    6.                 SearchTrainee();//每次更换页面时触发更改   
    7.                }  
    8.             });  
    9.    });  

    其中的SearchTrainee()方法在每次更新页面的时候都会被加载一次。

    其次,获取数据并加载      

    1. function SearchTrainee() {  
    2.            functionSearchTrainee() {  
    3.            var companyCode =$('#hiddenCompanyCode').val();   
    4.            var name = $('#txtName').val();  
    5.            if (companyCode== "") companyCode = "000";  
    6.            var dg =$('#tableTrainee');  
    7.            var opts =dg.datagrid('options');  
    8.            var pager =dg.datagrid('getPager');  
    9.            var _pageNumber =opts.pageNumber;  
    10.            var _pageSize =opts.pageSize;  
    11.            //异步获取数据到javascript对象,入参为查询条件和页码信息  
    12.            $.post('Ajax/GetTraineeHandler.ashx', {  
    13.                Name: name,  
    14.                CompanyCode:companyCode,  
    15.                pageNumber:_pageNumber,  
    16.                pageSize:_pageSize  
    17.            }, function(data) {  
    18.            //注意此处从数据库传来的data数据有记录总行数的total列  
    19.               var total = JSON.parse(data).rows[0].total;  
    20.               $('#tableTrainee').datagrid('loadData', JSON.parse(data));  
    21.               pager.pagination({  
    22.               //更新pagination的导航列表各参数  
    23.               total:total,//总数  
    24.               pageSize: _pageSize,//行数  
    25.               pageNumber: _pageNumber//页数  
    26.                });  
    27.   });  
    28.        }  

    下面的工作就是使用服务器获取数据库的数据了。

    按照以上要求的话,数据库的查询语句就不能使用 count(*),select * 类似需要全局搜索的语句了,因为其太耗时了。

    网上牛人关于分页搜索语句的帖子非常的多,搜索方法多种多样,这里我采用了以下这个:

    1. select top 页大小 * from id   
    2. where id  not in  
    3. (   
    4. select top 页大小*(页数-1) id  from table  order by id  asc  
    5. )    

    这个语句的优点是不用查询所有行,缺点是页码越大,查询的效率越低。例如,一次测试中获取一千万行后的10行数据,约需要1分钟。


    现在的主要问题基本是解决了,但是还是存在不少问题:

    1. 从服务器中获取数据总条数的时候是使用的select count(*)语句,这样的语句和select * 类似,都是需要搜索全部数据的,会导致大数据的情况下变得很慢。

    2. 不止可以从查询语句方面提高查询效率,如果可以的话,应该给数据库表添加索引,如果可以添加存储过程的话就更好了。


    2013.12.30补充

    在查询数据库的时候,也可以采用下面这条语句

    1. SELECT TOP 页大小 *  
    2. FROM table1  
    3. WHERE id >  
    4.           (  
    5.           SELECT ISNULL(MAX(id),0)   
    6.           FROM   
    7.                 (  
    8.                 SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id  
    9.                 ) A  
    10.           )  
    11. ORDER BY id  

    比较下来,这个语句比上面使用not in语句的查询效率更高,但仍无法避免页码增大会导致效率变差的情况,获取1千万行以后的10行数据仍然需要1分钟以上。

    获取datagrid右下角那里的总页数,不可避免的需要使用count语句,这会出现查询语句的短板,无奈~~

    如果不带条件的获取总行数的话,可以使用下面这条语句

    SELECT ROWS FROM SYSINDEXES WHERE ID = OBJECT_ID('tableName') AND INDID = 1

    注意其获取的并非精确值,而是服务器隔一段时间更新的数据库表总行数。

  • 相关阅读:
    eclipse中文乱码问题解决方案
    修改Tomcat的JDK目录
    Tomcat 5.5 修改服务器的侦听端口
    HTML DOM教程 27HTML DOM Button 对象
    HTML DOM教程 24HTML DOM Frameset 对象
    Navicat for MySQL v8.0.27 的注册码
    HTML DOM教程 25HTML DOM IFrame 对象
    Tomcat 5.5 的下载和安装
    android manifest相关属性
    ubuntu10.04 下 eclipse 小结
  • 原文地址:https://www.cnblogs.com/wahaccp/p/4225419.html
Copyright © 2011-2022 走看看