MyBatis之拦截器分页
发表于:2025-11-06 作者:千家信息网编辑
千家信息网最后更新 2025年11月06日,鲁春利的工作笔记,好记性不如烂笔头数据库的分页主要有物理分页和逻辑分页。物理分页:数据库本身提供的分页方式,如MySQL的limit、Oracle的rownum、SqlServer的top,好处是效率
千家信息网最后更新 2025年11月06日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安全错误
数据库的锁怎样保障安全
美国保护网络安全吗
南京百家居网络技术
网络安全教程视频教程
做域控服务器
视频服务器海康6004
用网页上传数据到数据库
金华云软件开发要求
天津塘沽区临床试验数据库
软件开发合同知识产权约束
gis服务器里图层如何处理
家居软件开发公司电话
计算机网络技术可以进国企吗
北京移动宽带服务器云服务器
snc网络技术
西继迅达服务器
承德软件开发要多少钱
云服务器 系统盘容量
兰州ktv服务器
服务器换了影响收录吗
国家网络安全周系列活动之
计算机网络技术与应用知识点
服务器为什么只有一个端口用不了
数据库的通信技术
数据库系统环境安全
263邮箱服务器
英语网络技术好考吗
租用独立服务器的好处
南通盈通网络技术
扬州idc服务器哪个厂家质量好
怎么修改服务器上的源代码