mybatis的攔截器實現簡單分頁功能

使用ThreadLocal和Interceptor實現mybatis的分頁功能,這裏只是簡單的瞭解一下mybatis的Interceptor接口。

package com.dwl.mybatis.mysql;

import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

import java.util.Properties;

/**
 * 分頁攔截器
 * @author dwl
 *
 */
@Intercepts({
    @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
    @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),
})
public class PageInterceptor implements Interceptor {

	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		Object[] args = invocation.getArgs();
		MappedStatement ms = (MappedStatement) args[0];
		Object parameter = args[1];
		RowBounds rowBounds = (RowBounds) args[2];
		@SuppressWarnings("rawtypes")
		ResultHandler resultHandler = (ResultHandler) args[3];
		Executor executor = (Executor) invocation.getTarget();
		CacheKey cacheKey;
		BoundSql boundSql;
		if (args.length == 4) {
			// 4 個參數時
			boundSql = ms.getBoundSql(parameter);
			cacheKey = executor.createCacheKey(ms, parameter, rowBounds, boundSql);
		} else {
			// 6 個參數時
			cacheKey = (CacheKey) args[4];
			boundSql = (BoundSql) args[5];
		}
		//生成新的sql
		BoundSql sql = new BoundSql(ms.getConfiguration(), appendSql(boundSql), boundSql.getParameterMappings(),
				parameter);

		return executor.query(ms, parameter, rowBounds, resultHandler, cacheKey, sql);

	}

	@Override
	public Object plugin(Object target) {
		return Plugin.wrap(target, this);
	}

	@Override
	public void setProperties(Properties properties) {
	}

	/**
	 * sql 拼接 分頁
	 * @param boundSql
	 * @return
	 */
	private String appendSql(BoundSql boundSql) {
		Pager pager = PagerUtil.getPager();
		if(null == pager)
			return boundSql.getSql();
		long start = (pager.getPageNum() - 1) * pager.getPageSize();
		StringBuilder builder = new StringBuilder(boundSql.getSql());
		builder.append(" limit ").append(start).append(",").append(pager.getPageSize());
		PagerUtil.removePager();
		return builder.toString();

	}
}

pager分頁封裝

package com.dwl.mybatis.mysql;


public class Pager {
	
	private int pageNum;
	
	private int pageSize;
	
	private long total;
	
	public Pager(int pageNum, int pageSize) {
		super();
		this.pageNum = pageNum;
		this.pageSize = pageSize;
		PagerUtil.setPager(this);
	}

	public int getPageNum() {
		return pageNum;
	}

	public void setPageNum(int pageNum) {
		this.pageNum = pageNum;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public long getTotal() {
		return total;
	}

	public void setTotal(long total) {
		this.total = total;
	}

	
	

}

pager工具類

package com.dwl.mybatis.mysql;

public class PagerUtil {
	
	private static ThreadLocal<Pager> local = new ThreadLocal<>();
	
	
	public static void setPager(Pager pager){
		local.set(pager);
	}
	
	
	public static Pager getPager(){
		return local.get();
	}
	
	public static void removePager(){
		local.remove();
	}

}

測試代碼

package com.dwl.mybatis.mysql;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.dwl.mybatis.MybatisHelper;
import com.dwl.mybatis.dao.SuiteUserInfoMapper;
import com.dwl.mybatis.model.SuiteUserInfo;
import com.dwl.mybatis.model.SuiteUserInfoExample;


public class Test {
	
	@org.junit.Test
	public void select(){
		SqlSession sqlSession = MybatisHelper.getSqlSession();
		SuiteUserInfoMapper mapper = sqlSession.getMapper(SuiteUserInfoMapper.class);
		//分頁測試
	    Pager pager = new Pager(1, 2);
	    SuiteUserInfoExample example = new SuiteUserInfoExample();
	    SuiteUserInfoExample.Criteria criteria = example.createCriteria();
	    criteria.andDeptIsNull();
	    List<SuiteUserInfo> list = mapper.selectByExample(example);
	    
	    list.forEach(info1->{
	    	System.out.println(info1.getDisplayName());
	    });
	}

}

配置文件mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>


<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="lazyLoadingEnabled" value="false"/>
        <setting name="aggressiveLazyLoading" value="true"/>
    </settings>

    <typeAliases>
        <package name="com.dwl.mybatis.model"/>
    </typeAliases>

    <plugins>
        <plugin interceptor="com.dwl.mybatis.mysql.PageInterceptor">
        </plugin>
    </plugins>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC">
                <property name="" value=""/>
            </transactionManager>
            <dataSource type="UNPOOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/dmpc"/>
                <property name="username" value="root"/>
                <property name="password" value="111111"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/dwl/mybatis/dao/mapper/SuiteUserInfoMapper.xml"/>
    </mappers>

</configuration>

MybatisHelper工具類

package com.dwl.mybatis;

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;

/**
 */
public class MybatisHelper {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            //創建SqlSessionFactory
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取Session
     *
     * @return
     */
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}

 

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