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传入即可
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。