发表于: 2018-01-05 22:15:35

1 695


一、今天完成的任务

1、学习分页查询,准备小课堂的相关资料,我的任务实现类似下图的功能

设计思想:现在改成纯利用js进行分页,首先查询出所有记录,初始化通过jquery控制显示首页内容,创建页面切换功能的函数,每次显示固定的内容行并把其他内容行隐藏,这样只需要一次提交就可以实现分页,但是仍有缺点,就是如果数据量很多很多,会严重影响性能

-------合理的想法是每次先取出一部分的内容,比如先去除前30行的内容,等浏览到第31行时再进行一数据库的检索。

SQl 语句-limit----String sql = "select * from tb_Book order by id asc limit ?,?";

这里使用到了 limit 这个 SQL 语句特点

limit arg1,arg2 arg1指定查询记录的起始位置;arg2用于指定查询数据所返回的记录数

select * from tablename limit 0,1

即取出第一条记录。

select * from tablename limit 0,2

取出2条数据 第一条和第二条

select * from tablename limit 1,1

第二条记录

select * from tablename limit 10,20

从第11条到31条(共计20条)

这个 limit 是实现分页的关键,如果每次取出数据库的内容,都要写分页在页面上是怎么去操作实现的,这好像很麻烦。要是每次数据库取出特定页的数据就好了,limit可以实现这样的功能,对数据升序或降序排序后,利用 SQL 取出特定页的数据,直接显示就行了。

当我们显示列表信息的时候,我们常常以分页形式显示,当然在ASP.NET中的ListView和GridView控件等都自带了分页功能,但是效率很低,无法适用大量数据,并且灵活性不高。因而我们一般都使用第三方分页控件或者自己编写分页程序。那么在基于ADO.NET中实现自定义分页的第一步也就是最关键一步必然是要写分页SQL语句,而且语句效率要高。

第一种写法呢是使用NOT IN关键字。--IN 和 NOT IN,效率较低

--查询第11-15条记录,后面的语句即可替换为ADO.NET中执行Command的CommandText

SELECT TOP 5 * FROM LeaveWordView WHERE ID NOT IN(SELECT TOP 10 ID FROM LeaveWordView)

--SELECT TOP PageSize * FROM LeaveWordView WHERE ID NOT IN(SELECT TOP (PageIndex-1)*PageSize ID FROM LeaveWordView)

这条语句的原理是先查询1-10条记录的ID,然后再查询ID不属于这1-10条记录的ID,并且只需要5条记录,因为每页大小就是5,这就是获取到的第11-15条记录,这是非常简单的一种写法。另外IN语句与NOT IN语句类似,这是NOT IN的写法,但是显然达不到我们的需求,因为效率太低。

第二种写法是通过若干次升序与降序实现。

SELECT * FROM(

    SELECT TOP 5 * FROM(

        SELECT TOP 15 * FROM LeaveWordView ORDER BY ID ASC) 

            AS TEMP1 ORDER BY ID DESC)

        AS TEMP2 ORDER BY ID ASC

这条语句首先查询前15条记录,然后在倒序查询前5条记录(即倒数5条记录),这个时候就已经获取到了11-15条记录,但是他们的顺序是倒序,所以最后又进行升序排序。

第三种写法,采用MAX(ID)函数。

--MIN()函数和MAX()函数的使用

--id > 第(PageIndex-1)*PageSize条记录的id AND id <= 第PageIndex*PageSize条记录的id

SELECT TOP 5 * FROM LeaveWordView WHERE ID>

(SELECT MAX(ID) FROM(SELECT TOP 10 ID FROM LeaveWordView ORDER BY ID) AS TEMP1) --(第10条的id)

这个先把第十条记录的id找出来(当然这里面是直接使用MAX()进行查找,MIN()函数的用法也是类似的),然后再对比取比第十条记录的id大的前5条记录即为我们需要的结果。

最后一种,使用ROW_NUMBER。

--用行号(ROW_NUMBER)查询,比较高效的查询方式。

--SELECT ROW_NUMBER() OVER(ORDER BY ID) AS ROWID FROM LeaveWordView

SELECT * FROM(

    SELECT TOP 15 ROW_NUMBER() OVER(ORDER BY ID ASC) AS ROWID,* 

        FROM LeaveWordView) AS TEMP1 

    WHERE ROWID>10

在这里面需要注意的是OVER的括号里面可以写多个排序字段,比如:OVER(ORDER BY CreatedTime,ID)。这条语句是查询前15条记录,然后取出ROWID=10以后的记录。

以上是4中常用分页查询语句,其实他们的效率在万级别一下数据的时候,效率相差并不大,但是在处理上百万数据时,毫无疑问我们将选择最后一种方式。

分页的时候,另一个常用的技巧是在LIMIT语句中加上SQL_CALC_FOUND_ROWS提示(hint),这样做可以获得去掉LIMIT以后满足条件的行数,因此可以作为分页的总数。看起来,MySQL做了一些非常高深的优化,像是通过某种方法预测了总行数。但实际上MySQL只有在扫描了所有满足条件的行,然后再抛弃掉不需要的行,而不是在满足LIMIT的行数后就终止扫描。所有该提示的代价可能非常高。

一个更好的设计是将具体的页面换成“下一页”按钮,假设煤业显示20条记录,那么我们每次查询都是用LIMIT返回21条记录并只显示20条,如果第21条存在,那么我们就显示“下一页”按钮,否则就说明没有更多的数据,也就无需显示“下一页”按钮了。

2、晚上利用时间又去修改mybatis和spring整合的东西,把整合的配置文件spring-mybatis.xml里面理解了一会,再与db.properties搭上,用mybatis-generator重新生成了我想要的表相对应的mapper.xml,对自己的application.xml与师兄们的mybatis-config.xml对比,没有找到语句去application.xml。


二、明天计划的事情

继续学习springmvc,复习springioc。


三、遇到的问题

1、svn  checkout 问题,所有文件夹带上绿色标签,连盘符都会。


我看着这红色感叹号就想干掉他,但是每次干掉重新update 他还是红色的,
 打开文件夹里面的文件又全部是绿色的。。怎么破。。看着真纠结

解决办法:查看隐藏文件,然后删除 . svn,删除操作。

2、idea如果当前project用了版本控制器,其下面新建的所有的项目默认都是加入到版本控制里面,所以项目名称和文件都是红色的,如图:

idea新建项目名称为红色的解决办法    File--》Settings--》version control


 弹出的文件夹选择不需要加入版本控制的文件,然后点击OK,如图:


 这样项目的名称就恢复到默认的白色了,如果创建的文件还会变成红色,这是因为文件没有加入cvs,选中文件ctrl + alt + a,改为下图:


四、收获
以上,关于最近的状态比较差,心里很浮躁,而mybatis、spring整合,还有mvc,之前就没做好,现在老是出问题,跑不通,于是想换个路子,先理解一下没有整合的内容,从分页查询这个带简单页面的demo做起,再往那边靠,下午听了小课堂,就去准备下周小课堂的内容,感觉下午看的效率还可以,能学点东西,也是为后面的工作做好准备,总结,今天的学习劲头还可以,继续保持。
任务开始时间:2018.01.01
预计提交时间:2018.01.14
是否有延期风险:无

返回列表 返回列表
评论

    分享到