当前位置:Gxlcms > 数据库问题 > springboot使用mybatis拦截进行SQL分页

springboot使用mybatis拦截进行SQL分页

时间:2021-07-01 10:21:17 帮助过:7人阅读

com.grand.p1upgrade.mapper.test; import java.sql.Connection; import java.util.Map; import java.util.Properties; import org.apache.ibatis.executor.parameter.ParameterHandler; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.plugin.Intercepts; import org.apache.ibatis.plugin.Invocation; import org.apache.ibatis.plugin.Plugin; import org.apache.ibatis.plugin.Signature; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.SystemMetaObject; import org.springframework.stereotype.Component; @Component @Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class,Integer.class})}) public class MyPageInterceptor implements Interceptor { private int page; private int size; @SuppressWarnings("unused") private String dbType; @SuppressWarnings("unchecked") @Override public Object intercept(Invocation invocation) throws Throwable { System.out.println("plugin is running..."); StatementHandler statementHandler = (StatementHandler)invocation.getTarget(); MetaObject metaObject = SystemMetaObject.forObject(statementHandler); while(metaObject.hasGetter("h")){ Object object = metaObject.getValue("h"); metaObject = SystemMetaObject.forObject(object); } while(metaObject.hasGetter("target")){ Object object = metaObject.getValue("target"); metaObject = SystemMetaObject.forObject(object); } MappedStatement mappedStatement = (MappedStatement)metaObject.getValue("delegate.mappedStatement"); String mapId = mappedStatement.getId(); if(mapId.matches(".+ByPager$")){ ParameterHandler parameterHandler = (ParameterHandler)metaObject.getValue("delegate.parameterHandler"); Map<String, Object> params = (Map<String, Object>)parameterHandler.getParameterObject(); page = (int)params.get("page"); size = (int)params.get("size"); String sql = (String) metaObject.getValue("delegate.boundSql.sql"); sql += " limit "+(page-1)*size +","+size; metaObject.setValue("delegate.boundSql.sql", sql); } return invocation.proceed(); } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { String limit = properties.getProperty("limit","10"); this.page = Integer.parseInt(limit); this.dbType = properties.getProperty("dbType", "mysql"); } }

添加测试TestMapper.java

package com.grand.p1upgrade.mapper.test;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface TestMapper {

    public List<Map<String,Object>> findByPager(Map<String, Object> params);
    public long count();
}

TestMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.grand.p1upgrade.mapper.test.TestMapper">

    <select id="findByPager" resultType="java.util.HashMap">
        select * from p1project.sys_user
    </select>
    <select id="count" resultType="long">
        select count(1) from p1project.sys_user
    </select>

   
</mapper>

在调用TestMapper.findByPager传递参数的时候将page和size传入即可

 

springboot使用mybatis拦截进行SQL分页

标签:sig   exec   row   api   ack   size   upgrade   ide   map   

人气教程排行