精华内容
下载资源
问答
  • 最近没事儿,搭建了一个ssi框架,虽然问题依旧...后来做分页的时候由于不想像以前工作的时候做分页那样写两条SQL进行分页,就想到了运用拦截器进行SQL的重组,然后去执行。发现只有mybaits3才有,后来就升级到了mybatis

    最近没事儿,搭建了一个ssi框架,虽然问题依旧很多,但是收获依旧不少,先记录点点滴滴,以便以后有参考。

    之前本来打算运用ibatis2.3.4版本,因为之前工作就是用的ibatis2.3.4,所以对这个版本比较熟悉一些。后来做分页的时候由于不想像以前工作的时候做分页那样写两条SQL进行分页,就想到了运用拦截器进行SQL的重组,然后去执行。发现只有mybaits3才有,后来就升级到了mybatis3。

    分页拦截器如下(找了网上很多大神的方法,非我原创,原创出处已往,见谅):

    定义一个拦截器继承ibatis的Interceptor类,重写intercept(Invocation invocation)方法

    if (invocation.getTarget() instanceof RoutingStatementHandler) {
    RoutingStatementHandler statementHandler = (RoutingStatementHandler) invocation
    .getTarget();
    BaseStatementHandler delegate = (BaseStatementHandler) Tools
    .getValueByFieldName(statementHandler, "delegate");
    MappedStatement mappedStatement = (MappedStatement) Tools
    .getValueByFieldName(delegate, "mappedStatement");
    BoundSql boundSql = delegate.getBoundSql();
    // 只重写需要分页的sql语句。通过MappedStatement的ID匹配,默认重写以Page结尾的MappedStatement的sql
    String method = mappedStatement.getId();
    String sql = boundSql.getSql();
    if (mappedStatement.getId().matches(defaultPageSqlId)) {
    Object parameterObject = boundSql.getParameterObject();
    if (null != parameterObject) {
    Page<?> page = null;
    if (parameterObject instanceof Page) { // 参数就是Pages实体
    page = (Page<?>) parameterObject;
    } else { // 参数为某个实体,该实体拥有Pages属性
    Object obj = Tools.getObjByFieldName(parameterObject,
    "page");
    if (obj != null && obj instanceof Page) {
    page = (Page<?>) obj;
    } else {
    // 不存在page属性
    return invocation.proceed();
    }
    }
    if (null == page)
    return invocation.proceed();
    // 重写sql
    Connection connection = (Connection) invocation.getArgs()[0];
    String countSql = "select count(0) from (" + sql
    + " ) tmp_count ";
    PreparedStatement countStmt = connection
    .prepareStatement(countSql);
    Tools.setValueByFieldName(boundSql, "sql", countSql);
    DefaultParameterHandler ParameterHandler = new DefaultParameterHandler(
    mappedStatement, parameterObject, boundSql);
    ParameterHandler.setParameters(countStmt);
    ResultSet rs = countStmt.executeQuery();
    int count = 0;
    if (rs.next()) {
    count = rs.getInt(1);
    }
    rs.close();
    countStmt.close();
    page.setTotalCount(count);
    String pageSql = buildPageSql(sql, page);
    Tools.setValueByFieldName(boundSql, "sql", pageSql); // 将分页sql语句反射回BoundSql.
    logger.error("重写后的SQL:"
    + sql.replaceAll("[\\s]+", " ").replaceAll(
    "[\\s][,]{1}", ","));
    }
    }
    }
    return invocation.proceed();

    只拦截后缀名为Page结尾的方法。


    在mybatis中表明一对多的关系为

    <association property="files" column="applyInfoId" select="FileInfo.getFileInfos" javaType="String"/>

    而在ibatis2中则为<resultMap id="departMap" extends="baseMap" class="depart">
    <result property="children" column="{parentid=departid}" select="Depart.getDeparts" />
    <result property="users" column="{departid=departid}" select="User.getUsers" />
    </resultMap>

    这是3和2的一点小区别

    当加载xml文件时运行到这句代码就会去namespace为FileInfo下去寻找getFileInfos方法,并把column传过去。这样就完成了一对多的映射。

    初学,谨以此篇记录。

    内附完整的拦截类(拦截类非我原创,原创出处已忘,见谅)

    展开全文
  • oracle的分页查询

    2017-09-11 19:13:04
    其中最内层的查询SELECT * FROM TABLE_NAME...分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM   选择第21到40条记录存在两种方法,一种是上面

    其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。

     

    上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。

     

    选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:

     

     

    SELECT * FROM ( SELECT A.*, ROWNUM RN 
    FROM (SELECT * FROM TABLE_NAME) A ) WHERE RN BETWEEN 21 AND 40

     

     

    对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

     

    这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

     

    而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。

     

    上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。

     

    这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。下面简单讨论一下多表联合的情况。对于最常见的等值表连接查询,CBO一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。

     

    因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:

     

    SELECT /*+ FIRST_ROWS */ * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21

    展开全文
  • mysql分页

    2018-03-01 16:02:56
    1.分页的概念分页就是将数据以多页展示出来,使用分页的目的是为了提高用户的体验2.分页的分类:物理分页和逻辑分页物理分页:物理分页就是数据库本身提供了分页方式,如mysql的limit,好处是效率高,不好的地方就是...

    1.分页的概念
    分页就是将数据以多页展示出来,使用分页的目的是为了提高用户的体验
    2.分页的分类:物理分页和逻辑分页
    物理分页:
    物理分页就是数据库本身提供了分页方式,如mysql的limit,好处是效率高,不好的地方就是不同数据库有不同的搞法。
    逻辑分页:
    逻辑分页利用游标分页,好处是所有数据库都统一,坏处就是效率低。
    3.MySQL的物理分页,需要使用关键字limit
    limit用于MySQL数据库的分页,有2个参数
    a -- 代表的从哪条记录开始(默认是从0开始,0代表的是第一条记录)
    b -- 代表一次查询的记录的条数,一般都是固定的!!

    4.limit关键字的a和b参数是可以计算的
    a = (当前页 - 1) * b
    b = 固定的

    转载于:https://blog.51cto.com/13579086/2074319

    展开全文
  • 数据库分页

    2016-02-20 10:56:00
    2.分页的目的 美观 提高效率 3.分页方式 假分页 真分页  区别:  假分页是将需要的记录全部查询出来一次加载在内存中,然后从内存中取出一定的记录条数进行显示。  真分页是每次真的从数据库中...

    1.分页的概念

      从数据库中查询出的记录分页显示。

    2.分页的目的

    • 美观
    • 提高效率

    3.分页方式

    • 假分页
    • 真分页

      区别:

        假分页是将需要的记录全部查询出来一次加载在内存中,然后从内存中取出一定的记录条数进行显示。

        真分页是每次真的从数据库中取出一定的记录条数。

        显然,假分页更加消耗内存,在数据量很大时效率很低。因此,只有在数据量很小的时候才会考虑假分页,在实际应用中应用很多的是真分页。

     

    4.如何分页

     select * from(
      select e.*,rownum r from(
        select * from t_temp order by empno
      )e
    )where r<=end and r>=begin

    已知条件
    1.当前页currentPage
    2.每页显示的最大行pageSize

    容易推出
    1.本页最后一行=currentPage * pageSize
    2.上页最后一行=( currentPage - 1 ) * pageSize

    推导公式
    1.本页起始行
    begin =上页最后一行 + 1
    =( currentPage - 1 ) * pageSize + 1
    2.本页终止行
    end =本页最后一行
    =currentPage * pageSize

    5.总结

    (1)数据库分页分为两种:真分页和假分页。实际应用中比较多的是真分页。

    (2)真分页计算公式:

      本页起始行 = ( 当前页 - 1 ) * 每页显示最大行 + 1;

      本页终止行 = 当前页 * 每页显示最大行

    (3)分页查询SQL语句:

      select * from(

       select e.*,rownum r from(           ---->step2:得到虚表e的「行号」和「全部记录」,便于分页  

        select * from emp order by empno     ---->step1:查询出所有记录并排序【虚表e】

       )e

      )where r>=begin and r<=end          ---->step3:按照分页条件查询最终结果(注意将begin和end用公式替换)

     

    转载于:https://www.cnblogs.com/helloIT/p/5202869.html

    展开全文
  • 分页查询

    2021-01-31 17:06:18
    首先是我们使用分页的目的是减少查询代码量。 limit分页 这种查询方式实在sql层进行的,也是我们基本的分页查询方法。 首先是我们在接口中添加这个方法 List<User> getUserByLimit(Map<String,Integer> ...
  • 分页的目的 前台分页 1、提高性能,在某些情况下,我们并不需要查询很大的数据量,在这种情况下,我们在程序中开辟一个内存(其实就是自...
  • oracle 分页

    2013-08-30 23:30:05
    分页的目的就是控制输出结果集大小,将结果尽快的返回。 分页查询格式(一):  select *  from (select a.*, rownum rn  from (select * from csl.sys_user) a  where rownum  where rn > 90; 其中最...
  • 通过编写分页过程 目的是让大家把前面学习各个技术综合运行 因为分页过程比较复杂 所以采用循序渐进方式 讲解 1、如何在java程序中调用一个不含返回值过程 在主方法中使用存储过程 String sql = "{call ...
  • 分页

    2019-12-07 17:32:39
    目的? 提升响应速度 提升用户体验 可以帮助用户节约资源 实现分页 page第几页(页码) per_page 页面数据量(每一页显示多少条) 要求每一页十条 显示第五页数据 跳过前(5-1)*10 offset ...
  • 通用分页(一)

    2020-05-31 01:13:20
    文章目录回顾以前分页流程改良的分页:通用分页通用分页的目的通用分页的思路1、先利用自己以前所学的知识完成一个普通的查询方法2、将原有的查询方法进行反射优化,转变成一个可以被所有实体类和dao层继承的通用...
  • 程序自动设置了分页标志,保存在模板的在第一列中,打开mbManu中的模板文件就能看到:  可以对mbManu目录下的模板文件中的分页标志位置进行调整,达到灵活分页的目的
  • 存储器以及分页 分段

    2018-11-22 19:36:02
    分页的目的是更细粒度的处理空间,减少粗放管理的浪费或开销问题。   离散分配内存: 作业规定大小划分成小份;内存也按同样大小划分成小份 作业的任一小份可分散放入内存任意未使用的小份     注:分页...
  • MySQL分页的主要目的就是提升效率,今天我们将简单介绍如何构建高效MySQL分页。首先看一下分页的基本原理:limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是...
  • MySQL分页的主要目的就是提升效率,今天我们将简单介绍如何构建高效MySQL分页。首先看一下分页的基本原理:limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是...
  • gridview分页的问题

    2019-10-08 14:28:26
    但是当我点击这个第三页的时候就会出现4个分页(实际上就是这个版块的全部信息),而我的目的是想点击这个审核通过然后再点分页保持全部属于这类的信息。 转载于:...
  • 分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 ...其中最内层的查询SELECT * FROM TABLE_NAME...分页的目的就是控制输出结果集
  • 4.3内存离散分配 分页

    2018-12-11 18:31:00
    分页的目的是更细粒度的处理空间,减少粗放管理的浪费或开销问题。 离散分配内存: 作业规定大小划分成小份,内存也按同样大小划分成小份 作业的任一小份可分散放入内存任意未使用的小份 分页方式下,内存的使用...
  • JAVA WEB开发分页算法

    2016-11-15 19:50:39
    分页是所有的项目使用之中最为常见的功能之一,并且分页的目的是为了减少数据的读取数量。大家试想,如果一张表中的数据非常多,这时如果不采用分页而是将所有的数据都加载显示,那么会出现如下两个问题: -|加载的...
  • 逻辑分页:对查询结果进行处理达到分页的目的,但是可能需要查询出多余的数据,降低了性能 写之前先简单分析一下插件的原理: 插件的基本原理是使用Mybatis提供的插件接口,拦截方法中拦截Mybatis四大对象中方法(对...
  • 分页实现:Offset-Fetch

    2019-09-29 05:11:34
    分页实现的方法又多了一种,在SQLServer 2012版本中,TSQL在Order By子句中新增 Offset-Fetch子句,用于从有序的结果集中,跳过一定数量的数据行,获取指定数量的数据行,从而达到数据行分页的目的。经过测试,从...
  • 4.5分页存储管理方式

    2018-12-08 21:17:41
    分页的目的是更细粒度的处理空间,减少粗放管理的浪费或开销问题。 一、概念 1.页面 内存划分成多个小单元,每个单元K大小,称(物理)块。 作业也按K单位大小划分成片,称为页面。 物理划分块的大小 = 逻辑划分的...
  • 分页的目的不是简单的为了界面的美观,也是为了防止一次查找到过多的数据占用服务器内存。分页其实就是限制查找的SQL语句一次只能查找到一页的数据量,然后以分页的形式展示出来。 所以简单总结下分页的好处: ...
  •  分页的目的是更细粒度的处理空间,减少粗放管理的浪费或开销问题。     离散分配内存: 作业规定大小划分成小份;内存也按同样大小划分成小份 作业的任一小份可分散放入内存任意未使用的...
  • 我终于理解了JSP 的分页

    千次阅读 2005-03-18 23:28:00
    所以我们要分页显示,每页显示10或20行,分页的目的就这样简单. 分页的方法有很多种,也许有些效率要高些,我这里只能参考最简单能实现的方法:现查询出有多少条记录,然后计算出一共分几页,然后分别显示每一页.查询出有...
  • ThinkPHP分页的实现

    千次阅读 2013-05-19 11:07:17
    分页类需要和查询相结合,我们可以使用ThinkPHP自带的limit方法或者page方法,目的就是为了获取当前分页的数据(也有先获取完整数据然后前端分页显示的方法,不在本文描述内容中,也不建议)。使用limit方法或者page...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,265
精华内容 506
关键字:

分页的目的