`

181. Spring Boot MyBatis自定义Plugin

阅读更多


 

 

需求缘起:

       在网易云课堂的讨论区(传送门)中有人咨询:老师,PageHelper的实现原理是怎么样的?这个原理吧,当然不是一两句话就能说明白的,所以这里打算撰文说下。

 

本节大纲:

写道
一、自定义插件的思路
二、自定义插件编码:记录SQL

 

 

一、自定义插件的思路

 

1.1 实现接口Interceptor

 

要在mybatis自定义插件的话,那么要实现如下接口:

org.apache.ibatis.plugin.Interceptor

     

  在此接口中主要有三个方法:

 

 

Object intercept(Invocation invocation) throws Throwable;
Object plugin(Object target);
void setProperties(Properties properties);
 

 

 

       那么这三个都是都能干嘛呢?

 

1)方法plugin(Object target)

plugin方法是拦截器用于封装目标对象的,通过该方法我们可以返回目标对象本身,也可以返回一个它的代理。当返回的是代理的时候我们可以对其中的方法进行拦截来调用intercept方法,当然也可以调用其他方法。

 

2)方法setProperties(Properties properties)

setProperties方法是用于在Mybatis配置文件中指定一些属性的。

 

3)方法intercept(Invocation invocation)

定义自己的Interceptor最重要的是要实现plugin方法和intercept方法,在plugin方法中我们可以决定是否要进行拦截进而决定要返回一个什么样的目标对象。而intercept方法就是要进行拦截的时候要执行的方法。

 

 1.2 使用@Bean注入自定义的Plugin

       spring boot中可以使用如下代码进行注入:

 

@Bean
    public SQLStatsInterceptor sqlStatsInterceptor(){
        SQLStatsInterceptor sqlStatsInterceptor = new SQLStatsInterceptor();
        Properties properties = new Properties();
        properties.setProperty("dialect", "mysql");
         sqlStatsInterceptor.setProperties(properties);
       return sqlStatsInterceptor;
}
 

 

       如果是在spring中使用xml配置的方式的话,可以使用如下的方式进行注入:

<configuration>
    <plugins>
        <plugin interceptor="com.kfit.config.interceptor.SQLStatsInterceptor">
            <property name="dialect" value="mysql" />
        </plugin>
    </plugins>
</configuration>
 

 

 

 

1.3 思路总结

       上面那多废话,简单来说就是:其一需要定义实现接口Interceptor;其二就是要配置注入。千言万语, 不如一句代码,还是写个例子看看效果吧。

                             

二、自定义插件编码:记录SQL

 

2.1 需求描述

       在这里实现:把Mybatis所有执行的sql都记录下来。

 

2.2 代码实现分析

通过对 MyBatis org.apache.ibatis.executor.statement.StatementHandler中的prepare 方法进行拦截即可。

 

 

2.3 代码实现

2.3.1实现类SQLStatsInterceptor实现接口Interceptor

package com.kfit.config.interceptor;
import java.sql.Connection;
import java.util.Properties;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
 
@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class,Integer.class})})
public class SQLStatsInterceptor implements Interceptor {
 
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
       StatementHandler statementHandler= (StatementHandler) invocation.getTarget();
       BoundSql boundSql = statementHandler.getBoundSql();
       System.out.println(boundSql.getSql());
       return invocation.proceed();
    }
 
    @Override
    public Object plugin(Object target) {
       return Plugin.wrap(target, this);
    }
 
    @Override
    public void setProperties(Properties properties) {
        String dialect = properties.getProperty("dialect");
        System.out.println("dialect="+dialect);
    }
}

 

代码分析:

1)首先SQLStatsInterceptor类实现了接口Interceptor

2)需要重写3个方法,核心的拦截处理方法是intercept,在这个方法中可以获取到对应的绑定的sql,在这里作为演示只是打印了SQL,如果需要可以保存起来。

3)在方法上有一个很重要的注解@Intercepts,在此注解上配置的注解说明了要拦截的类(type=StatementHandler.class),拦截的方法(method="prepare"),方法中的参数(args={Connection.class,Integer.class}),也就是此拦截器会拦截StatementHandler类中的如下方法:

 

Statement prepare(Connection connection, Integer transactionTimeout)

  

      

 

这里顺带提一下,可以拦截的类:

StatementHandler (prepare, parameterize, batch, update, query)

ResultSetHandler (handleResultSets, handleOutputParameters)

ParameterHandler (getParameterObject, setParameters)

Executor (update, query, flushStatements, commit, rollback,getTransaction, close, isClosed)

 

 

2.3.2定义配置类进行注入

@Configuration
public class MyBatisConfiguration {
    @Bean
    public SQLStatsInterceptor sqlStatsInterceptor(){
        SQLStatsInterceptor sqlStatsInterceptor = new SQLStatsInterceptor();
        Properties properties = new Properties();
        properties.setProperty("dialect", "mysql");
         sqlStatsInterceptor.setProperties(properties);
       return sqlStatsInterceptor;
    }
}

 

       到这里就可以测试使用了。一旦懂了自定义Plugin后,那么对于PageHelper的实现也就明白了七八分了。

 

à悟空学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

Spring Cloud视频:http://t.cn/A6ZagxSR

SpringBoot Shiro视频:http://t.cn/A6Zag7IV

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/A6Zad1OH

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

Sharding-JDBC分库分表实战http://t.cn/A6ZarrqS

 

分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr

分享到:
评论
1 楼 guods 2018-03-14  
不用写配置文件,直接在SQLStatsInterceptor上加@Component么就好了,注入属性直接用@Value到properties文件里拿

相关推荐

    Spring Boot整合MyBatis加外部Tomcat启动-demo.zip

    《Spring Boot整合MyBatis与外部Tomcat启动详解》 在现代Java开发中,Spring Boot以其简洁、快速的特性受到了广大开发者的喜爱。而MyBatis作为轻量级的持久层框架,以其灵活的SQL映射功能,为数据库操作提供了便利...

    SpringBoot+JSP+Mybatis用户管理员工项目源码

    8. **部署与运行**:项目打包后,可以通过Spring Boot的`spring-boot-maven-plugin`或`spring-boot-gradle-plugin`生成可执行的JAR或WAR文件,然后在本地或服务器上运行。 9. **博客讲解**:项目描述中提到源码的...

    spring-boot-reference2018最新版

    Spring Boot应用可以通过Maven或Gradle进行构建,使用`spring-boot-maven-plugin`或`spring-boot-gradle-plugin`插件,可以实现一键打包成可执行的JAR或WAR文件。 7. **YAML与Properties配置** Spring Boot支持...

    MyBatis-3.61.zip

    Plugin for Mybatis. Plugin was rewritten from scratch with new architecture to make it more stable and bringing many new features. The plugin provides the following features: Compatible with both IDEA...

    springboot集成generator自定义插件.rar

    在这个"springboot集成generator自定义插件.rar"项目中,我们看到的重点是如何在Spring Boot项目中集成MyBatis Generator,并且自定义注释。这通常涉及到以下几个关键知识点: 1. **Spring Boot与MyBatis集成**:...

    用IDEA搭建Springboot spring MVC Mybatis集成环境

    ### 使用IDEA构建Spring Boot Spring MVC MyBatis集成开发环境 #### 一、项目概述 在本教程中,我们将详细介绍如何使用IntelliJ IDEA(简称IDEA)搭建一个集成了Spring Boot、Spring MVC以及MyBatis的开发环境。此...

    致享出行(Spring Boot+MyBatis Plus)

    "致享出行(Spring Boot+MyBatis Plus)"是一个基于现代Java技术栈的Web项目,旨在提供便捷的出行服务。该项目采用Spring Boot作为核心框架,它简化了Spring的配置,使得开发人员可以快速构建可独立运行的Java应用。...

    spring-boot-mybatis-mapper

    在本文中,我们将深入探讨如何将Spring Boot与MyBatis集成,并使用Mapper进行数据库操作,同时实现自动分页功能。Spring Boot以其简化配置和快速启动的特性,成为了现代Java开发中的首选框架。MyBatis则是一款优秀的...

    spring-mybatis.zip

    《Spring Boot与Mybatis Generator整合实现自动化代码生成》 在当今快速发展的软件开发环境中,提高开发效率、降低出错率是每个开发团队追求的目标。Spring Boot 和 Mybatis Generator 的结合,正好为此提供了一种...

    spring-boot-mybatis-mysql-auto.zip

    《Spring Boot、MyBatis与MySQL自动化开发详解》 在现代Web开发中,Spring Boot以其简洁的配置和快速的启动时间赢得了广大开发者喜爱。而MyBatis作为一款轻量级的持久层框架,通过简单的XML或注解进行映射,实现了...

    Spring Boot MyBatis 连接数据库配置示例

    在Spring Boot应用中整合MyBatis来连接数据库是一项常见的任务,这使得我们能够利用MyBatis的灵活性和Spring Boot的自动化配置。以下是如何在Spring Boot中配置MyBatis与数据库连接的详细步骤。 首先,我们需要在`...

    spring boot mybatis多数据源解决方案过程解析

    Spring Boot MyBatis 多数据源解决方案过程解析 在实际项目中,我们经常会遇到需要在一个项目中使用多个数据源的问题。例如,在迁移用户的聊天记录时,我们需要使用三个数据源。这时,我们可以使用 Spring Boot 和 ...

    spring boot + mybatis + maven 自动生成Mapping

    在IT行业中,Spring Boot、MyBatis和Maven是三个非常关键的开发工具,它们各自在不同的领域提供了强大的支持。Spring Boot简化了Spring框架的初始配置,MyBatis则是一个优秀的持久层框架,而Maven作为项目管理工具,...

    springboot整合mybatis,druid,cors跨域,mybatis-plugin脚手架

    标题 "springboot整合mybatis,druid,cors跨域,mybatis-plugin脚手架" 描述了一种在Spring Boot项目中集成MyBatis、Druid数据源、CORS跨域处理以及MyBatis Plugin的方式。这四个技术组件是Java开发中常见的工具和服务...

    springboot+mybatis(mybatis dao与xml文件自动生成)

    在Spring Boot和MyBatis框架集成的开发过程中,自动化生成DAO层接口与对应的XML配置文件可以极大地提高开发效率。下面将详细介绍如何实现这一功能,并深入探讨相关知识点。 首先,Spring Boot是一个快速开发框架,...

    spring-boot 集成 tk mybatis

    在 Maven 的 `pom.xml` 文件中,我们需要引入 Spring Boot 对应的 Starter Web 和 Starter Data JPA,以及 MyBatis 和 MyBatis-TK 的依赖。例如: ```xml &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;...

    mybatis-generatordemo.rar

    《MyBatis Generator在Spring Boot中的应用详解》 在当今的Java开发领域,MyBatis Generator(MBG)是一款强大的工具,它能够自动生成MyBatis的映射文件、Java模型类以及DAO接口,极大地提高了开发效率。当MBG与...

    Struts2+spring+Mybatis

    然而,随着微服务和Spring Boot的兴起,单一的SSM架构逐渐被Spring Boot的全栈式开发所替代,因为Spring Boot提供了更简便的配置和启动方式,减少了大量配置文件的编写,使得开发变得更加迅速和便捷。尽管如此,理解...

    详解Spring Boot集成MyBatis(注解方式)

    在本文中,我们将深入探讨如何将MyBatis与Spring Boot结合使用,特别是在使用注解方式进行集成的情况下。MyBatis是一个流行的持久层框架,它简化了SQL操作,避免了手动处理JDBC代码。Spring Boot则是一个简化Spring...

    spring-boot-mybatis-plus数据层框架

    ### Spring Boot与MyBatis-Plus整合详解 #### 一、MyBatis-Plus概述 MyBatis-Plus(简称MP)是MyBatis的一个增强工具,在MyBatis的基础上进行了功能增强,但不改变原有的核心功能,旨在简化开发流程、提高开发效率...

Global site tag (gtag.js) - Google Analytics