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 ...
随机推荐
- sql server 清除数据库中所有表的数据
CREATE PROCEDURE sp_DeleteAllData AS EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'- ...
- Observable讲解
参见这里 总结: Observable是传统观察者+链式模式的函数式实现 Observable官方文档 还是比较喜欢EventBus,简单粗暴,angular-event-service可支持angu ...
- 黄聪:在.NET中使用GeckoFX 29
GeckoFX is a .NET control, that works similarly to “System.Windows.Forms.WebBrowser” Control, while ...
- C++进阶--结构体和类
// 单纯从语言上来说,两者唯一的区别是,默认成员是公有还是私有 // 从使用习惯上 // 小的消极对象,包含公有数据,没有或仅有很少的基本的成员函数 -- 数据容器 struct Person_t ...
- ==和is
is是比较两个引用是否指向了同一个对象(引用比较) ==是比较两个对象是否相等 数字在:-5~256之间的时候用来赋值的内存地址是不变的
- HTML+CSS补充
1. HTML+CSS补充 - 布局: <style> .w{ width:980px;margin:0 auto; } </style> <body> <d ...
- P2430严酷的训练
传送 这个题的题干很长,长到令人恶心 这个题的p乍一看好像没有卵用,但其实他很有用(废话).这里的“费用”不再是tw[i](wky做第i道题的时间),而是tw[p[i]](wky做第i道题所对应的知识 ...
- PAT 乙级 1079 延迟的回文数(20 分)
1079 延迟的回文数(20 分) 给定一个 k+1 位的正整数 N,写成 ak⋯a1a0 的形式,其中对所有 i 有 0≤ai<10 且 ak>0.N 被称 ...
- PAT 乙级 1029 旧键盘(20) C++版
1029. 旧键盘(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 旧键盘上坏了几个键,于是在敲一段文字的 ...
- MyBatis 接口的使用
为了简化MyBatis的使用MyBatis的使用,MyBatis提供了接口方式自动化生成调用过程,可以大大简化MyBatis的开发 开发映射文件: <select id="queryO ...