狂神說 MyBatisPlus 學習筆記


一、快速入門

文檔:https://mp.baomidou.com/

使用第三方組件:

  1. 導入對應依賴
  2. 研究依賴如何配置
  3. 代碼如何編寫
  4. 提高擴展技術能力

步驟:

1、創建數據庫 mybatis_plus


2、創建user表

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
	id BIGINT(20) NOT NULL COMMENT '主鍵ID',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年齡',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
	PRIMARY KEY (id)
);

2.1、插入數據

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');  

3、創建項目


 4、導入依賴

<!--數據庫驅動-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.20</version>
</dependency>
<!--mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>
<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

說明:我們使用mybatis-plus可以節省我們大量的代碼,盡量不要同時導入mybatis和mybatis-plus!

5、連接數據庫,這一步和mybatis相同

# mysql
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

6、傳統方式:pojo-dao(連接mybatis,配置mapper.xml文件)- service - controller

6、使用了mybatis-plus 之后

pojo(實體類):

  • extends Model<User> : 必須存在對應的原始mapper並繼承baseMapper並且可以使用的前提下才能使用此 AR 模式 !!!

AR模式看下這篇博客:https://blog.csdn.net/qq_41933149/article/details/101120648

@Data
@TableName("user")
public class User extends Model<User> {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private Long managerId;
    private LocalDateTime createTime;
}

mapper接口(dao層):

// 在對應的Mapper上面繼承基本的接口 BaseMapper
@Repository // 代表持久層
public interface UserMapper extends BaseMapper<User> {
    // 所有的CRUD操作都已經基本完成了
    // 你不需要像以前的配置一大堆文件了
}

Service層:

import com.baomidou.mybatisplus.extension.service.IService;
import com.zhixi.pojo.User;

/**
 * @author zhangzhixi
 * @date 2021-6-8 23:11
 */
public interface UserService extends IService<User> {
}

  Service層實現類:

/**
 * @author zhangzhixi
 * @date 2021-6-8 23:11
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

}

啟動類:

  • 注意點:我們需要在主啟動類上去掃描我們的mapper包下的所有接口

測試類中測試

@SpringBootTest
class MybatisPlusApplicationTests {

    // 繼承了BaseMapper,所有的方法都來自父類
    // 我們也可以編寫自己的擴展方法
    @Autowired
    UserMapper userMapper;

    @Test
    void contextLoads() {
        // 參數是一個 Wrapper , 條件構造器,這里我們先不用 null
        // 查詢全部用戶
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);
    }
}

思考問題:

1、SQL是誰幫我們寫的?MyBatis-Plus都寫好了

2、方法哪里來的?MyBatis-Plus 都寫好了

二、配置日志

我們所有的sqld現在都是不可見的,我們希望知道它是怎么執行的,所以我們必須要看日志!

# 配置日志 (系統自帶的,控制台輸出)
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

 

配置完畢日志之后,后面的學習就需要注意這個自動生成的SQL,你們就會喜歡上MyBatis-Plus !

三、CRUD

1. 插入操作

Insert 插入

@Test
public void testInsert() {
    User user = new User();
    user.setName("Dainel");
    user.setAge(3);
    user.setEmail("daniel@alibaba.com");

    int result = userMapper.insert(user);// 幫我們自動生成id
    System.out.println(result);// 受影響的行數
    System.out.println(user);// 發現: id自動回填
}

數據庫插入的id默認值為:全局的唯一id

2. 主鍵生成策略

默認 ID_WORKER 全局唯一id

分布式系統唯一id生成:https://www.cnblogs.com/haoxinyue/p/5208136.html

雪花算法:

snowflake是Twitter開源的分布式ID生成算法,結果是一個long型的ID。其核心思想是:使用41bit作為毫秒數,10bit作為機器的ID(5個bit是數據中心,5個bit的機器ID),12bit作為毫秒內的流水號(意味着每個節點在每毫秒可以產生 4096 個 ID),最后還有一個符號位,永遠是0。可以保證幾乎全球唯一!

主鍵自增

我們需要配置主鍵自增:

  1. 實體類字段上 @TableId(type = IdType.AUTO) 

  2. 數據庫字段上一定是自增的

  3. 再次測試即可

其余的源碼解釋

public enum IdType {
    AUTO(0), // 數據庫id自增
    NONE(1), // 未設置主鍵
    INPUT(2), // 手動輸入,自己寫id
    ID_WORKER(3), // 默認的全局唯一id
    UUID(4), // 全局唯一id uuid
    ID_WORKER_STR(5); // ID_WORKER 字符串表示法
}

3、更新操作

@Test
    /*更新操作*/
void updateUser() {
    // 查詢到要更新的用戶
    User user = userMapper.selectById(7);
    // 要更新的值
    user.setName("demo");
    user.setAge(21);
    // 執行更新
    userMapper.updateById(user);
}

4. 自動填充

創建時間、修改時間!這些個操作一般都是自動化完成的,我們不希望手動更新!

**阿里巴巴開發手冊:**所有的數據庫表:gmt_create、gmt_modified幾乎所有的表都要配置上!而且需要自動化!

方式一:數據庫級別(工作中不允許修改數據庫)

  1. 在表中新增字段 create_time,update_time;注意將更新的時間戳勾選

     

  2. 再次測試插入方法,我們需要先把實體類同步

    private Date createTime;
    private Date updateTime;
  3. 再次查看更新結果即可

  

方式二:代碼級別

  1. 刪除數據庫中的默認值、更新操作

  2. 實體類的字段屬性上需要增加注解

    //字段添加填充內容
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
  3. 編寫處理器來處理這個注解即可:handler/MyMetaObjectHandler

    package com.kuang.handler;
    
    import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.ibatis.reflection.MetaObject;
    import org.springframework.stereotype.Component;
    
    import java.util.Date;
    
    @Slf4j
    @Component // 一定不要忘記把處理器加到IOC容器中
    public class MyMetaObjectHandler implements MetaObjectHandler {
    
        // 插入時候的填充策略
        @Override
        public void insertFill(MetaObject metaObject) {
            log.info("start insert fill ...");
            // setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
            this.setFieldValByName("createTime", new Date(), metaObject);
            this.setFieldValByName("updateTime", new Date(), metaObject);
        }
    
        // 更新時的填充策略
        @Override
        public void updateFill(MetaObject metaObject) {
            log.info("start update fill ...");
            this.setFieldValByName("updateTime", new Date(), metaObject);
        }
    
    }
    
  4. 測試插入

  5. 測試更新,觀察時間已經更新

5. 樂觀鎖

在面試過程中,我們經常會被問到樂觀鎖,悲觀鎖。

樂觀鎖:顧名思義,它總是認為不會出現問題,無論干什么都不去上鎖!如果出現了問題,再次更新值測試!

悲觀鎖:顧名思義,它總是認為總是出現問題,無論干什么都上鎖!再去操作!

樂觀鎖實現方式:

  • 取出記錄時,獲取當前version
  • 更新時,帶上這個version
  • 執行更新時, set version = newVersion where version = oldVersion
  • 如果version不對,就更新失敗

測試一下MyBatisPlus的插件:

  1、數據庫中增加一個version字段,並設置默認值為1

  2、實體類添加注解

@Version // 樂觀鎖的version注解
private Integer version;

  3、編寫配置

  config/MybatisPlusConfig

// 配置,會被spring掃描到
@Configuration
public class MybatisPlusConfig {
    // 注冊樂觀鎖
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInnerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}

  4、測試方法

測試樂觀鎖成功:

  將2號的姓名改為lipu。看他的version會怎么變化

@Test
void OptimisticLock() {
    // 查詢到要進行更新的用戶
    User user = userMapper.selectById(2);
    // 修改用戶的屬性
    user.setName("lipu");
    user.setAge(28);
    // 提交更新
    userMapper.updateById(user);
}

 測試樂觀鎖失敗(多線程下)

// 測試樂觀鎖失敗!多線程下
@Test
public void testVersionFall() {
    // 線程1
    User user1 = userMapper.selectById(9);
    user1.setName("fan111");
    user1.setAge(14);
    // 線程2
    User user2 = userMapper.selectById(9);
    user2.setName("fan222");
    user2.setAge(24);
    userMapper.updateById(user2);
    //自旋鎖來多次嘗試提交!
    userMapper.updateById(user1); //如果沒有樂觀鎖就會覆蓋插隊線程的值
}

6. 查詢操作

// 測試查詢
@Test
public void testSelectById(){
    User user = userMapper.selectById(1);
    System.out.println(user);
}

// 批量查詢
@Test
public void testSelectByBatchIds(){
    List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
    users.forEach(System.out::println);
}

// 按照條件查詢之一使用 map
@Test
public void testSelectByMap(){
    HashMap<String, Object> map = new HashMap<>();
    // 自定義要查詢
    map.put("name","Dainel");
    map.put("age","6");
    List<User> users = userMapper.selectByMap(map);
    users.forEach(System.out::println);
}

7、分頁查詢

分頁網站頻繁使用

  1. 原始使用limit進行分頁
  2. pageHelper第三方插件
  3. MybatisPlus內置了分頁插件

如何使用:

 1、配置分頁攔截器:config/MybatisPlusConfig

  // 分頁插件
  @Bean
  public PaginationInterceptor paginationInterceptor() {
      return new PaginationInterceptor();
  }

 2、編寫查詢 

 // 分頁查詢
 @Test
 void selectLimit() {
     Page<User> page = new Page<User>(2, 5);
     // 獲取通過分頁查詢到的記錄條數
     page.getRecords().forEach(System.out::println);
     // 查詢
     userMapper.selectPage(page, null);
     // 查詢總記錄條數
     System.out.println("總計數條數:" + page.getTotal());
 }

8. 刪除操作

// 測試刪除
@Test
public void testdelete(){
    userMapper.deleteById(6L);
}

// 測試批量刪除
@Test
public void testdeleteBatchId(){
    userMapper.deleteBatchIds(Arrays.asList(1,14));
}

//通過map刪除
@Test
public void testDeleteByMap(){
    HashMap<String, Object> map = new HashMap<>();
    map.put("name","KUANG");
    userMapper.deleteByMap(map);
}

我們在工作中會遇到一些問題:邏輯刪除!

9. 邏輯刪除

物理刪除:從數據庫中直接移除

邏輯刪除:在數據庫中沒有被移除,而是通過一個變量讓他生效!deleted=0 --> deleted=1

管理員可以查看被刪除的記錄!防止數據的丟失!類似於回收站!

步驟:

  1、在數據庫表中增加一個deleted字段

  2、修改實體類

// 表邏輯刪除
@TableLogic
private int deleted;

  3、配置:config/MybatisPlusConfig

注意:在新版本的MP中,不需要再寫邏輯刪除配置了,知道就行,只需要在實體類邏輯刪除字段上加上注解即可!

// 邏輯刪除組件
public ISqlInjector sqlInjector(){
    return new LogicSqlInjector();
}

  4、properties配置(默認,可以不配置)

# 配置邏輯刪除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

測試邏輯刪除:

 // 邏輯刪除
 @Test
 void deleteLogic() {
     userMapper.deleteById(1);
 }

 邏輯刪除成功、

 我們通過查詢1號用戶,驗證下看是否能夠查詢的到:

四、性能分析插件

PerformanceInterceptor在3.2.0被移除了,如果想進行性能分析,用第三方的,官方這樣寫的“該插件 3.2.0 以上版本移除推薦使用第三方擴展 執行 SQL 分析打印 功能

https://baomidou.com/guide/p6spy.html

我們在平時的開發中,會遇到一些慢sql。解決方案:測試,druid監控…

作用:性能分析攔截器,用於輸出每條SQL語句及其執行時間

MyBatisPlus也提供性能分析插件,如果超過這個時間就停止運行!

  1、導入插件

// SQL執行效率插件
@Bean
@Profile({"dev","test"})
public PerformanceInterceptor performanceInterceptor(){
    PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
    performanceInterceptor.setMaxTime(100); //ms 設置sql執行的最大時間,如果超過了則不執行
    performanceInterceptor.setFormat(true); // 是否格式化
    return performanceInterceptor;
}

記住,要在SpringBoot中配置環境為dev或者test環境!

# 開發環境
spring.profiles.active=dev

  2、測試使用

 // 分頁查詢
 @Test
 void selectLimit() {
     Page<User> page = new Page<User>(1, 5);
     // 獲取通過分頁查詢到的記錄條數
     page.getRecords().forEach(System.out::println);
     // 查詢
     userMapper.selectPage(page, null);
     // 查詢總記錄條數
     System.out.println("總計數條數:" + page.getTotal());
 }

只要超出時間就會拋出異常

使用性能分析插件可以提高效率,新版本MP已經移除該拆件了,可以使用druid

五、代碼自動生成**非常NB

dao、pojo、service、controller都給我自己去編寫完成!

AutoGenerator 是 MyBatis-Plus 的代碼生成器,通過 AutoGenerator 可以快速生成 Entity、

Mapper、Mapper XML、Service、Controller 等各個模塊的代碼,極大的提升了開發效率。

只需要改實體類名字 和包名 還有 數據庫配置即可

需要使用到的pom依賴:

 <dependencies>
        <!--swagger依賴-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>

        <!-- 模板引擎 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>
        <!--導入mysql驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

測試代碼:/test/...

package com.zhixi;

/**
 * @author zhangzhixi
 * @date 2021/2/20 20:47
 */

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;

// 代碼自動生成器
public class zhixiCode {
    public static void main(String[] args) {
        // 需要構建一個 代碼自動生成器 對象
        AutoGenerator mpg = new AutoGenerator();

        // 配置策略
        // 1、全局配置
        GlobalConfig gc = new GlobalConfig();
        // 代碼輸出到哪個目錄(獲取到項目目錄)
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        // 設置作者
        gc.setAuthor("張志喜");
        // 是否打開資源管理器(生成完代碼打開目錄)
        gc.setOpen(false);
        // 是否覆蓋原來的文件
        gc.setFileOverride(false);

        // 去掉IService的I前綴(正則)
        gc.setServiceName("%sService");

        // 設置字段
        gc.setIdType(IdType.ID_WORKER);
        gc.setDateType(DateType.ONLY_DATE);
        // 配置swagger
        gc.setSwagger2(true);
        mpg.setGlobalConfig(gc);

        //2、設置數據源
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://182.92.209.212:3306/mybatis_plus?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("密碼");
        // 數據庫類型
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        //3、包的配置(只需要改實體類名字 和包名 還有 數據庫配置即可)
        PackageConfig pc = new PackageConfig();

        // 模塊名
        pc.setModuleName("blog");
        // 設置類放在哪個包下
        pc.setParent("com.kuang");
        // 設置實體類
        pc.setEntity("entity");
        // 設置mapper
        pc.setMapper("mapper");
        // 設置services層
        pc.setService("service");
        // 設置controller層
        pc.setController("controller");

        mpg.setPackageInfo(pc);

        //4、策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 設置要映射的表名
        strategy.setInclude("blog_tags", "course", "links", "sys_settings", "user_record", " user_say");

        // 設置下划線轉駝峰命名
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 自動lombok;
        strategy.setEntityLombokModel(true);
        // 設置邏輯刪除列名
        strategy.setLogicDeleteFieldName("deleted");

        // 自動填充配置
        TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);/*創建時間*/
        TableFill gmtModified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);/*修改時間*/
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(gmtCreate);
        tableFills.add(gmtModified);
        // 添加自動填充
        strategy.setTableFillList(tableFills);

        // 樂觀鎖
        strategy.setVersionFieldName("version");/*設置版本字段名稱*/
        strategy.setRestControllerStyle(true);
        strategy.setControllerMappingHyphenStyle(true);// localhost:8080/hello_id_2

        mpg.setStrategy(strategy);

        mpg.execute(); //執行
    }
}

六、SQL注入器:實現自定義通用方法

 MP在一開始就給大家提供了很多通用的方法,在DefaultSqlInjector這個類中,在MethodList這個集合當中包含的都是通用方法類,如果想要使用自定義通用方法,也需要添加到這個集合當中。

/**
 * SQL 默認注入器
 *
 * @author hubin
 * @since 2018-04-10
 */
public class DefaultSqlInjector extends AbstractSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        return Stream.of(
            new Insert(),
            new Delete(),
            new DeleteByMap(),
            new DeleteById(),
            new DeleteBatchByIds(),
            new Update(),
            new UpdateById(),
            new SelectById(),
            new SelectBatchByIds(),
            new SelectByMap(),
            new SelectOne(),
            new SelectCount(),
            new SelectMaps(),
            new SelectMapsPage(),
            new SelectObjs(),
            new SelectList(),
            new SelectPage()
        ).collect(toList());
    }
}

第一步:創建自定義方法的類(以創建刪除所有記錄的方法為例

  類名是DelFillUserMethod,這個是自定義的,但是最好是見名知意的類名。
繼承AbstractMethod抽象類,AbstractMethod是抽象的注入方法類,每個通用方法也都繼承了這個類,也是為了方便調用里面的方法
重寫injectMappedStatement方法,injectMappedStatement內是我們完成我們這個方法具體的邏輯。

 1 package com.zhixi.method;
 2 
 3 import com.baomidou.mybatisplus.core.injector.AbstractMethod;
 4 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 5 import org.apache.ibatis.mapping.MappedStatement;
 6 import org.apache.ibatis.mapping.SqlSource;
 7 
 8 /**
 9  * @author zhangzhixi
10  * @date 2021-6-13 20:56
11  */
12 public class DelAllMethod extends AbstractMethod {
13     @Override
14     public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
15         // 1、自定義執行的sql語句
16         String sql = "delete from " + tableInfo.getTableName();
17         // 2、mapper接口方法名
18         String method = "deleteUserAll";
19         /**
20          * 3、添加動態SQL標簽處理器
21          * 注意只需要傳入sql即可
22          */
23         SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
24         // 4、返回statement對象
25         return addDeleteMappedStatement(mapperClass, method, sqlSource);
26     }
27 }

第二步:創建注入器,並把自定義的方法添加到集合當中

  • 類名是CustomSqlInjector,自定義的
  • 繼承DefaultSqlInjector並重寫getMethodList,SQL 默認注入器上面也有提到過,我們得把我們自定義的方法加入到通用方法的集合methodList當中
 1 package com.zhixi.injector;
 2 
 3 import com.baomidou.mybatisplus.core.injector.AbstractMethod;
 4 import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
 5 import com.zhixi.method.DelAllMethod;
 6 import org.springframework.stereotype.Component;
 7 
 8 import java.util.List;
 9 
10 /**
11  * @author zhangzhixi
12  * @date 2021-6-13 22:42
13  */
14 @Component
15 public class MyInjector extends DefaultSqlInjector {
16     @Override
17     public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
18         // 1、先要通過父類方法,獲取到原有的集合,不然會自帶的通用方法會失效的
19         List<AbstractMethod> methodList = super.getMethodList(mapperClass);
20         // 2、添加自定義mapper類
21         methodList.add(new DelAllMethod());
22         return methodList;
23     }
24 }

第三步:在Mapper中添加自定義的方法

package com.zhixi.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zhixi.pojo.User;
import org.springframework.stereotype.Repository;

/**
 * @author zhangzhixi
 * @date 2021-6-10 13:24
 */
@Repository
public interface UserMapper extends BaseMapper<User> {
    /**
     * 刪除所有記錄
     *
     * @return 影響行數
     */
    int deleteUserAll();
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM