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. Cobbler 批量安装操作系统

    文章目录 环境准备 部署cobbler cobbler语法检查以及排错 问题1 问题2 问题3 问题4 问题5 问题6 问题7 问题8 修改dhcp模板 重启服务,再次检查 镜像配置 镜像导入 kic ...

  2. MyBatisPlus分页不起作用?因为少了配置

    /** @author QiuQiu&LL @create 2021-09-05 0:25 @Description: / @EnableTransactionManagement @Conf ...

  3. AQS源码二探-JUC系列

    本文已在公众号上发布,感谢关注,期待和你交流. AQS源码二探-JUC系列 共享模式 doAcquireShared 这个方法是共享模式下获取资源失败,执行入队和等待操作,等待的线程在被唤醒后也在这个 ...

  4. pytest--配置用例执行顺序(pytest_ordering插件介绍)

    前言 设置测试用例执行顺序: 默认情况下,pytest测试用例的执行顺序是按先外层后内层(目录下的文 件),再根据名称按ascii码值的顺序升序执行. 如果想自定义pytest测试用例的执行顺序,可以 ...

  5. Vue 源码解读(7)—— Hook Event

    前言 Hook Event(钩子事件)相信很多 Vue 开发者都没有使用过,甚至没听过,毕竟 Vue 官方文档中也没有提及. Vue 提供了一些生命周期钩子函数,供开发者在特定的逻辑点添加额外的处理逻 ...

  6. Windows server 2012安装VM tools异常解决办法

    在VMWare虚拟机上安装Windows Server 2012之 后安装VMWare Tools时报如下错误信息: 问题:缺少KB2919355补丁 (先安装KB2919442,在安装KB29193 ...

  7. Kali网络环境设置

    实验目的 掌握网卡.ssh.apache配置与开启 实验原理 在终端下,修改/etc/network/interfaces网卡文件,启动ssh和apache服务. 实验内容 网卡.ssh.apache ...

  8. [旧][Android] ButterKnife 浅析

    备注 原发表于2016.05.08,资料已过时,仅作备份,谨慎参考 前言 自上星期写 Retrofit 写吐之后 ... 我问大队长能不能换个其他什么东西写,大队长就说了个单词 ButterKnife ...

  9. 【计理01组30号】Java 实现日记写作软件

    项目分析 代码设计 com.shiyanlou.entity User.java package com.shiyanlou.entity; public class User { private S ...

  10. 编译安装nginx报错 checking for C compiler ... not found

    编译安装在执行./configure步骤报错,是因为缺少环境变量 checking for C compiler - not found ./configure: error: C compiler ...