zoukankan      html  css  js  c++  java
  • mybatis拦截器使用

    mybatis拦截器入门

    mybatis 拦截器接口Interceptor

    Interceptor接口,我们通过这个接口可以自定义我们自己的拦截器,从而实现在拦截的时候写上我们自己的一些逻辑。该接口提供了三个方法,

    接口介绍:

    intercept方法:
    intercept方法是在进行拦截的时候要执行的方法。
    plugin方法:
    该方法是拦截器用于封装目标对象的,通过该方法我们可以返回目标对象本身,也可以返回一个它的代理。
    setProperties方法:
    mybatis配置文件中configuration中的配置的指定属性值。
    

    spring boot + mybatis整合

    工程创建过程省略,不会的自行谷歌。
    这里贴出主要的pom.xml文件

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
    
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <excludes>
                    <exclude>application.yml</exclude>
                    <exclude>application-dev.yml</exclude>
                    <exclude>application-uat.yml</exclude>
                </excludes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>application.yml</include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    application.yml 文件配置

    mybatis:
      mapper-locations: classpath*:/mapper/*.xml
      config-location: classpath:/mybatis-config.xml
      type-aliases-package: com.cl.domain
    spring:
      datasource:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/cloud_afwk?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: cloudafwk
        password: handhand
    

    mybatis-config.xml文件配置,注意:当自己重新写了一个mybatis 的拦截器需要配置
    在plugin里面可以定义一些参数的值,这些怎么获取,下面会讲到。自己写的拦截器还需要加上@Intercepts注解,下面会讲这个注解的作用

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
       <settings>
          <!-- DTO驼峰命名与表字段下划线命名自动转换 -->
          <setting name="mapUnderscoreToCamelCase" value="true" />
    
          <!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->
       </settings>
       <plugins>
          <plugin interceptor="com.cl.util.MyInterceptor">
             <property name="databaseType" value="mySql"/>
          </plugin>
       </plugins>
    </configuration>
    

    注意: 上述的package路径写自己搭建项目的路径,不可全盘copy

    创建自己的拦截器MyInterceptor

    创建自己的拦截器,并实现Interceptor接口,在自己的拦截器中分别实现intercept(),plugin(),setProperties()三个方法。首先我们先在三个方法中分别加入打印信息,看看先后自行的顺序。首先启动自己的程序,发现启动日志中已经有我们在拦截器里面的打印信息:

    由此发现,setProperties()方法中可以在Configuration出事化当前的Interceptor时执行。

    @Intercepts注解

    阅读该注解的源码,发现里面就一个参数值Signature 类型的数组,可见在Interceptor中可以写多个值。

    再深入一层去看Signature这个信号通知是什么?里面有三个值type,method,args,@Signature则表明要拦截的接口、方法以及对应的参数类型

    下面通过注解里面具体的值来演示下该拦截器的执行过程:

    @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
    

    可见拦截器先是进plugin这个方法,看Plugin类:
    该Plugin类中的静态方法wrap方法中根据注解Interceptor中定义的哪些接口需要拦截,如果有需要拦截的接口则返回一个代理对象,没有则返回目标对象本身。一个Plugin就是一个代理对象InvocationHandler,然后通过invoke方法封装成一个Invocation对象给intercept。

    通过拦截器,可以自己定义分页查询的功能,将查询出来的语句重新封装sql语句,并返回对象,从而达到拦截器的作用,当有切换不同的数据库时,可以通过mybatis的配置属性值,在拦截器中获取不同的属性值,来重新封装sql语句,从而达到动态切换的目的

    本文章只是介绍mybatis的拦截器的一些概念,具体分页查询,当然还可以自己定义一些其它的判断逻辑,比如我们项目中mybatis插件自动做租户隔离,也是运用类似的方法。总之,方法概念有了,具体实现就看个人了。嘻嘻嘻。。。

  • 相关阅读:
    hdu-3001 三进制状态压缩+dp
    最长公共子序列(LCS)
    矩阵最优路线DP
    CF-721C DAG图拓扑排序+费用DP
    拓扑排序
    BFS+二进制状态压缩 hdu-1429
    DAG最长路问题 hdu-1224
    并查集-解决区间和纠错问题 hdu-3038
    hdu 4972 根据每轮篮球赛分差求结果
    hdu 1116 欧拉回路+并查集
  • 原文地址:https://www.cnblogs.com/levcon/p/9226184.html
Copyright © 2011-2022 走看看