mybatis介绍
拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
mybatis架构图
我们这个demo实现就是基于mybatis的插件模块(主要实现mybatis的Interceptor接口)
Interceptor接口
package org.apache.ibatis.plugin; import java.util.Properties; /** * @author Clinton Begin */ public interface Interceptor { Object intercept(Invocation invocation) throws Throwable; Object plugin(Object target); void setProperties(Properties properties); }
demo实现
主要技术 spring boot + mybatis
pom.xml
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
数据库 DDL
create table user ( id int auto_increment primary key, username varchar(20) null );
核心代码
@Override public Object intercept(Invocation invocation) throws Throwable { logger.info("进入拦截器"); Object[] args = invocation.getArgs(); MappedStatement mappedStatement = (MappedStatement) args[0]; //获取参数 Object param = invocation.getArgs()[1]; BoundSql boundSql = mappedStatement.getBoundSql(param); Object parameterObject = boundSql.getParameterObject(); /** * 判断是否是继承PageVo来判断是否需要进行分页 */ if (parameterObject instanceof PageVo) { //强转 为了拿到分页数据 PageVo pagevo = (PageVo) param; String sql = boundSql.getSql(); //获取相关配置 Configuration config = mappedStatement.getConfiguration(); Connection connection = config.getEnvironment().getDataSource().getConnection(); //拼接查询当前条件的sql的总条数 String countSql = "select count(*) from (" + sql + ") a"; PreparedStatement preparedStatement = connection.prepareStatement(countSql); BoundSql countBoundSql = new BoundSql(config, countSql, boundSql.getParameterMappings(), boundSql.getParameterObject()); ParameterHandler parameterHandler = new DefaultParameterHandler(mappedStatement, parameterObject, countBoundSql); parameterHandler.setParameters(preparedStatement); //执行获得总条数 ResultSet rs = preparedStatement.executeQuery(); int count = 0; if (rs.next()) { count = rs.getInt(1); } //拼接分页sql String pageSql = sql + " limit " + pagevo.getLimit() + " , " + pagevo.getOffset(); //重新执行新的sql doNewSql(invocation, pageSql); Object result = invocation.proceed(); connection.close(); //处理新的结构 PageResult<?> pageResult = new PageResult<List>(pagevo.page, pagevo.rows, count, (List) result); List<PageResult> returnResultList = new ArrayList<>(); returnResultList.add(pageResult); return returnResultList; } return invocation.proceed(); }
测试结果
github地址:https://github.com/XINYANJIANG/mybaits-plugs (本地下载)
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。
本文向大家介绍MyBatis拦截器实现分页功能的实现方法,包括了MyBatis拦截器实现分页功能的实现方法的使用技巧和注意事项,需要的朋友参考一下 MyBatis拦截器实现分页功能的实现方法 前言: 首先说下实现原理。使用拦截器拦截原始的sql,然后加上分页查询的关键字和属性,拼装成新的sql语句再交给mybatis去执行。 除了业务代码之外,需要写的东西不多,提几个关键的: 1、分页对象Page
本文向大家介绍Spring Mybatis 分页插件使用教程,包括了Spring Mybatis 分页插件使用教程的使用技巧和注意事项,需要的朋友参考一下 Mybatis分页切入点 Mybatis内部有个plugins(插件)概念,本质上属于拦截器的思想。具体的解析可见他文MyBatis拦截器原理探究。本文将在此基础上直接展示实际项目的实现代码和其他的相关解析 分页具体代码实现 首先我们可以定义方
本文向大家介绍PHP的拦截器实例分析,包括了PHP的拦截器实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP的拦截器用法。分享给大家供大家参考。具体如下: PHP提供了几个拦截器,用于在访问未定义的方法和属性时被调用,如下所示: 1、__get($property) 功能:访问未定义的属性是被调用 2、__set($property, $value) 功能:给未定义的属性设置值
本文向大家介绍Mybatis拦截器的实现介绍,包括了Mybatis拦截器的实现介绍的使用技巧和注意事项,需要的朋友参考一下 MyBatis介绍 MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。它支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。
本文向大家介绍Spring Boot编写拦截器教程实例解析,包括了Spring Boot编写拦截器教程实例解析的使用技巧和注意事项,需要的朋友参考一下 创建一个类并使其实现接口HandlerInterceptor 接口提供了一个请求的三个周期的拦截方法 在controller之前,返回true则放行,false反之,handler包含处理请求的controller类以及其方法 boolean pr
本文向大家介绍简单了解mybatis拦截器实现原理及实例,包括了简单了解mybatis拦截器实现原理及实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了简单了解mybatis拦截器实现原理及实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 例行惯例,先看些基本概念: 1 拦截器的作用就是我们可以拦截某些方法的调用,在目标方法前后加