您好、欢迎来到现金彩票网!
当前位置:打鱼棋牌游戏平台 > 物理分页 >

Mybatis 通用mapper 分页插件工具

发布时间:2019-05-31 13:14 来源:未知 编辑:admin

  Spring 进行集成时,分为 XML 和注解配置两种方式,每种方式又有不同的配置方式。

  这种配置方式基本上和任何第三方都不会冲突,如果你遇到了第三方重写SqlSessionFactoryBean的情况,就使用前一种方式配置即可。

  使用spring 的属性配置方式,可以使用plugins属性像下面这样配置:

  分页插件提供了多个可选参数,这些参数使用时,按照上面两种配置方式中的示例配置即可。

  下面几个参数都是针对默认dialect 情况下的参数。使用自定义 dialect 实现时,下面的参数没有任何作用。

  helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:

  你也可以实现AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。

  offsetAsPageNum:默认值为false,该参数对使用RowBounds作为分页参数时有效。 当该参数设置为true时,会将RowBounds中的offset参数当成pageNum使用,可以用页码和页面大小两个参数进行分页。

  pageSizeZero:默认值为false,当该参数设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是Page类型)。

  reasonable:分页合理化参数,默认值为false。当该参数设置为true时,pageNum=0时会查询第一页,pageNumpages(超过总数时),会查询最后一页。默认false时,直接根据参数进行查询。

  autoRuntimeDialect:默认值为false。设置为true时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,只能使用sqlserver),用法和注意事项参考下面的

  closeConn:默认值为true。当使用运行时动态数据源或没有设置helperDialect属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认true关闭,设置为false后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。

  aggregateFunctions(5.1.5+):默认为所有常见数据库的聚合函数,允许手动添加聚合函数(影响行数),所有以聚合函数开头的函数,在进行 count 转换时,会套一层。其他函数和列会被替换为 count(0),其中count列可以自己配置。

  单独看每个参数的说明可能是一件让人不爽的事情,这里列举一些可能会用到某些参数的情况。

  如果你仍然在用类似ibatis式的命名空间调用方式,你也许会用到rowBoundsWithCount,分页插件对RowBounds支持和MyBatis 默认的方式是一致,默认情况下不会进行 count 查询,如果你想在分页查询时进行 count 查询, 以及使用更强大的PageInfo类,你需要设置该参数为true。

  如果觉得某个地方使用分页后,你仍然想通过控制参数查询全部的结果,你可以配置pageSizeZero为true,配置后,当pageSize=0或者RowBounds.limit = 0就会查询出全部的结果。

  如果你分页插件使用于类似分页查看列表式的数据,如新闻列表,软件列表,你希望用户输入的页数不在合法范围(第一页到最后一页之外)时能够正确的响应到正确的结果页面,那么你可以配置reasonable为true,这时如果pageNum=0会查询第一页,如果pageNum总页数会查询最后一页。

  如果你在Spring 中配置了动态数据源,并且连接不同类型的数据库,这时你可以配置autoRuntimeDialect为true,这样在使用不同数据源时,会使用匹配的分页进行查询。这种情况下,你还需要特别注意closeConn参数,由于获取数据源类型会获取一个数据库连接,所以需要通过这个参数来控制获取连接后,是否关闭该连接。 默认为true,有些数据库连接关闭后就没法进行后续的数据库操作。而有些数据库连接不关闭就会很快由于连接数用完而导致数据库无响应。所以在使用该功能时,特别需要注意你使用的数据源是否需要关闭数据库连接。

  当不使用动态数据源而只是自动获取helperDialect时,数据库连接只会获取一次,所以不需要担心占用的这一个连接是否会导致数据库出错,但是最好也根据数据源的特性选择是否关闭连接。

  使用这种调用方式时,你可以使用RowBounds参数进行分页,这种方式侵入性最小,我们可以看到,通过RowBounds方式调用只是使用了这个参数,并没有增加其他任何内容。

  分页插件检测到使用了RowBounds参数时,就会对该查询进行物理分页。

  关于这种方式的调用,有两个特殊的参数是针对RowBounds的,你可以参看上面的场景一和场景二

  注:不只有命名空间方式可以用RowBounds,使用接口的时候也可以增加RowBounds参数,例如:

  注意:由于默认情况下的RowBounds无法获取查询总数,分页插件提供了一个继承自RowBounds的PageRowBounds,这个对象中增加了total属性,执行分页查询后,可以从该属性得到查询总数。

  在你需要进行分页的MyBatis 查询方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。

  当调用这个方法时,由于同时发现了pageNumKey和pageSizeKey参数,这个方法就会被分页。params 提供的几个参数都可以这样使用。

  除了上面这种方式外,如果User 对象中包含这两个参数值,也可以有下面的方法:

  注意:pageNum和pageSize两个属性同时存在才会触发分页操作,在这个前提下,其他的分页参数才会生效。

  ISelect 接口方式除了可以保证安全外,还特别实现了将查询转换为单纯的 count 查询方式,这个方法可以将任意的查询方法,变成一个select count(*)的查询方法。

  PageHelper方法使用了静态的ThreadLocal参数,分页参数和线程是绑定的。

  如果代码在进入Executor前发生异常,就会导致线程不可用,这属于人为的 Bug(例如接口方法和 XML 中的不匹配,导致找不到MappedStatement时), 这种情况由于线程不可用,也不会导致ThreadLocal参数被错误的使用。

  这种情况下由于param1 存在 null 的情况,就会导致 PageHelper 生产了一个分页参数,但是没有被消费,这个参数就会一直保留在这个线程上。当这个线程再次被使用时,就可能导致不该分页的方法去消费这个分页参数,这就产生了莫名其妙的分页。

  如果你对此不放心,你可以手动清理ThreadLocal存储的分页参数,可以像下面这样使用:

http://lotusyogacenter.com/wulifenye/37.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有