分页插件
@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 里配置一下即可
浙公网安备 33010602011771号