国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

自定義MyBatis攔截器更改表名

這篇具有很好參考價值的文章主要介紹了自定義MyBatis攔截器更改表名。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

by emanjusaka from ? https://www.emanjusaka.top/2023/10/mybatis-interceptor-update-tableName 彼岸花開可奈何
本文歡迎分享與聚合,全文轉載請留下原文地址。

自定義MyBatis攔截器可以在方法執(zhí)行前后插入自己的邏輯,這非常有利于擴展和定制 MyBatis 的功能。本篇文章實現自定義一個攔截器去改變要插入或者查詢的數據源。

@Intercepts

@Intercepts是Mybatis的一個注解,它的主要作用是標識一個類為攔截器。該注解通過一個@Signature注解(即攔截點),來指定攔截那個對象里面的某個方法。

具體來說,@Signature注解的屬性type用于指定攔截器類型,可能的值包括:

  • Executor(sql的內部執(zhí)行器)
  • ParameterHandler(攔截參數的處理)
  • StatementHandler(攔截sql的構建)
  • ResultSetHandler(攔截結果的處理)。

method屬性表示在指定的攔截器類型中要攔截的方法

args屬性表示攔截的方法對應的參數

實現步驟

  1. 實現org.apache.ibatis.plugin.Interceptor接口,重寫一下的方法:

  2. 添加攔截器注解,@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})

  3. 配置文件中添加攔截器

    注意需要在 Spring Boot 的 application.yml 文件中配置 mybatis 配置文件的路徑。

    mybatis攔截器目前不支持在application.yml配置文件中通過屬性配置,目前只支持通過xml配置或者代碼配置。

代碼實現

Mybatis攔截器:

package top.emanjusaka.springboottest.mybatis.plugin;

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.DefaultReflectorFactory;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import top.emanjusaka.springboottest.mybatis.annotation.DBTableStrategy;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Author emanjusaka
 * @Date 2023/10/18 17:25
 * @Version 1.0
 */
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class DynamicMybatisPlugin implements Interceptor {
    private Pattern pattern = Pattern.compile("(from|into|update)[\\s]{1,}(\\w{1,})", Pattern.CASE_INSENSITIVE);

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
        MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory());
        MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
        // 獲取自定義注解判斷是否進行分表操作
        String id = mappedStatement.getId();
        String className = id.substring(0, id.lastIndexOf("."));
        Class<?> clazz = Class.forName(className);
        DBTableStrategy dbTableStrategy = clazz.getAnnotation(DBTableStrategy.class);
        if (null == dbTableStrategy || !dbTableStrategy.changeTable() || null == dbTableStrategy.tbIdx()) {
            return invocation.proceed();
        }
        // 獲取SQL
        BoundSql boundSql = statementHandler.getBoundSql();
        String sql = boundSql.getSql();
        // 替換SQL表名
        Matcher matcher = pattern.matcher(sql);
        String tableName = null;
        if (matcher.find()) {
            tableName = matcher.group().trim();
        }
        assert null != tableName;
        String replaceSql = matcher.replaceAll(tableName + "_" + dbTableStrategy.tbIdx());
        // 通過反射修改SQL語句
        Field field = boundSql.getClass().getDeclaredField("sql");
        field.setAccessible(true);
        field.set(boundSql, replaceSql);
        field.setAccessible(false);
        return invocation.proceed();
    }
}

mapper的xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="top.emanjusaka.springboottest.score.repository.IScoreRepository">
    <select id="selectAll" resultType="top.emanjusaka.springboottest.score.model.vo.ScoreVO">
        select * from score
    </select>
</mapper>

切換表名的注解:

package top.emanjusaka.springboottest.score.repository;

import org.apache.ibatis.annotations.Mapper;
import top.emanjusaka.springboottest.mybatis.annotation.DBTableStrategy;
import top.emanjusaka.springboottest.score.model.vo.ScoreVO;

import java.util.List;

/**
 * @Author emanjusaka
 * @Date 2023/10/18 17:45
 * @Version 1.0
 */
@Mapper
@DBTableStrategy(changeTable = true,tbIdx = "2")
public interface IScoreRepository {
    List<ScoreVO> selectAll();
}

測試代碼:

package top.emanjusaka.springboottest;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import top.emanjusaka.springboottest.score.model.vo.ScoreVO;
import top.emanjusaka.springboottest.score.service.IScore;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest
class SpringBootTestApplicationTests {
    @Resource
    private IScore score;
    @Test
    void contextLoads() {
        List<ScoreVO> list = score.selectAll();
        list.forEach(System.out::println);
    }

}

運行結果

通過上圖可以看出,現在表名已經修改成了score_2了。通過這種機制,我們可以應用到自動分表中。本文的表名的索引是通過注解參數傳遞的,實際應用中需要通過哈希散列計算。

本文原創(chuàng),才疏學淺,如有紕漏,歡迎指正。如果本文對您有所幫助,歡迎點贊,并期待您的反饋交流,共同成長。
原文地址: https://www.emanjusaka.top/2023/10/mybatis-interceptor-update-tableName
微信公眾號:emanjusaka的編程棧文章來源地址http://www.zghlxwxcb.cn/news/detail-711460.html

到了這里,關于自定義MyBatis攔截器更改表名的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • MyBatis攔截器優(yōu)雅實現數據脫敏

    MyBatis攔截器優(yōu)雅實現數據脫敏

    現代網絡環(huán)境中,敏感數據的處理是至關重要的。敏感數據包括個人身份信息、銀行賬號、手機號碼等,泄露這些數據可能導致用戶隱私泄露、財產損失等嚴重后果。因此,對敏感數據進行脫敏處理是一種必要的安全措施。 比如頁面上常見的敏感數據都是加*遮擋處理過的,

    2024年02月06日
    瀏覽(20)
  • 自定義注解與攔截器實現不規(guī)范sql攔截(攔截器實現篇)

    自定義注解與攔截器實現不規(guī)范sql攔截(攔截器實現篇)

    最近考慮myBatis中sql語句使用規(guī)范的問題,如果漏下條件或者寫一些不規(guī)范語句會對程序性能造成很大影響。最好的方法就是利用代碼進行限制,通過攔截器進行sql格式的判斷在自測環(huán)節(jié)就能找到問題。寫了個簡單情景下的demo,并通過idea插件來將myBatis的mapper方法都打上攔截器

    2024年01月22日
    瀏覽(29)
  • MyBatis Plus 攔截器實現數據權限控制

    MyBatis Plus 攔截器實現數據權限控制

    上篇文章介紹的MyBatis Plus 插件實際上就是用攔截器實現的,MyBatis Plus攔截器對MyBatis的攔截器進行了包裝處理,操作起來更加方便 2.1、InnerInterceptor MyBatis Plus提供的InnerInterceptor接口提供了如下方法,主要包括:在查詢之前執(zhí)行,在更新之前執(zhí)行,在SQL準備之前執(zhí)行 2.2、編寫簡

    2024年01月17日
    瀏覽(22)
  • 自定義攔截器實現

    自定義攔截器實現

    在 Spring MVC 框架中, 攔截器作為一種機制, 用于對請求進行攔截. 攔截器可以在請求進入處理器之前、處理器返回處理之后、視圖渲染之前等各個環(huán)節(jié)進行攔截. 攔截器通常用于實現一下功能 : 鑒權和身份認證 日志記錄和統(tǒng)計 請求參數和校驗和過濾 緩存和性能優(yōu)化 路徑重定向

    2024年02月09日
    瀏覽(27)
  • 自定義攔截器(OpenFeign)

    全量的調用日志中可以查看到自定義攔截器增加的 custom_header_info 字段

    2024年01月19日
    瀏覽(18)
  • flume自定義攔截器

    要自定義 Flume 攔截器,你需要編寫一個實現 org.apache.flume.interceptor.Interceptor 接口的自定義攔截器類。以下是一個簡單的示例: 在上面的示例中,我們實現了 initialize() 、 intercept() 、 intercept(ListEvent events) 、 close() 方法來定義自定義攔截器的行為。你可以根據需要在這些方法中

    2024年01月23日
    瀏覽(18)
  • Mybatis攔截器注解@Intercepts與@Signature注解屬性說明

    可能有些新手使用mybatis攔截器的時候可能沒太懂@Signature注解中type,method,args的用法 首先mybatis攔截器可以攔截如下4中類型 Executor sql的內部執(zhí)行器 ParameterHandler 攔截參數的處理 StatementHandler 攔截sql的構建 ResultSetHandler 攔截結果的處理 type:就是指定攔截器類型(ParameterHandl

    2024年02月05日
    瀏覽(28)
  • WebService 客戶端增加Header頭、并且指定命名空間、添加攔截器(日志攔截器,自定義攔截器)、soap:Envelope 添加命名空間

    1.增加Header頭 生成XML結果如下 2.添加攔截器 3.soap:Envelope 添加命名空間 生成XML結果如下

    2024年02月10日
    瀏覽(29)
  • Springboot中自定義攔截器

    Spring Boot 中使用攔截器 參考:https://blog.csdn.net/taojin12/article/details/88342576?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170823498416800197050192%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257Drequest_id=170823498416800197050192biz_id=0utm_medium=distribute.pc_search_result.none-task-blog-2 all top_positive~defa

    2024年02月19日
    瀏覽(27)
  • 自定義注解與攔截器實現不規(guī)范sql攔截(自定義注解填充插件篇)

    自定義注解與攔截器實現不規(guī)范sql攔截(自定義注解填充插件篇)

    在自定義注解與攔截器實現不規(guī)范sql攔截(攔截器實現篇)中提到過,寫了一個idea插件來輔助對Mapper接口中的方法添加自定義注解,這邊記錄一下插件的實現。 在上一篇中,定義了一個自定義注解對需要經過where判斷的Mapper sql方法進行修飾。那么,現在想使用一個idea插件來

    2024年01月23日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包