经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MyBatis » 查看文章
mybatis拦截器与分页插件实例教程
来源:jb51  时间:2019/4/4 10:54:11  对本文有异议

mybatis介绍

拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

mybatis架构图

我们这个demo实现就是基于mybatis的插件模块(主要实现mybatis的Interceptor接口)

Interceptor接口

  1. package org.apache.ibatis.plugin;
  2.  
  3. import java.util.Properties;
  4.  
  5. /**
  6. * @author Clinton Begin
  7. */
  8. public interface Interceptor {
  9.  
  10. Object intercept(Invocation invocation) throws Throwable;
  11.  
  12. Object plugin(Object target);
  13.  
  14. void setProperties(Properties properties);
  15. }

demo实现

主要技术 spring boot + mybatis

pom.xml

  1. <dependency>
  2. <groupId>org.mybatis.spring.boot</groupId>
  3. <artifactId>mybatis-spring-boot-starter</artifactId>
  4. <version>1.3.2</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <scope>runtime</scope>
  10. </dependency>

数据库 DDL

  1. create table user
  2. (
  3. id int auto_increment primary key,
  4. username varchar(20) null
  5. );

核心代码

  1. @Override
  2. public Object intercept(Invocation invocation) throws Throwable {
  3. logger.info("进入拦截器");
  4. Object[] args = invocation.getArgs();
  5. MappedStatement mappedStatement = (MappedStatement) args[0];
  6.  
  7. //获取参数
  8. Object param = invocation.getArgs()[1];
  9. BoundSql boundSql = mappedStatement.getBoundSql(param);
  10. Object parameterObject = boundSql.getParameterObject();
  11.  
  12. /**
  13. * 判断是否是继承PageVo来判断是否需要进行分页
  14. */
  15. if (parameterObject instanceof PageVo) {
  16. //强转 为了拿到分页数据
  17. PageVo pagevo = (PageVo) param;
  18. String sql = boundSql.getSql();
  19. //获取相关配置
  20. Configuration config = mappedStatement.getConfiguration();
  21. Connection connection = config.getEnvironment().getDataSource().getConnection();
  22.  
  23. //拼接查询当前条件的sql的总条数
  24. String countSql = "select count(*) from (" + sql + ") a";
  25. PreparedStatement preparedStatement = connection.prepareStatement(countSql);
  26. BoundSql countBoundSql = new BoundSql(config, countSql, boundSql.getParameterMappings(), boundSql.getParameterObject());
  27. ParameterHandler parameterHandler = new DefaultParameterHandler(mappedStatement, parameterObject, countBoundSql);
  28. parameterHandler.setParameters(preparedStatement);
  29. //执行获得总条数
  30. ResultSet rs = preparedStatement.executeQuery();
  31. int count = 0;
  32. if (rs.next()) {
  33. count = rs.getInt(1);
  34. }
  35. //拼接分页sql
  36. String pageSql = sql + " limit " + pagevo.getLimit() + " , " + pagevo.getOffset();
  37. //重新执行新的sql
  38. doNewSql(invocation, pageSql);
  39.  
  40. Object result = invocation.proceed();
  41. connection.close();
  42. //处理新的结构
  43. PageResult<?> pageResult = new PageResult<List>(pagevo.page, pagevo.rows, count, (List) result);
  44. List<PageResult> returnResultList = new ArrayList<>();
  45. returnResultList.add(pageResult);
  46.  
  47. return returnResultList;
  48. }
  49. return invocation.proceed();
  50. }

测试结果

github地址:https://github.com/XINYANJIANG/mybaits-plugs (本地下载

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对w3xue的支持。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号