MyBatis 拦截器 (实现分页功能)
2016-01-22 08:21
483 查看
由于业务关系 巴拉巴拉巴拉
好吧 简单来说就是
原来的业务是 需要再实现类里写 selectCount 和selectPage两个方法才能实现分页功能
现在想要达到效果是 只通过一个方法就可以实现 也就是功能合并 所以就有了下面的实践
既然是基于MyBatis 所以就先搭建一个Mybatis的小项目
1.01导入 mybatis和mysql的包
View Code
最后是下载地址
下载
好吧 简单来说就是
原来的业务是 需要再实现类里写 selectCount 和selectPage两个方法才能实现分页功能
现在想要达到效果是 只通过一个方法就可以实现 也就是功能合并 所以就有了下面的实践
既然是基于MyBatis 所以就先搭建一个Mybatis的小项目
1.01导入 mybatis和mysql的包
package lqb.interceptor; import java.util.Properties; import org.apache.ibatis.executor.resultset.ResultSetHandler; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.plugin.*; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.SystemMetaObject; import java.sql.*; import lqb.bean.Common; @Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class}), @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class}) }) public class PageInterceptor implements Interceptor { private static final String SELECT_ID="selectpage"; //插件运行的代码,它将代替原有的方法 @Override public Object intercept(Invocation invocation) throws Throwable { System.out.println("PageInterceptor -- intercept"); if (invocation.getTarget() instanceof StatementHandler) { StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler); MappedStatement mappedStatement=(MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement"); String selectId=mappedStatement.getId(); if(SELECT_ID.equals(selectId.substring(selectId.lastIndexOf(".")+1).toLowerCase())){ BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql"); // 分页参数作为参数对象parameterObject的一个属性 String sql = boundSql.getSql(); Common co=(Common)(boundSql.getParameterObject()); // 重写sql String countSql=concatCountSql(sql); String pageSql=concatPageSql(sql,co); System.out.println("重写的 count sql :"+countSql); System.out.println("重写的 select sql :"+pageSql); Connection connection = (Connection) invocation.getArgs()[0]; PreparedStatement countStmt = null; ResultSet rs = null; int totalCount = 0; try { countStmt = connection.prepareStatement(countSql); rs = countStmt.executeQuery(); if (rs.next()) { totalCount = rs.getInt(1); } } catch (SQLException e) { System.out.println("Ignore this exception"+e); } finally { try { rs.close(); countStmt.close(); } catch (SQLException e) { System.out.println("Ignore this exception"+ e); } } metaStatementHandler.setValue("delegate.boundSql.sql", pageSql); //绑定count co.setCount(totalCount); } } return invocation.proceed(); } /** * 拦截类型StatementHandler */ @Override public Object plugin(Object target) { if (target instanceof StatementHandler) { return Plugin.wrap(target, this); } else { return target; } } @Override public void setProperties(Properties properties) { } public String concatCountSql(String sql){ StringBuffer sb=new StringBuffer("select count(*) from "); sql=sql.toLowerCase(); if(sql.lastIndexOf("order")>sql.lastIndexOf(")")){ sb.append(sql.substring(sql.indexOf("from")+4, sql.lastIndexOf("order"))); }else{ sb.append(sql.substring(sql.indexOf("from")+4)); } return sb.toString(); } public String concatPageSql(String sql,Common co){ StringBuffer sb=new StringBuffer(); sb.append(sql); sb.append(" limit ").append(co.getPagebegin()).append(" , ").append(co.getPagesize()); return sb.toString(); } public void setPageCount(){ } }
View Code
最后是下载地址
下载
相关文章推荐
- Win10预览版11102更新了什么 Win10预览版11102更新内容汇总
- 北京Uber优步司机奖励政策(1月22日
- iOS 百度地图 判断应用是否授权、地理位置的正反编码
- 成都Uber优步司机奖励政策(1月22日)
- commondatastorage.googleapis.com訪问失败高速解决
- 前端科普文—为什么<!DOCTYPE> 不可或缺
- iOS学习之移除Main.storyboard
- 3757: 苹果树 树上莫队 位运算技巧
- 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(1月22日)
- iOS学习之移除Main.storyboard
- 正确使用SQL Server中的count()函数
- Linux 基金会悄悄移除社区推荐代表的资格
- JSP与ASP.PHP的比較
- 设计模式(十八):责任链模式
- Eclipse 快捷键
- Eclipse 快捷键
- android-studio 离线安装
- 菱形继承
- AngularJS学习之指令作用域
- iOS开发-Alpha,Hidden与Opaque区别