基於Mybatis攔截器的分頁
- mybatis的四大對象、插件原理及接口
- Mybatis的插件開發過程
- 使用PageHelper插件實現分頁功能
Mybatis四大對象
- ParameterHandler:處理SQL的參數對象
- ResultSetHandler:處理SQL的返回結果集
- StatementHandler:數據庫的處理對象,用於執行SQL語句
- Executor:Mybatis的執行器,用於執行增刪改查操作
Mybatis插件原理
- Mybatis的插件藉助於責任鏈的模式進行對攔截器的處理
- 使用動態代理對目標對象進行包裝,達到攔截的目的
- 作用於Mybatis的作用域對象之上
Mybatis插件接口--Interceptor
- Intercept方法,插件的核心方法
- 使plugin方法,生成target的代理對象
- setProperties方法,配置所需參數
自定義插件
package com.imooc.mybatis.Inteceptor;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.*;
import java.sql.Statement;
import java.util.Properties;
/**
* 插件簽名,告訴mybatis當前插件用來攔截那個對象的哪個方法
*/
@Intercepts({
@Signature(type = ResultSetHandler.class,method ="handleResultSets",args= Statement.class)
})
public class MyFirstInterceptor implements Interceptor {
//攔截目標對象的目標方法的
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("攔截的目標對象"+invocation.getTarget());
Object object = invocation.proceed();
return object;
}
//包裝目標對象,爲目標對象創建代理對象的
public Object plugin(Object target) {
System.out.println("將要包裝的目標對象"+target);
return Plugin.wrap(target,this);
}
public void setProperties(Properties properties) {
System.out.println("插件配置的初始化參數"+properties);
}
}
在mybatis.xml中配置參數
運行
多插件開發
- 創建代理對象時,安照插件配置的順序進行包裝
- 執行目標方法後,是按照代理的逆向進行執行
註冊
package com.imooc.mybatis.Inteceptor;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.*;
import java.sql.Statement;
import java.util.Properties;
@Intercepts({
@Signature(type = ResultSetHandler.class,method ="handleResultSets",args= Statement.class)
})
public class MySecondInterceptor implements Interceptor {
//攔截目標對象的目標方法的
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("Second:攔截的目標對象"+invocation.getTarget());
System.out.println(invocation.getMethod());
System.out.println(invocation.getArgs());
Object object = invocation.proceed();
return object;
}
//包裝目標對象,爲目標對象創建代理對象的
public Object plugin(Object target) {
System.out.println("Second:將要包裝的目標對象"+target);
return Plugin.wrap(target,this);
}
public void setProperties(Properties properties) {
System.out.println("Second:插件配置的初始化參數"+properties);
}
}
使用攔截器PageHelper進行分頁
插件分頁
分頁的分類:內存分頁和物理分頁
MySQL中實現分頁的關鍵字:SELECT * FROM PERSON LIMIT 0,10;
- 開始記錄索引的規律(當前頁-1)*每頁的條數
- 一共有多少頁:總記錄%條數==0?總記錄/條數:總記錄/條數+1
在 MyBatis 配置 xml 中配置攔截器插件
package com.imooc.mybatis.test;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.imooc.mybatis.bean.Person;
import com.imooc.mybatis.dao.PersonMapper;
import javafx.beans.binding.ObjectExpression;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
public class MyBatisTest {
public static SqlSessionFactory sqlSessionFactory =null;
public static SqlSessionFactory getSqlSessionFactory(){
if(sqlSessionFactory==null){
String resource = "mybatis.xml";
try {
Reader reader = Resources.getResourceAsReader(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
return sqlSessionFactory;
}
public void getAllPersons(){
SqlSession sqlSession = this.getSqlSessionFactory().openSession();
PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
Page<Object> page=PageHelper.startPage(1,10);
List<Person> persons = personMapper.getAllPersons();
PageInfo pageInfo = new PageInfo(persons,5);
for (Person person:persons){
System.out.println(person.getId());
}
System.out.println(page.getPageNum());//current page
System.out.println(page.getTotal());//total
System.out.println(page.getPageSize());//page size
System.out.println(pageInfo.isIsFirstPage());
System.out.println(pageInfo.getPages());//total pages
int[] nums =pageInfo.getNavigatepageNums();
for (int i=0;i<nums.length;i++){
System.out.println(nums[i]);
}
}
public static void main(String[] args) {
new MyBatisTest().getAllPersons();
}
}