Mybatis九( mybatis插件的原理及使用)
1.插件执行原理


一、demo
1.测试类
@Test
public void test1() {
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.clearCache();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User selectUserById = mapper.selectUser();
System.out.println(selectUserById);
sqlSession.commit();
// 释放资源
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
2.plugin
对封装参数进行拦截
package plugin; import java.util.Properties; import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
@Intercepts({
@Signature(type=StatementHandler.class ,method="parameterize",args=java.sql.Statement.class)
})
public class ParamPlugin implements Interceptor { @Override
public Object intercept(Invocation invocation) throws Throwable {
// TODO Auto-generated method stub
System.out.println("interceptor开始:");
Object target = invocation.getTarget();
System.out.println("当前拦截目标对象:"+target);
//拿到:StatementHandler==>parameterHandler==>parameterObject
//拿到target的元数据
MetaObject metaObject = SystemMetaObject.forObject(target);
System.out.println(metaObject);
Object value = metaObject.getValue("parameterHandler.parameterObject");
System.out.println("sql语句的参数是:"+value);
//修改sql语句的参数
metaObject.setValue("parameterHandler.parameterObject", );
//执行目标方法并返回
return invocation.proceed();
} @Override
public Object plugin(Object target) {
// TODO Auto-generated method stub
return Plugin.wrap(target, this);
} @Override
public void setProperties(Properties properties) {
// TODO Auto-generated method stub } }
3.
<plugins>
<plugin interceptor="plugin.ParamPlugin"></plugin>
</plugins>
二、mybatis分页基于plugin实现原理
1.配置plugin
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- config params as the following -->
<!-- <property name="param1" value="value1"/> -->
</plugin>
2.使用插件分页
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// Page<Object> page = PageHelper.startPage(2,3);
// List<User> users = mapper.selectAllUser();
// for (User user: users) {
// System.out.println(user.toString());
// }
// System.out.println("当前页码:"+page.getPageNum());
// System.out.println("总记录数:"+page.getTotal());
// System.out.println("每页记录数:"+page.getPageSize());
// System.out.println("总页码数:"+page.getPages());
PageHelper.startPage(, );
List<User> list = mapper.selectAllUser();
//用PageInfo对结果进行包装
PageInfo page = new PageInfo(list,);
//测试PageInfo全部属性
//PageInfo包含了非常全面的分页属性
// assertEquals(1, page.getPageNum());
// assertEquals(10, page.getPageSize());
// assertEquals(1, page.getStartRow());
// assertEquals(10, page.getEndRow());
// assertEquals(183, page.getTotal());
// assertEquals(19, page.getPages());
// assertEquals(1, page.getFirstPage());
// assertEquals(8, page.getLastPage());
// assertEquals(true, page.isFirstPage());
// assertEquals(false, page.isLastPage());
// assertEquals(false, page.isHasPreviousPage());
// assertEquals(true, page.isHasNextPage());
sqlSession.commit();
// 释放资源
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Mybatis九( mybatis插件的原理及使用)的更多相关文章
- Mybatis之plugin插件设计原理
大多数框架,都支持插件,用户可通过编写插件来自行扩展功能,Mybatis也不例外. 我们从插件配置.插件编写.插件运行原理.插件注册与执行拦截的时机.初始化插件.分页插件的原理等六个方面展开阐述. 一 ...
- MyBatis(九):MyBatis类型处理器(TypeHandler)详解
TypeHandler简介 TypeHandler,顾名思义类型转换器,就是将数据库中的类型与Java中的类型进行相互转换的处理器. MyBatis 在设置预处理语句(PreparedStatemen ...
- 【MyBatis源码分析】插件实现原理
MyBatis插件原理----从<plugins>解析开始 本文分析一下MyBatis的插件实现原理,在此之前,如果对MyBatis插件不是很熟悉的朋友,可参看此文MyBatis7:MyB ...
- Mybatis源码分析之插件的原理
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用. 默认情况下,可以使用插件来拦截的方法调用包括: Executor (update, query, flushStatements, ...
- mybatis 插件的原理-责任链和动态代理的体现
目录 1 拦截哪些方法 2 如何代理 3 代理对象 4 责任链设计模式 @ 如果没有自定义过拦截器, 可以看我前面的文章.如果不知道 JDK 动态代理怎么使用的, 可以看我这文章. 责任链设计模式理解 ...
- 送命题:讲一讲Mybatis插件的原理及如何实现?
持续原创输出,点击上方蓝字关注我吧 目录 前言 环境配置 什么是插件? 如何自定义插件? 举个栗子 用到哪些注解? 如何注入Mybatis? 测试 插件原理分析 如何生成代理对象? 如何执行? 总结 ...
- mybatis是如何分页的,分页插件的原理是什么
mybatis是如何分页的,分页插件的原理是什么 代码之尖关注 12018.12.28 17:11:12字数 529阅读 19,877 1. SQL 分页 <select id="qu ...
- Mybatis 是如何进行分页的?分页插件的原理是什么?
Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内 存分页,而非物理分页.可以在 sql 内直接书写带有物理分页的参数来完成物理分 页功能,也可以使用 ...
- Mybatis拦截器(插件实现原理)
在mybatis的mybatis.cfg.xml中插入: <plugins> <plugin interceptor="cn.sxt.util.PageIntercepto ...
随机推荐
- PyQt5显示一个空白的窗口
效果如下图: """ In this example, we create a simple window in PyQt5. """ # ...
- 修改最后一次 已commit 的备注
输入命令 git commit --amend 会展示出最后一次提交的 备注信息 按 i 进行编辑 按esc 退出编辑 再按 shift +: (注意是英文的冒号),切换到命令行 wq 保存 即可 参 ...
- R语言—使用函数sample进行抽样
在医学统计学或者流行病学里的现场调查.样本选择经常会提到一个词:随机抽样.随机抽样是为了保证各比较组之间均衡性的一个很重要的方法.那么今天介绍的第一个函数就是用于抽样的函数sample: > ...
- openstack云主机硬盘复制查询
假定客户在自己的电脑上创建文件后 #宿主机查看客户使用的是哪个磁盘 [root@compute1 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta ...
- public class的类名必须跟文件名保持一致吗?
- [UE4]Actor的Destroyed事件
- sqlserver 模糊查询,连表,聚合函数,分组
use StudentManageDB go select StudentName,StudentAddress from Students where StudentAddress like '天津 ...
- 解决ExtNET ExtJS 特定日期选择月份跳转导致无法选择月份的问题
背景 项目使用 Ext.NET 2.2.0.40838 , 对应Ext JS4.2版本. 结果 2017/3/31 号的时候偶然间点日历选择控件选择2月,10月等月份突然就跳到3月份,9月份之类. 就 ...
- 18 LVM逻辑卷管理
根据上一节的内容,我们知道md这个内核模块可以用来做软RAID的管理.同时RAID实现了两个功能:1.提高了磁盘的读写能力:2.对于数据进行了冗余备份: 但是,如果是管理员手动误删的数据,则一样无法找 ...
- RecyclerView.Adapter封装,最简单实用的BaseRecyclerViewAdapter;只需重写一个方法,设置数据链式调用;
之前对ListView的BaseAdapter进行过封装,只需重写一个getView方法: 现在慢慢的RecyclerView成为主流,下面是RecyclerView.Adapter的封装: Base ...