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 ...
随机推荐
- NetBeans IDE 多行标签设置方法
- java中对HashMap遍历的方式
第一种是利用HashMap的entrySet()方法: Map<String,String> map = new HashMap<String,String>(); Itera ...
- dfs常见的配置文件中的value与description(重要)
不多说,直接上干货! name value description dfs.namenode.logging.level info The logging level for dfs namenode ...
- ubuntu16.04 彻底卸载MySQL
以MySQL- 5.7.18为例: sudo apt-get autoremove --purge mysql-server-5.7 #sudo apt-get remove mysql-server ...
- java设计模式-Observe
一.背景 请模拟下面情形: 小孩在睡觉,醒来后要求吃东西 代码: class Child{ private boolean wakenUp = false; void wakeUp(){ wake ...
- 滚动效果marquee的用户体验不好,很少被用到,一般用jquery替代
滚动效果marquee的用户体验不好,很少被用到,一般用jquery替代
- java之基本数据类型
11,java里面有没有long double类型或者比double更精度的? =========== 11,java里面有没有long double类型或者比double更精度的? java的基本数 ...
- 事件之onTouch方法的执行过程 及和 onClick执行发生冲突的解决办法
转载:http://blog.csdn.net/jiangwei0910410003/article/details/17504315#quote 博主推荐: 风萧兮兮易水寒,“天真”一去兮不复还.如 ...
- Jmeter(四十三)WebSocket Sampler 和 Ajax Request
权利被放出牢笼,就很难再被关入笼中:奴性被唤出来,腰杆和膝盖很难再直起来. ----宅猪<牧神记> websocket: 参考:https://blog.csdn.net/minmint ...
- tomcat Error:NB:JAVA_HOME should point to a JDK not a JRE 解决方法
环境:win7 tomcata7.0解压版本 执行:service.bat install 报错:JAVA_HOME should point to a JDK not a JRE 网上找了几种解决方 ...