精华内容
下载资源
问答
  • 我们经常会遇到根据集合去大批量查询数据库信息,查询完成后再与当前集合里的对象做对比,由于需要多次访问数据库会造成效率低下,因此要进行优化。1.减少访问数据库次数,一个个去查替换成批量去查询,进行分页查询...

    我们经常会遇到根据集合去大批量查询数据库信息,查询完成后再与当前集合里的对象做对比,由于需要多次访问数据库会造成效率低下,因此要进行优化。

    1.减少访问数据库次数,一个个去查替换成批量去查询,进行分页查询一次分页1000到3000个左右,sql 以union 的结构来查询

    2.将查询出的结果,根据集合中查询字段,转换成Map结构。

    3.使用多线程。

    展开全文
  • 上一节中,我们了解到通过循环可以获取一个查询的所有数据,在实际应用中,我们并不希望一次性获取数据表中的所有数据,那样性能会非常的低,因此会使用翻页功能,每页仅显示10条或者20条数据。通过mysql的limit可以...

    上一节中,我们了解到通过循环可以获取一个查询的所有数据,在实际应用中,我们并不希望一次性获取数据表中的所有数据,那样性能会非常的低,因此会使用翻页功能,每页仅显示10条或者20条数据。

    通过mysql的limit可以很容易的实现分页,limit m,n表示从m行后取n行数据,在PHP中我们需要构造m与n来实现获取某一页的所有数据。

    假定当前页为$page,每页显示$n条数据,那么m为当前页前面所有的数据,既$m = ($page-1) * $n,在知道了翻页原理以后,那么我们很容易通过构造SQL语句在PHP中实现数据翻页。

    $page = 2;

    $n = 2;

    $m = ($page - 1) * $n;

    $sql = "select * from user limit $m, $n";

    $result = mysql_query($sql);

    //循环获取当前页的数据

    $data = array();

    while ($row = mysql_fetch_assoc($result)) {

    $data[] = $row;

    }

    在上面的例子中,我们使用了$m与$n变量来表示偏移量与每页数据条数,但我们推荐使用更有意义的变量名来表示,比如$pagesize, $start, $offset等,这样更容易理解,有助于团队协作开发。

    展开全文
  • for循环与mysql的分页查询

    千次阅读 2017-05-16 14:39:58
    发送短信提醒,在查询中,因为生产上的数据数十万条,数据量大,如果直接一下子查出来,会对数据库造成很大的压力,用到分页查询,按照正常逻辑,查询表中总数量,然后根据当前页以及每页数量,循环数据库进行查询...

    这两天写了一个定时任务,关于查询表中快过期的卡,发送短信提醒,在查询中,因为生产上的数据数十万条,数据量大,如果直接一下子查出来,会对数据库造成很大的压力,用到分页查询,按照正常逻辑,查询表中总数量,然后根据当前页以及每页数量,循环对数据库进行查询;

    		//分页查询,每次查询1000条数据
    		int pageSize = 1000;//每页数量
    		int page = 1;//定义总页数
    		int offset;//当前页起始数
    		int rowCount;//当前页结束数
    		List<GiftCard> list = null;
    		List<Integer> userIdList = new ArrayList<Integer>();
    		//得到总页数
    		if(giftCardCount > 0){			
    			if(giftCardCount%pageSize==0){
    				page=(int) (giftCardCount/pageSize);
    			}else{
    				page=(int) (giftCardCount/pageSize+1);
    			}
    		}
    		//查询出还有三天且绑定了用户的优选卡信息
    		for (int i = 1; i < page + 1; i++) {			
    			if(page == 1){//即将过期账号查询只有一页时
    				offset = 0;
    				rowCount = (int) giftCardCount;
    				list = giftcardDAO.getGiftCardThreeDaysDue(rowCount,offset,currentTime,fourDaysTime);
    				if(null != list && list.size() > 0) {
    					for (GiftCard giftCard : list) {
    						Integer userId = giftCard.getUserId();
    						userIdList.add(userId);
    					}			
    				}
    			}else{//即将过期优选卡查询多页时分页处理
    				if(i == 1){					
    					offset = 0;
    				}else{
    					offset = (i-1)*pageSize;					
    				}
    				if(page == i){					
    					//rowCount = (int) giftCardCount;
    					rowCount = (int) giftCardCount - (i-1) * pageSize;
    				}else {
    					//rowCount = i*pageSize -1;
    					rowCount = pageSize;
    				}
    				list = giftcardDAO.getGiftCardThreeDaysDue(rowCount,offset,currentTime,fourDaysTime);
    				if(null != list && list.size() > 0) {
    					for (GiftCard giftCard : list) {
    						Integer userId = giftCard.getUserId();
    						userIdList.add(userId);
    					}			
    				}
    			}
    		}

    上面的代码,是否能进一步优化呢?

    如果采用for循环的break跳出会不会逻辑更加简单些?

    每一次循环查出1000条,当某一次查出的数据的数量不够1000条时,表示再往下循环已然没有数据,这个时候跳出,循环结束,即将过期卡的信息也被完全查出,相比上面的业务逻辑,简单许多,在生产商可以节省不少时间,修改代码如下:

    		//分页查询,每次查询1000条数据
    		int pageSize = 1000;//每页数量		
    		int offset;//当前页起始数	
    		List<GiftCard> list = null;
    		List<Integer> userIdList = new ArrayList<Integer>();
    		
    		for(int i = 0;i>=0;i++){
    			offset = i*pageSize;
    			list = giftcardDAO.getGiftCardThreeDaysDue(pageSize,offset,currentTime,fourDaysTime);
    			if(null != list && list.size() > 0) {
    				for (GiftCard giftCard : list) {
    					Integer userId = giftCard.getUserId();
    					userIdList.add(userId);
    				}			
    			}
    			if(null != list && list.size() > 0 && list.size() < pageSize){
    				break;
    			}
    		}
    这里利用了for循环的break跳出,优化代码简化逻辑,而且减少了对数据库的访问次数。

    补充:这里也顺便介绍下java跳出for循环的break和continue语句;

    “break”语句用来结束循环,即不再执行后边的所有循环。

    示例:计算1+2+3+4......+100的结果。

    public class example1{
        public static void main(String[] args){
            int result=0;
            for(int i=1;i<=100;i++){
                if(i>50) break;
                result+=i;
            }
            System.out.println(result);
        }
    }
    输出结果:
    1275

    分析:程序只计算了1+2+3+4+......+50的结果,后边的循环全部没有执行,即当i=51的时候,循环就结束了。

    另外,“break”语句可以与switch开关语句一起使用,当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则会从满足条件的地方(即与switch(表达式)括号中表达式匹配的case)开始执行,直到switch结构结束。

    “continue”语句用来结束当前循环,并进入下一次循环,即仅仅这一次循环结束了,不是所有循环结束了,后边的循环依旧进行。

    示例:计算1+2+3+4......+100的结果。

    public class example1{
        public static void main(String[] args){
            int result=0;
            for(int i=1;i<=100;i++){
                if(i>50&&i<=60) continue;
                result+=i;
            }
            System.out.println(result);
        }
    }
    输出结果:
    4495

    分析:程序计算了1+2+3+......+48+49+50+61+62+63+......+100的结果,仅仅没有对i=51,52......60进行循环。







    展开全文
  • mysql的分页查询(for循环

    千次阅读 2018-03-03 10:01:53
    发送短信提醒,在查询中,因为生产上的数据数十万条,数据量大,如果直接一下子查出来,会对数据库造成很大的压力,用到分页查询,按照正常逻辑,查询表中总数量,然后根据当前页以及每页数量,循环数据库进行查询...

    这两天写了一个定时任务,关于查询表中快过期的卡,发送短信提醒,在查询中,因为生产上的数据数十万条,数据量大,如果直接一下子查出来,会对数据库造成很大的压力,用到分页查询,按照正常逻辑,查询表中总数量,然后根据当前页以及每页数量,循环对数据库进行查询;

    [java] view plain copy
    1. //分页查询,每次查询1000条数据  
    2. int pageSize = 1000;//每页数量  
    3. int page = 1;//定义总页数  
    4. int offset;//当前页起始数  
    5. int rowCount;//当前页结束数  
    6. List<GiftCard> list = null;  
    7. List<Integer> userIdList = new ArrayList<Integer>();  
    8. //得到总页数  
    9. if(giftCardCount > 0){             
    10.     if(giftCardCount%pageSize==0){  
    11.         page=(int) (giftCardCount/pageSize);  
    12.     }else{  
    13.         page=(int) (giftCardCount/pageSize+1);  
    14.     }  
    15. }  
    16. //查询出还有三天且绑定了用户的优选卡信息  
    17. for (int i = 1; i < page + 1; i++) {           
    18.     if(page == 1){//即将过期账号查询只有一页时  
    19.         offset = 0;  
    20.         rowCount = (int) giftCardCount;  
    21.         list = giftcardDAO.getGiftCardThreeDaysDue(rowCount,offset,currentTime,fourDaysTime);  
    22.         if(null != list && list.size() > 0) {  
    23.             for (GiftCard giftCard : list) {  
    24.                 Integer userId = giftCard.getUserId();  
    25.                 userIdList.add(userId);  
    26.             }             
    27.         }  
    28.     }else{//即将过期优选卡查询多页时分页处理  
    29.         if(i == 1){                   
    30.             offset = 0;  
    31.         }else{  
    32.             offset = (i-1)*pageSize;                      
    33.         }  
    34.         if(page == i){                    
    35.             //rowCount = (int) giftCardCount;  
    36.             rowCount = (int) giftCardCount - (i-1) * pageSize;  
    37.         }else {  
    38.             //rowCount = i*pageSize -1;  
    39.             rowCount = pageSize;  
    40.         }  
    41.         list = giftcardDAO.getGiftCardThreeDaysDue(rowCount,offset,currentTime,fourDaysTime);  
    42.         if(null != list && list.size() > 0) {  
    43.             for (GiftCard giftCard : list) {  
    44.                 Integer userId = giftCard.getUserId();  
    45.                 userIdList.add(userId);  
    46.             }             
    47.         }  
    48.     }  
    49. }  

    上面的代码,是否能进一步优化呢?

    如果采用for循环的break跳出会不会逻辑更加简单些?

    每一次循环查出1000条,当某一次查出的数据的数量不够1000条时,表示再往下循环已然没有数据,这个时候跳出,循环结束,即将过期卡的信息也被完全查出,相比上面的业务逻辑,简单许多,在生产商可以节省不少时间,修改代码如下:

    [java] view plain copy
    1. //分页查询,每次查询1000条数据  
    2. int pageSize = 1000;//每页数量        
    3. int offset;//当前页起始数   
    4. List<GiftCard> list = null;  
    5. List<Integer> userIdList = new ArrayList<Integer>();  
    6.   
    7. for(int i = 0;i>=0;i++){  
    8.     offset = i*pageSize;  
    9.     list = giftcardDAO.getGiftCardThreeDaysDue(pageSize,offset,currentTime,fourDaysTime);  
    10.     if(null != list && list.size() > 0) {  
    11.         for (GiftCard giftCard : list) {  
    12.             Integer userId = giftCard.getUserId();  
    13.             userIdList.add(userId);  
    14.         }             
    15.     }  
    16.     if(null != list && list.size() > 0 && list.size() < pageSize){  
    17.         break;  
    18.     }  
    19. }  
    这里利用了for循环的break跳出,优化代码简化逻辑,而且减少了对数据库的访问次数。

    补充:这里也顺便介绍下java跳出for循环的break和continue语句;

    “break”语句用来结束循环,即不再执行后边的所有循环。

    示例:计算1+2+3+4......+100的结果。

    [java] view plain copy
    1. public class example1{  
    2.     public static void main(String[] args){  
    3.         int result=0;  
    4.         for(int i=1;i<=100;i++){  
    5.             if(i>50break;  
    6.             result+=i;  
    7.         }  
    8.         System.out.println(result);  
    9.     }  
    10. }  
    输出结果:
    1275

    分析:程序只计算了1+2+3+4+......+50的结果,后边的循环全部没有执行,即当i=51的时候,循环就结束了。

    另外,“break”语句可以与switch开关语句一起使用,当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则会从满足条件的地方(即与switch(表达式)括号中表达式匹配的case)开始执行,直到switch结构结束。

    “continue”语句用来结束当前循环,并进入下一次循环,即仅仅这一次循环结束了,不是所有循环结束了,后边的循环依旧进行。

    示例:计算1+2+3+4......+100的结果。

    [java] view plain copy
    1. public class example1{  
    2.     public static void main(String[] args){  
    3.         int result=0;  
    4.         for(int i=1;i<=100;i++){  
    5.             if(i>50&&i<=60continue;  
    6.             result+=i;  
    7.         }  
    8.         System.out.println(result);  
    9.     }  
    10. }  
    输出结果:
    4495

    分析:程序计算了1+2+3+......+48+49+50+61+62+63+......+100的结果,仅仅没有对i=51,52......60进行循环。
    展开全文
  • 数据库分页

    2018-03-08 12:59:55
    技巧:a.确定每页显示的记录数b.获取总记录数c.1.确定分页后的总页数(总记录数/每页显示的记录数),有余数时,总页数加1 ...通过for循环显示结果1.SQL Servler数据库获取分页后第二页的数据(查询不包含数据表前4条记...
  • 分页技术在很多地方都有使用,几乎在超过30条数据需要显示页面,你不得不利用get方法对其进行分页,总不能一次性地在一个页面呈现给用户,而在JavaWeb中实现分页一点也不难,关键是处理好几个关键参数,下面举一个...
  • 通过一个循环可以获取一个查询的所有数据,但是性能很低,使用翻页操作,每页显示10条或20条数据。 通过mysql的limit实现分页,limit m n 是从m行后取n行数据。在php中需要构造m和n来获取某一页的所有数据。 假定...
  • PHP 分页实例,演示从数据库创建到读取数据集,对数据集分页的整个过程。产生 1 2 3 的分页序号:  //数据库连接  @mysql_connect("localhost","root","111") or die("连接数据库失败:".mysql_error());  mysql_...
  • 这个问题是数据库处理中十分常见的问题。经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页。但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在...
  • 目录MyBatis返回类型resultType简单参数MapresultMap概述使用模糊查询在java语句中传入like的内容在mapper文件中拼接like的内容动态SQL概述ifwherefor each循环简单参数循环实体类属性sql代码片段总结使用数据库配置...
  • 将分批分页查询的数据导出成excel表格将数据库中的数据按照一定的过滤和排序规则,进行分批分页查询后生成Excel或者其他形式的报表数据,然后提供前端给下载是一个比较常见的业务场景,而且一般还会限定最大的行数,...
  • 获取分页的一页记录数据,循环遍历得出标签收费记录对象,然后通过标签收费记录中的标签ID来查询标签信息对象,保存在List对象中: List vehicleList =new ArrayList(); if(rs.list!=null && rs....
  • 数据库中的数据按照一定的过滤和排序规则,进行分批分页查询后生成Excel或者其他形式的报表数据,然后提供前端给下载是一个比较常见的业务场景,而且一般还会限定最大的行数,或者由前端指定行数。其实这个逻辑...
  • 其二:一次查询,分批显示就是说,我们可以执行一个数据库查询操作,得到结果集rs。然后,通过指针的移动来显示当前页面的记录。这样,就可以以 rs.absolute(当前页面号*每页记录数)定位到当前页的第一条记录,然后...
  • 分页查询关键代码: 通过servlet转发回来的各种信息进行分页的设计(转发回的信息有 分页查询的List集合 查询的页码 查询的条数 查询的数据库总条数 查询的总页码) 从开始时循环10次出现十个数...
  • 这个问题是数据库处理中十分常见的问题。经典的数据分页方法是:ADO 纪录集分页法,也是利用ADO自带的分页功能(利用游标)来实现分页。但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在...
  • 游标,简单的说就是一个查询结果的指针。游标作为数据库的一个对象,使用它是包括 声明 打开 循环抓去一定数目的文档直到结果集中的所有文档已经抓取完 关闭游标   游标的基本用法,类似于JDBC的ResultSet...
  • 假如我们根据关注表的uid想得到用户表的信息,这是如果有n条关注,我们用循环体内就要查n次数据库。就算做了分页。。。也还是坑。 我们应譔这样,先把关注的uid查出来后放到一个一维数组里,再使用where in到用户表...
  • 以mybatis为例,当我们进行数据库列表查询,需要分页时,而查询的条件确需要for循环循环处理才能生成,导致带此时的查询条件去分页时,会导致界面出现数据数量错误。 解决办法1: 例: ServiceImpl public...
  • django分页模块

    2019-07-15 19:41:41
    数据库查询的时候,就查询出指定页的数据,不多查。 Article.object.all()[:5] Queryset有惰性特质,在不涉及到: 1、截取 2、排序 3、循环 的情况下,不会遍历执行 django有一个插件paginator专门负责分页 def ...
  • VBA与数据库

    2015-11-19 18:07:38
    •实例3-30 使用别名查询数据库 84 •实例3-31 将查询结果作为窗体控件的源数据 85 •实例3-32 通过窗体控件查询浏览数据库记录 88 •实例3-33 多表查询(WHERE连接) 98 •实例3-34 多表查询(内连接INNER JOINT) ...
  • 数据库优化总结

    2017-04-28 10:58:13
    数据库相关的接口要尽量减少对数据库的操作: ...(1)尽量不要在循环里面执行sql(包括更新和查询),可以先查询出一个list或分段查list,再遍历这个list进行处理 (2)查询接口查不到就返回null,不抛异常,不返
  • 数据库查询的时候,就查询出指定页的数据,不多查。 Article.objects.all()[:5] Queryset有惰性特质,在不涉及到: 1、截取 2、排序 3、循环 的情况下,不会遍历执行。 基于分页,django开发了...
  • 数据库数据导入到Elasticsearch ... * 循环导入数据库的数据 * @param status sku 的状态, 是否上架 */ @Override public void importSku(String status) { // 查询出总记录数 Integer count = skuFeign.find
  • Java web的分页

    2020-09-18 08:21:45
    查询数据首先肯定要连接好数据库,然后再写查询询语句,再获取执行的对象,创建一个list集合,四小步,1、对sql预处理2、返回查询结果集3.循环结果集4.添加到集合中最后返回数据就完成查询了 3、这是servlet部分...
  • 10万+条Json数据写入到数据库

    万次阅读 2016-06-02 18:15:11
    10万+条Json数据写入到数据库 101254条数据据耗时近10分钟(5677368毫秒)终于插入到...一开始想的是,将这10万多条数据分页查询然后插入到数据库中,于是写了一个循环,准备不断访问那个网站分页获得数据;,但由于不
  • 结合mysql数据库查询,实现分页效果 @user.route("/user_list",methods=['POST','GET']) def user_list(): p = g.args.get("p", '') #页数 show_shouye_status = 0 #显示首页状态 if p =='': p=1 ...
  • 后台数据的分页处理

    千次阅读 2019-07-09 17:48:51
    1、当从数据库得到查询结果,然后从前台得到pagesize和pageindex时,如何对数据做分页? 将得到的数据集按照pagesize为步长做循环,将每一次的循环结果存入List,然后再按pagesize和pageindex做一一对应,存入Map中...
  • php分页静态化

    2013-07-05 12:55:43
    某子频道列表内文章经数据库查询为45条,则,首先我们通过查询得到如下参数:1,总页数;2,每页篇数。第二步,for ($i = 0; $i < allpages; $i++),页面元素获取,分析,文章生成,都在此循环中执行。不同的是,...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 160
精华内容 64
关键字:

循环分页查询数据库