MyBatis有哪些分页方式及原理?MySql分页?Oracle分页? Mybatis 的插件运行原理?

MyBatis有哪些分页方式?

正常人,一般使用物理分页。
分为逻辑分页和物理分页

所谓逻辑分页,是指使用MyBatis自带的RowBounds进行分页,它会一次性查出多条数据,然后再检索分页中的数据,具体一次性查询多少条数据,受封装jdbc配置的fetch-size决定

而物理分页,是从数据库中查询指定条数的数据,而我们用的分页插件PageHelper实现的就是物理分页

MySQL分页

limit(m,n) m下标 n条数
主键索引加limt where id_pk > x limt n

Oracle分页

rownum实现 PageHelper就是对sql的封装
over函数
rowid+rownum

MyBatis分页插件的原理是什么?

首先,在MyBatis内部定义了一个拦截器接口
所有的插件都要实现该接口,来,我们看看这个接口的定义

public interface Interceptor {
  Object intercept(Invocation invocation) throws Throwable;
  Object plugin(Object target);
  void setProperties(Properties properties);
}

那么其中一个关键的方法就是intercept,从而实现拦截

分页插件的原理就是使用MyBatis提供的插件接口,实现自定义插件,在插件的拦截方法内,拦截待执行的SQL,设置的分页参数,重写SQL ,生成带有分页语句的SQL,执行重写后的SQL,从而实现分页

所以原理还是基于拦截器

Mybatis 的插件运行原理,如何编写一个插件

Mybatis 只支持针对 ParameterHandler、ResultSetHandler、StatementHandler、Executor 这4 种接口的插件, Mybatis 使用 JDK 的动态代理, 为需要拦截的接口生成代理对象以实现接口方法拦截功能, 每当执行这 4 种接口对象的方法时,就会进入拦截方法,具体就是 InvocationHandler 的invoke() 方法, 拦截那些你指定需要拦截的方法。

编写插件: 实现 Mybatis 的 Interceptor 接口并复写 intercept()方法, 然后在给插件编写注解, 指定要拦截哪一个接口的哪些方法即可, 在配置文件中配置编写的插件。

@Intercepts({
@Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class}), 
@Signature(type = StatementHandler.class, method = "update", args = {Statement.class}), 
@Signature(type = StatementHandler.class, method = "batch", args = { Statement.class })
}) 

@Component

 invocation.proceed() // 执行具体的业务逻辑
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值