分页插件

@Intercepts(@Signature(
        type = StatementHandler.class,
        method = "prepare",
        args = {Connection.class,Integer.class}
))
public class MyPagePlugin implements Interceptor {

    private static  String  dialect="mysql";



    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
       //拿到与原始Sql
        BoundSql boundSql = statementHandler.getBoundSql();
        String sql = boundSql.getSql();
        System.out.println("sql = " + sql);
        //拿到参数
        Object parameterObject = boundSql.getParameterObject();
        System.out.println("parameterObject = " + parameterObject);
        //通过反射拿到statementHandler中的各种数据
        MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
        MappedStatement  mappedStatement = (MappedStatement ) metaObject.getValue("delegate.mappedStatement");

        String id = mappedStatement.getId();

        System.out.println(id);

        //定义方法名称以ByPage结尾的就分页
        if(id.matches(".*ByPage$")){
            String countSql="select count(0) from ("+sql+")"+" a";
            //拿到数据库连接对象
            Connection connection = (Connection) invocation.getArgs()[0];
            PreparedStatement preparedStatement = connection.prepareStatement(countSql);
            //拿到parameterHandler 对象
            ParameterHandler  parameterHandler = (ParameterHandler ) metaObject.getValue("delegate.parameterHandler");
            //对sql语句进行映射
            parameterHandler.setParameters(preparedStatement);
            //执行
            ResultSet resultSet = preparedStatement.executeQuery();
            //测试打行数
            if(resultSet.next())
            System.out.println(resultSet.getString(1));
            //修改Sql 实现分页
            String newSql = parseSql(sql, metaObject);
            System.out.println("newSql = " + newSql);
            //替换原Sql
            metaObject.setValue("delegate.boundSql.sql",newSql);
        }

        return invocation.proceed();
    }

   public String parseSql(String sql,MetaObject metaObject){
       Map value = (Map) metaObject.getValue("delegate.parameterHandler.parameterObject");

       StringBuffer append = new StringBuffer(sql).append(" limit").append(" " + value.get("pageNum")).append(",").append(value.get("limit"));

       return append.toString();
   }

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

    @Override
    public void setProperties(Properties properties) {

    }
}

xml 里配置一下即可

posted @ 2020-10-05 21:59  专注Java2年  阅读(128)  评论(0)    收藏  举报