首先了解一下mybatis到底帮了我们做了哪些事
1,封装jdbc操作
2,利用反射将java对象与sql语句之间的互相转换。
mybatis的架构设计:
1、接口层
2、数据处理层 参数映射,通过parameterHandler,sql解析通过sqlSource ,sql执行通过executor,结果处理和映射通过ResultSetHandler
3、框架支撑层
mybatis执行sql的执行流程:
1,通过输入流的方式加载全局配置文件mybastis-config.xml文件
2, 将返回的输入流通过sqlSessionFactoryBuilder 解析生成sqlSessionFactory (这里mybatis用到了构建者模式)
3,通过sqlSessionFactory调用 openSession()方法打开创建sqlSession对象
4,获取到sqlSession对象
5,得到执行器Executor,接着执行jdbc相关操作
6,StatmentHandler,会将sql执行的参数代入方法中。
7,处理返回的结果集ResultSetHanler 返回ResultSet
手写mybatis分页插件过程:(mybatis插件又称拦截器 )
1,在mybatis.config配置文件中添加
<plugin>插件信息...</plugin>
2, 通过跟踪源码,我们可以发现mybatis在StatementHandler执行插件方法,所以我们手写的插件在StatementHandler这个进入插入。
mybtatis使用了jdk接口代理,cglib代理需要引入新jar包
3, 添加插件代码,创建myPagePlugin类
一:分页插件需要实现intercepter
二:分页插件需要用到的一些注解和注释
@Intercepts插件注解
@Signature(type="StatementHanlder.class,指明自定义拦截器需要拦截哪一个类型
method=“prepare” 对插件需要拦截的对象和方法进行拦截
args=(connection.class,…)被拦截方法的参数
插件内部需要重写有三个方法:
1、intercepter() 插件的核心业务
一、拿到原始sql, 二、查询sql数据总数 三,改造sql,添加limit关键字和分页参数实现分页。
ps:在executor被代理后, 会继续执行查询动作, 这时就会被interceptor拦截了.
设置只有指定byPage方法的才需要进行
2、pluginObject() 将自定义的插件加入到mybatis中执行
3、setProperties()设置分页的一些属性参数
到此分页插件的所有工作已经完成。