Mybatis進階--攔截器

基於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();
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章