mybatis是如何分页的,分页插件的原理是什么

12018.12.28 17:11:12字数 529阅读 19,877

1. SQL 分页

<select id="queryStudentsBySql" parameterType="map" resultMap="studentmapper">

select * from student limit #{currIndex} , #{pageSize}

</select>

2. 使用拦截器分页

创建拦截器,拦截mybatis接口方法id以ByPage结束的语句

String sql = (String) MetaObjectHandler.getValue("delegate.boundSql.sql");

//也可以通过statementHandler直接获取

//sql = statementHandler.getBoundSql().getSql();

//构建分页功能的sql语句            String limitSql;

sql = sql.trim();

limitSql = sql + " limit " + (currPage - 1) * pageSize + "," + pageSize;

//将构建完成的分页sql语句赋值个体'delegate.boundSql.sql',偷天换日           MetaObjectHandler.setValue("delegate.boundSql.sql", limitSql);


<configuration>

<plugins>

<plugin interceptor="com.autumn.interceptor.MyPageInterceptor">

<property name="limit" value="10"/>

<property name="dbType" value="mysql"/>

</plugin>

</plugins>

</configuration>

通过自定义插件的形式实现分页,也是最好的,也叫做分页拦截器。实现步骤如下:

插件支持MySQL和Oracle两种数据库,通过方法名关键字ListPage去匹配,有才进行分页处理,并且不用在Mapping中写分页代码。

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

<typeAliases>

<typeAlias alias="PageInfo" type="com.jsoft.testmybatis.util.PageInfo" />

</typeAliases>

<plugins>

<plugin interceptor="com.jsoft.testmybatis.util.PagePlugin">

<property name="dialect" value="mysql" />

<property name="pageSqlId" value=".*ListPage.*" />

</plugin>

</plugins>

</configuration>


3. RowBounds分页

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

数据量小时,RowBounds不失为一种好办法。但是数据量大时,实现拦截器就很有必要了。

mybatis接口加入RowBounds参数

(1)Dao:

public List queryUsersByPage(String userName, RowBounds rowBounds);

(2)Service:

@Override

@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS)

publicList queryRolesByPage(String roleName,intstart,int limit) {

returnroleDao.queryRolesByPage(roleName,new RowBounds(start, limit));

}


分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10

 
 

55人点赞

 

mybatis是如何分页的,分页插件的原理是什么的更多相关文章

  1. Mybatis 是如何进行分页的?分页插件的原理是什么?

    Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内 存分页,而非物理分页.可以在 sql 内直接书写带有物理分页的参数来完成物理分 页功能,也可以使用 ...

  2. 传统方式和插件方式 分别实现 分页 功能 pageHelper 插件

    实现分页  这里提供两种方式  一种是传统的分页方式  一种是基于pageHelper插件 实现的分类     推荐使用后者 前者是一般开发的方式   思路  先手动创建一个 pageUtil 工具 ...

  3. spring boot集成mybatis(2) - 使用pagehelper实现分页

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  4. 基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用

    在上篇<基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理>介绍了Bootstrap开发框架的一些基础性概括,包括总体界面效果,以及布局.菜单等内容, ...

  5. mybatis分页助手分页

    一.编写dao及配置文件 (1)配置文件两种方式 第一种: <!--SqlSeesionFactoryBean对象--><bean id="sqlSessionFactor ...

  6. Mybatis九( mybatis插件的原理及使用)

    1.插件执行原理 一.demo 1.测试类 @Test public void test1() { String resource = "mybatis-config.xml"; ...

  7. Mybatis源码分析之插件的原理

    MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用. 默认情况下,可以使用插件来拦截的方法调用包括: Executor (update, query, flushStatements, ...

  8. 送命题:讲一讲Mybatis插件的原理及如何实现?

    持续原创输出,点击上方蓝字关注我吧 目录 前言 环境配置 什么是插件? 如何自定义插件? 举个栗子 用到哪些注解? 如何注入Mybatis? 测试 插件原理分析 如何生成代理对象? 如何执行? 总结 ...

  9. Mybatis之plugin插件设计原理

    大多数框架,都支持插件,用户可通过编写插件来自行扩展功能,Mybatis也不例外. 我们从插件配置.插件编写.插件运行原理.插件注册与执行拦截的时机.初始化插件.分页插件的原理等六个方面展开阐述. 一 ...

随机推荐

  1. Linux海王 之 pdsh (并行管理工具)

    文章目录 安装 使用 示例 -w 指定主机 -l 指定用户 -g指定用户组 主机列表 交互式界面 pdsh是一个多线程远程shell客户机,它在多个远程主机上并行执行命令 pdsh可以使用几种不同的远 ...

  2. 40多个丰富的QQ特效代码,非常实用哦!

    Hi,我们好,我是GG!微信和QQ是现在干流的两款社交东西.有人说微信现已完全替代了QQ,现已没有人玩QQ了.可是小雨却不这么以为,毕竟微信和QQ的用户集体是不一样的,它们在功能上的定位也是不一样的. ...

  3. 非对称加解密 Asymmetric encryption 对称加密和非对称加密的区别

    考虑这样一个问题:一切的装备文件都存储在 Git 长途库房,RAR密码破解装备文件中的一些信息又是比较灵敏的.所以,我们需求对这些灵敏信息进行加密处理.首要的加密方法分为两种:一种是同享密钥加 密(对 ...

  4. SpringCloud微服务实战——搭建企业级开发框架(三十八):搭建ELK日志采集与分析系统

      一套好的日志分析系统可以详细记录系统的运行情况,方便我们定位分析系统性能瓶颈.查找定位系统问题.上一篇说明了日志的多种业务场景以及日志记录的实现方式,那么日志记录下来,相关人员就需要对日志数据进行 ...

  5. [镜像转换] ova文件转换成raw文件, 导入到openstack

    ova转raw 使用工具: qemu-img.libguestfs-tools.libguestfs-winsupport # 从vmware导出ova文件, tar 解压导出来的ova文件 $ ta ...

  6. sql server 数据字符串替换函数

    sql server 替换函数 replace 函数参数 REPLACE(string_expression, string_pattern, string_replacement) 1.string ...

  7. 从零搭建Pytorch模型教程(一)数据读取

    ​  前言  本文介绍了classdataset的几个要点,由哪些部分组成,每个部分需要完成哪些事情,如何进行数据增强,如何实现自己设计的数据增强.然后,介绍了分布式训练的数据加载方式,数据读取的整个 ...

  8. 微信小程序里实现跑马灯效果

    在微信小程序 里实现跑马灯效果,类似滚动字幕或者滚动广告之类的,使用简单的CSS样式控制,没用到JS wxml: <!-- 复制的跑马灯效果 --> <view class=&quo ...

  9. Qt:QThread

    0.说明 QThread提供了一种与平台无关的线程管理方法. 一个QThread对象管理一个线程.QThread通过run()方法启动线程.默认情况下,run()方法通过exec()启动一个事件循环, ...

  10. anaconda及jupyter notebook的了解及使用方法(1)

    今日内容 anaconda软件使用 jupyter notebook基本使用及快捷键 numpy anaconda软件使用 1.进入anaconda主页点击jupyter启动即可 呼起一个jupyte ...