Springboot如何使用mybatis实现拦截SQL分页
新建一个类MyPageInterceptor.java(注意在springboot中要添加注解@Component)
packagecom.grand.p1upgrade.mapper.test;
importjava.sql.Connection;
importjava.util.Map;
importjava.util.Properties;
importorg.apache.ibatis.executor.parameter.ParameterHandler;
importorg.apache.ibatis.executor.statement.StatementHandler;
importorg.apache.ibatis.mapping.MappedStatement;
importorg.apache.ibatis.plugin.Interceptor;
importorg.apache.ibatis.plugin.Intercepts;
importorg.apache.ibatis.plugin.Invocation;
importorg.apache.ibatis.plugin.Plugin;
importorg.apache.ibatis.plugin.Signature;
importorg.apache.ibatis.reflection.MetaObject;
importorg.apache.ibatis.reflection.SystemMetaObject;
importorg.springframework.stereotype.Component;
@Component
@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class,Integer.class})})
publicclassMyPageInterceptorimplementsInterceptor{
privateintpage;
privateintsize;
@SuppressWarnings("unused")
privateStringdbType;
@SuppressWarnings("unchecked")
@Override
publicObjectintercept(Invocationinvocation)throwsThrowable{
System.out.println("pluginisrunning...");
StatementHandlerstatementHandler=(StatementHandler)invocation.getTarget();
MetaObjectmetaObject=SystemMetaObject.forObject(statementHandler);
while(metaObject.hasGetter("h")){
Objectobject=metaObject.getValue("h");
metaObject=SystemMetaObject.forObject(object);
}
while(metaObject.hasGetter("target")){
Objectobject=metaObject.getValue("target");
metaObject=SystemMetaObject.forObject(object);
}
MappedStatementmappedStatement=(MappedStatement)metaObject.getValue("delegate.mappedStatement");
StringmapId=mappedStatement.getId();
if(mapId.matches(".+ByPager$")){
ParameterHandlerparameterHandler=(ParameterHandler)metaObject.getValue("delegate.parameterHandler");
Mapparams=(Map)parameterHandler.getParameterObject();
page=(int)params.get("page");
size=(int)params.get("size");
Stringsql=(String)metaObject.getValue("delegate.boundSql.sql");
sql+="limit"+(page-1)*size+","+size;
metaObject.setValue("delegate.boundSql.sql",sql);
}
returninvocation.proceed();
}
@Override
publicObjectplugin(Objecttarget){
returnPlugin.wrap(target,this);
}
@Override
publicvoidsetProperties(Propertiesproperties){
Stringlimit=properties.getProperty("limit","10");
this.page=Integer.parseInt(limit);
this.dbType=properties.getProperty("dbType","mysql");
}
}
添加测试TestMapper.java
packagecom.grand.p1upgrade.mapper.test;
importjava.util.List;
importjava.util.Map;
importorg.apache.ibatis.annotations.Mapper;
@Mapper
publicinterfaceTestMapper{
publicList
TestMapper.xml
select*fromp1project.sys_user selectcount(1)fromp1project.sys_user
在调用TestMapper.findByPager传递参数的时候将page和size传入即可
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。