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() // 执行具体的业务逻辑