MyBatis之拦截器分页
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,鲁春利的工作笔记,好记性不如烂笔头数据库的分页主要有物理分页和逻辑分页。物理分页:数据库本身提供的分页方式,如MySQL的limit、Oracle的rownum、SqlServer的top,好处是效率
千家信息网最后更新 2026年10月31日MyBatis之拦截器分页
鲁春利的工作笔记,好记性不如烂笔头
数据库的分页主要有物理分页和逻辑分页。
物理分页:数据库本身提供的分页方式,如MySQL的limit、Oracle的rownum、SqlServer的top,好处是效率高,不好的地方就是不同数据库有不同的查询方式。
逻辑分页:从数据库将所有记录查询出来,存储到内存中,然后数据再直接从内存中获取并筛选分页,好处是能够统一查询方式,不好的地方是效率低,因为每次都要把全部数据查询出来再处理。
常用orm框架采用的分页技术:
①:hibernate采用的是物理分页;
②:MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然在再根据offset和limit截断记录。
MetaObject
org.apache.ibatis.reflection.MetaObject是Mybatis提供的一个的工具类,Mybatis在sql参数设置和结果集映射里经常使用到这个对象。
属性:
// 原始对象 private Object originalObject; // 对原始对象的一个封装 private ObjectWrapper objectWrapper; // org.apache.ibatis.reflection.factory.DefaultObjectFactory的父类 private ObjectFactory objectFactory; // org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory的父类 private ObjectWrapperFactory objectWrapperFactory;
方法:
// 用于包装对象MetaObject forObject(Object object,ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory)// 用于获取属性的值(支持OGNL的方法)Object getValue(String name)// 用于设置属性的值(支持OGNL的方法)void setValue(String name, Object value)
构造方法
private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory) { this.originalObject = object; this.objectFactory = objectFactory; this.objectWrapperFactory = objectWrapperFactory; if (object instanceof ObjectWrapper) { this.objectWrapper = (ObjectWrapper) object; } else if (objectWrapperFactory.hasWrapperFor(object)) { this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object); } else if (object instanceof Map) { this.objectWrapper = new MapWrapper(this, (Map) object); } else if (object instanceof Collection) { this.objectWrapper = new CollectionWrapper(this, (Collection) object); } else { this.objectWrapper = new BeanWrapper(this, object); } }forObject方法
public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory) { if (object == null) { return SystemMetaObject.NULL_META_OBJECT; } else { return new MetaObject(object, objectFactory, objectWrapperFactory); } }getValue
public Object getValue(String name) { PropertyTokenizer prop = new PropertyTokenizer(name); if (prop.hasNext()) { MetaObject metaValue = metaObjectForProperty(prop.getIndexedName()); if (metaValue == SystemMetaObject.NULL_META_OBJECT) { return null; } else { // 这里相当于递归调用,直到最后一层。例如user.cust.custId // 第一次递归cust.custId // 第二次递归custId,这个就是真正访问要返回的 return metaValue.getValue(prop.getChildren()); } } else { return objectWrapper.get(prop); } }setValue
public void setValue(String name, Object value) { PropertyTokenizer prop = new PropertyTokenizer(name); if (prop.hasNext()) { MetaObject metaValue = metaObjectForProperty(prop.getIndexedName()); if (metaValue == SystemMetaObject.NULL_META_OBJECT) { if (value == null && prop.getChildren() != null) { return; // don't instantiate child path if value is null } else { metaValue = objectWrapper.instantiatePropertyValue(name, prop, objectFactory); } } metaValue.setValue(prop.getChildren(), value); } else { objectWrapper.set(prop, value); } }拦截器签名
@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class}) })public class PreparePaginationInterceptor extends BaseInterceptor {从签名里可以看出,要拦截的目标类型是StatementHandler(注意:type只能配置成接口类型),拦截的方法是名称为prepare参数为Connection类型的方法。
说明:关于为什么要把拦截器加到StatementHandler请参阅MyBatis之SqlSession介绍
数据
方法
查询
对象
数据库
属性
方式
物理
类型
逻辑
递归
拦截器
不同
原始
不好
内存
参数
地方
好处
就是
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网黑科技
上海挚品互联网科技有限公司
上海睿民互联网科技有限公司
互联网科技产业
河南真二互联网科技有限公司
中国 科技 互联网
互联网科技公司电话
腾讯科技 互联网女皇
互联网 科技服务平台
隆华科技工业互联网
昭通互联网科技选哪家
青海科技产业互联网发展
如何创新互联网科技
朱啸虎曾投资哪些互联网科技企业
互联网科技实习生岗位
本届互联网大会上的黑科技
2021世界互联网领先科技成果发布
科技和互联网行业的特点
互联网的科技体现在哪里
瑞安市蟠桃会互联网科技有限公司
咖啡
北京路客互联网科技有限公司
中国互联网科技工作委员会毛军
港股互联网科技股
合肥互联网科技公司
以房互联网科技
贷财互联网科技
深圳期待互联网科技
互联网科技实习生岗位
互联网科技快讯热点