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 ...
随机推荐
- 【转】探索 ConcurrentHashMap 高并发性的实现机制
原文链接:https://www.ibm.com/developerworks/cn/java/java-lo-concurrenthashmap/ <探索 ConcurrentHashMap ...
- 服务注册发现consul之四: 分布式锁之四:基于Consul的KV存储和分布式信号量实现分布式锁
一.基于key/value实现 我们在构建分布式系统的时候,经常需要控制对共享资源的互斥访问.这个时候我们就涉及到分布式锁(也称为全局锁)的实现,基于目前的各种工具,我们已经有了大量的实现方式,比如: ...
- 学习笔记之Bokeh Data Visualization | DataCamp
Bokeh Data Visualization | DataCamp https://www.datacamp.com/courses/interactive-data-visualization- ...
- python:数据类型
一.数据类型 1.数字int型 主要进行计算 bit_length() 当十进制用二进制表示时,最少使用的位数 a = 13 b = a.bit_length() print (b) 2.布尔值boo ...
- 基础回顾之List集合
1.List集合的的contains()方法底层调用的是equals()方法,当比较自定义对象时,需要重写比较对象的equals()方法 2.List集合的remove()方法底层依赖的也是equal ...
- java基础阶段关于密码或账号字符数字的判断总结
将字符串转成字符数组 首字母判断 思路:应该如何获取首字母 arr[0]为数组第一个元素即是首字母 数字判断true为数字false为非数字 "0123456789".contai ...
- 关于dict的formkeys方法注意
使用容器中的元素生成k, v为统一值, 指向同一个内存地址 默认值指向同一个内存, 修改就全部修改 strvar = 'abcd' listvar = [] dictvar = {} dictvar ...
- 加拿大大学排名 by USNews
https://www.usnews.com/education/best-global-universities/canada 2017综合排名: CS Subject:
- Windows下sbt安装配置
1.下载sbt1.2.8 官网:https://sbt-downloads.cdnedge.bluemix.net/releases/v1.2.8/sbt-1.2.8.tgz 2.配置环境 #SBT_ ...
- PHP微信公众号开发之自动回复
先把源码类发出来 <?php /** 自己封装 微信 开发api */ header('Content-type: text/html; charset=utf-8');#设置头信息 class ...