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

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

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

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

[java] view plain
  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 ) break ;
  6. result+=i;
  7. }
  8. System.out.println(result);
  9. }
  10. }
输出结果: 分析:程序只计算了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
  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<= 60 ) continue ;
  6. result+=i;
  7. }
  8. System.out.println(result);
  9. }
  10. }
输出结果: 分析:程序计算了1+2+3+......+48+49+50+61+62+63+......+100的结果,仅仅没有对i=51,52......60进行循环。 文章目录说明语法1. mysql 语法- 指定初始位置- 不指定初始位置- 配合offset使用2.sql server语法- 三重 循环 - 利用max(主键)- 利用row_number关键字(2005版本以上才有)- offset /fetch next(2012版本及以上才有)3.orcale语法- 采用伪列 rownum- 分页查询 一- 分页查询 二- 分页查询 三参考链接 分页查询 是为了让我们准确查询到某部分的数据,跟我们在网页的下一页那类是可以同等理解的,一页查询多少条数据,从数据的第几行开 使用 mysql 时,有很多排序规则,比如左右节点,比如子父类设置,Level等级区分等等;我们这里仅做子父类介绍,其余的其他文章在做描述结构图 注: parent 即为user_id ,这里显示顺序是: 1000 > 1010 > 1013;而我们查询出来的呢,就是 1000 下面的所有子节点, 即可用无限递增查询,不管你有多少个子节点,子子节点;结果图 代码:CREATE FUNCTI... 当数据量过大时,通常会采用 分页查询 的方式, 循环 处理数据。 比较常用的就是sql 中使用 limit 进行 分页查询 ,然后for 循环 处理数据。但是这样的方式虽说可行,但是代码未免有些繁琐。 比如说:sql 语句 要写两个方法  一个count 查询所有数据数量,第二个 limit 分页 查出list  为了简化 分页查询 ,可采用如下方式: 1.sql语句:user表  每次查询1000条, 这两天写了一个定时任务,关于查询表中快过期的卡,发送短信提醒,在查询中,因为生产上的数据数十万条,数据量大,如果直接一下子查出来,会对数据库造成很大的压力,用到 分页查询 ,按照正常逻辑,查询表中总数量,然后根据当前页以及每页数量, 循环 对数据库进行查询; // 分页查询 ,每次查询1000条数据 int pageSize = 1000;//每页数量 int page = 1;//定义总页数 MySQL 查询大量数据 分页 在上一篇文章: MySQL 查询大量数据所面临的一些问题,说明了在 MySQL 中查询大量数据所面临的问题。遇到查询大型数据,应该怎么解决呢?和容易想到就是 分页查询 ,这是一个正确的方法,应该如何 分页 ?最主要就是使用 MySQL 中的LIMIT 和 OFFSET关键字,下面是示例:SELECT * FROM Orders LIMIT 30;上面查询了:“订单”的表中选择1-30(含)之...   这个专栏之前定下的计划是每周会发布一篇,但现在距离上一篇文章的发布已经过去了3个多月的时间了。希望自己从这周开始接下来坚持每周至少输出一篇文章!欢迎各位同学朋友们积极监督!   好,废话少说!现在开始进入正题。这次教给大家的开发技巧就是学会使用while或do-while这两种 循环 结构进行 分页查询 ,这个 分页查询 的方式主要包括了查询数据库和调用接口这两种方式。可能这么说大家未必明白,没关系,接下来听我详细讲解。   比如有个业务需求是这样的:将系统A中所有用户的信息上报到B系统中进行数据分析。假设系统A. <insert id="addRoleModule" parameterType="java.util.List"> INSERT INTO T_P_ROLE_MODULE (ROLE_ID, MODULE_ID) VALUES <for. List<String> list = new ArrayList<String>(); //入参长度限制, 分页查询 List<DemoDto> demoDtos = new ArrayList<>(); if(!... Oracle 分页查询 语句(一):http://wu423.iteye.com/blog/510222 Oracle 分页查询 语句(二):http://wu423.iteye.com/blog/510223 Oracle 分页查询 语句(三):http://wu423.iteye.com/blog/510224