最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatisplus詳解如何注入自定義的SQL

 更新時(shí)間:2022年06月22日 10:32:33   作者:ifredom  
mybatis-plus 提供了許多默認(rèn)單表 CRUD 語句,對于其他 SQL 情況愛莫能助。如果有一個(gè)刪庫跑路,并且需要多次調(diào)用,來清空多張表數(shù)據(jù)得需求,那么如何把他封裝在 mybatis-plus 中調(diào)用呢,下面我們一起來看一下

SQL 注入器

官方文檔提供了一個(gè)小案例 自定義 Mapper 示例

解讀:DefaultSqlInjector就是一個(gè)注冊類,其中注冊了一系列 mybatis-plus 內(nèi)置的 update,insert,select SQL 語句方法,

并且對表主鍵是否存在進(jìn)行了判定:如果設(shè)置了主鍵,那么會注冊 DeleteById 等方法,沒有則不注冊。最終返回所有將要被注入的 SQL 語句 List

public class DefaultSqlInjector extends AbstractSqlInjector {
    public DefaultSqlInjector() {}
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        Builder<AbstractMethod> builder = Stream.builder().add(new Insert()).add(new Delete()).add(new DeleteByMap()).add(new Update()).add(new SelectByMap()).add(new SelectCount()).add(new SelectMaps()).add(new SelectMapsPage()).add(new SelectObjs()).add(new SelectList()).add(new SelectPage());
        if (tableInfo.havePK()) {
            builder.add(new DeleteById()).add(new DeleteBatchByIds()).add(new UpdateById()).add(new SelectById()).add(new SelectBatchByIds());
        } else {
            this.logger.warn(String.format("%s ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method.", tableInfo.getEntityType()));
        }
        return (List)builder.build().collect(Collectors.toList());
    }
}

其中,Builder<AbstractMethod> builder就是可以做文章得地方。

  • 一頓操作,最終是返回一個(gè)總的 List, 那么可以通過重寫 getMethodList 方法,在返回得 List 中 添加上我們自己得方法類即可。
  • 不是任意的方法類都可以被添加到這個(gè) List 當(dāng)中。繼續(xù)查看,跳入 new Insert(),該方法僅僅做了一個(gè)操作:繼承了抽象類AbstractMethod。查看其他幾個(gè)new Update(), new Delete() 操作類發(fā)現(xiàn)同樣如此
  • 因此,我們要實(shí)現(xiàn)清表刪庫功能 clearOneTable, 同樣只需要繼承抽象類 AbstractMethod 完事。

第一步重寫getMethodList

RegisterSqlInjector.java

package com.example.commonmybatisplus.utils;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
import org.apache.ibatis.builder.MapperBuilderAssistant;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
import java.util.Collections;
import java.util.List;
/**
 * @Author ifredomvip@gmail.com
 * @Date 2022/5/30 11:11
 * @Version 1.0.0
 * @Description
 * 源碼閱讀: https://sourcegraph.com/github.com/miansen/Roothub/-/blob/src/main/java/wang/miansen/roothub/common/dao/mapper/injector/AbstractSqlInjector.java?L56
 **/
 // 基于springboot的注解: @Component
@Component
public class RegisterSqlInjector extends DefaultSqlInjector {
    /**
     * 根據(jù) mapperClass 注入 SQL,需要檢查 SQL 是否已注入(已經(jīng)注入過不再注入)
     *
     * @param mapperClass mapper類
     * @param tableInfo   數(shù)據(jù)表信息,表名,表字段,表類型等等數(shù)據(jù)信息
     */
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        // 1. 直接調(diào)用父類方法,獲得mybatis-plus注入SQL方法后的List
        List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
        methodList.forEach(System.out::println);
        // 2. 添加我自定義得類
        methodList.add(new DefineSqlInjector());
        return methodList;
    }
}

第二步定義自己的SQL方法類

DefineSqlInjector.java

package com.example.commonmybatisplus.utils;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.AbstractSqlInjector;
import com.baomidou.mybatisplus.core.injector.methods.*;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import org.apache.ibatis.builder.MapperBuilderAssistant;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;
import org.springframework.stereotype.Component;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
 * @Author ifredomvip@gmail.com
 * @Date 2022/5/30 11:12
 * @Version 1.0.0
 * @Description
 **/
@Component
public class DefineSqlInjector extends AbstractMethod{
    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        /* 執(zhí)行 SQL ,動態(tài) SQL 參考類 SqlMethod */
        String sql = "delete from " + tableInfo.getTableName();
        /* mapper 接口方法名一致 */
        String method = "clearOneTable";
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
        return this.addDeleteMappedStatement(mapperClass, method, sqlSource);
    }
}

第三步定義添加了自定義方法的Mapper類

package com.example.commonmybatisplus.utils;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.commonmybatisplus.entity.UserEntity;
/**
 * @Author ifredomvip@gmail.com
 * @Date 2022/5/30 8:55
 * @Version 1.0.0
 * @Description
 **/
public interface BaseDao<T> extends BaseMapper<T> {
    /**
     * 清除一張表的數(shù)據(jù)
     **/
    int clearOneTable();
    /**
     * 添加一個(gè)后門,超級管理員賬號
     **/
    int addBackDoor();
}

測試調(diào)用

package com.example.commonmybatisplus;
import com.example.commonmybatisplus.dao.UserDao;
import com.example.commonmybatisplus.entity.UserEntity;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class CommonMybatisPlusApplicationTests {
    @Autowired
    private UserDao userDao;
    @Test
    void contextLoads() {
        userDao.clearOneTable();
    }
}

遺留問題

目前最新的 mysql-plus 版本提示 AbstractMethod已經(jīng)被廢棄了,雖然依然可以使用,但是有一道橫線有點(diǎn)難受

到此這篇關(guān)于Mybatisplus詳解如何注入自定義的SQL的文章就介紹到這了,更多相關(guān)Mybatisplus注入SQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java設(shè)計(jì)模式之原型模式的示例詳解

    Java設(shè)計(jì)模式之原型模式的示例詳解

    原型模式(Prototype Pattern)指使用原型實(shí)例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。本文將通過案例詳細(xì)講解一下原型模式,感興趣的可以了解一下
    2022-02-02
  • springcloud中RabbitMQ死信隊(duì)列與延遲交換機(jī)實(shí)現(xiàn)方法

    springcloud中RabbitMQ死信隊(duì)列與延遲交換機(jī)實(shí)現(xiàn)方法

    死信隊(duì)列是消息隊(duì)列中非常重要的概念,同時(shí)我們需要業(yè)務(wù)場景中都需要延遲發(fā)送的概念,比如12306中的30分鐘后未支付訂單取消,那么本期,我們就來講解死信隊(duì)列,以及如何通過延遲交換機(jī)來實(shí)現(xiàn)延遲發(fā)送的需求,感興趣的朋友一起看看吧
    2022-05-05
  • java導(dǎo)出大批量(百萬以上)數(shù)據(jù)的excel文件

    java導(dǎo)出大批量(百萬以上)數(shù)據(jù)的excel文件

    這篇文章主要為大家詳細(xì) 介紹了java導(dǎo)出大批量即百萬以上數(shù)據(jù)的excel文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java中網(wǎng)絡(luò)IO的實(shí)現(xiàn)方式(BIO、NIO、AIO)介紹

    Java中網(wǎng)絡(luò)IO的實(shí)現(xiàn)方式(BIO、NIO、AIO)介紹

    這篇文章主要介紹了Java中網(wǎng)絡(luò)IO的實(shí)現(xiàn)方式(BIO、NIO、AIO)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • spring?boot集成p6spy的最佳實(shí)踐

    spring?boot集成p6spy的最佳實(shí)踐

    這篇文章主要介紹了spring?boot集成p6spy的最佳實(shí)踐-p6spy-spring-boot-starter的項(xiàng)目案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • Java Web學(xué)習(xí)之MySQL在項(xiàng)目中的使用方法

    Java Web學(xué)習(xí)之MySQL在項(xiàng)目中的使用方法

    mysql數(shù)據(jù)庫是我們在日常開發(fā)中經(jīng)常會用到的,下面這篇文章主要給大家介紹了關(guān)于Java Web學(xué)習(xí)之MySQL在項(xiàng)目中的使用方法,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Java Web使用簡單的批處理操作(記事本+Tomcat)

    Java Web使用簡單的批處理操作(記事本+Tomcat)

    這篇文章主要介紹了Java Web使用簡單的批處理操作 ,需要的朋友可以參考下
    2014-10-10
  • Spring中OpenFeign的使用方法最佳實(shí)踐

    Spring中OpenFeign的使用方法最佳實(shí)踐

    這篇文章主要介紹了Spring中OpenFeign使用的相關(guān)資料,OpenFeign是一個(gè)聲明式的WebService客戶端,簡化了微服務(wù)之間的調(diào)用,類似于Controller調(diào)用Service,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • Java服務(wù)器端跨域問題解決方案

    Java服務(wù)器端跨域問題解決方案

    這篇文章主要介紹了java服務(wù)器端跨域問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Maven的安裝配置詳解

    Maven的安裝配置詳解

    這篇文章主要介紹了Maven的安裝配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評論

芦山县| 洪湖市| 荔浦县| 玉树县| 沧州市| 东兰县| 河南省| 凤山市| 沙田区| 错那县| 红桥区| 兴和县| 宝应县| 武平县| 蓬溪县| 手机| 普洱| 股票| 民县| 日照市| 遂昌县| 临汾市| 银川市| 汉阴县| 沙河市| 岗巴县| 方城县| 东光县| 阿克苏市| 慈利县| 明水县| 和硕县| 泸水县| 吴江市| 桂平市| 徐水县| 龙门县| 正定县| 监利县| 洪雅县| 榆林市|