使用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();
}
}