MybatisPlus使用示例參考

MybatisPlus使用示例參考

目錄:


配置入門
  1. pom.xml
  2. MyBatisPlusConfig
  3. application.properties
  4. Sql和實體類和自動填充策略處理程序
單元測試和效果展示
  1. insert
  2. update
  3. delete
  4. select
  5. 樂觀鎖
  6. 分頁
  7. 多條件查詢(order by\group by\多表查詢)
逆向工程實現
  1. 編寫逆向工程文件
  2. 添加配置文件

配置入門


1. pom.xml

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

2. MyBatisPlusConfig

配置清單:
樂觀鎖
分頁查詢
邏輯刪除
性能測試

import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.EnableTransactionManagement;

// 這裏設置這個類爲配置類
@MapperScan("com.example.demo.mapper")
@EnableTransactionManagement
@Configuration
public class MyBatisPlusConfig {

    // TODO 2020/6/24 配置類
    // 樂觀鎖組件,樂觀鎖攔截類
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

    // 分頁查詢插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        // 這裏我們簡單的使用的話就只需要簡單的配置下面這一句話,如果有需求添加註釋中的配置
        return new PaginationInterceptor();
        //PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 設置請求的頁面大於最大頁後操作, true調回到首頁,false 繼續請求  默認false
        // paginationInterceptor.setOverflow(false);
        // 設置最大單頁限制數量,默認 500 條,-1 不受限制
        // paginationInterceptor.setLimit(500);
        // 開啓 count 的 join 優化,只針對部分 left join
        //paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        //return paginationInterceptor;
    }

    // 配置邏輯刪除
    // 3.1.1 之後不需要這個配置
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }

    // 配置性能測試
    @Bean
    @Profile({"dev","test"})// 設置 dev test 環境開啓,否則會導致性能比較低
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        // 設置sql執行的最大時間,如果超時那麼就執行失敗
        performanceInterceptor.setMaxTime(100);
        // sql是否進行格式化
        performanceInterceptor.setFormat(true);
        return performanceInterceptor;
    }
}

3. application.properties

# 服務端口
server.port=8080

# jdbc
spring.datasource.password=root
spring.datasource.username=root
# 配置安全連接爲false
spring.datasource.url=jdbc:mysql://localhost:3306/mybatisplus?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
# 配置驅動名稱
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 日誌:配置爲默認
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl


# ## mybatis的相關配置 ##

# 邏輯刪除配置
# 刪除之後的話我們就配置這個邏輯刪除字段爲 1
mybatis-plus.global-config.db-config.logic-delete-value=1
# 刪除之前的話我們就配置這個邏輯刪除字段爲 0
mybatis-plus.global-config.db-config.logic-not-delete-value=0

# 性能分析配置,這裏我們需要配置一下開發環境使得性能分析插件生效
spring.profiles.active=dev

# mybatis的代碼自動生成,這裏禁用模板緩存
spring.thymeleaf.cache=false

4. Sql和實體類和自動填充策略處理程序

在這裏插入圖片描述

在這裏插入圖片描述

CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatisplus` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `mybatisplus`;

DROP TABLE IF EXISTS `person`;

CREATE TABLE `person` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年齡',
  `email` varchar(50) DEFAULT NULL COMMENT '郵箱',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',
  `version` int(11) DEFAULT '1' COMMENT '版本號',
  `deleted` int(1) DEFAULT '0' COMMENT '邏輯刪除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

insert  into `person`(`id`,`name`,`age`,`email`,`create_time`,`update_time`,`version`,`deleted`) values (1,'Daming',18,'[email protected]','2020-06-24 17:59:08','2020-06-24 17:59:08',1,0),(2,'Jack',20,'[email protected]','2020-06-24 17:59:08','2020-06-24 17:59:08',1,0),(3,'Tom',28,'[email protected]','2020-06-24 17:59:08','2020-06-24 17:59:08',1,0),(4,'Sandy',21,'[email protected]','2020-06-24 17:59:08','2020-06-24 17:59:08',1,0),(5,'Billie',36,'[email protected]','2020-06-24 17:59:08','2020-06-24 17:59:08',1,0);

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年齡',
  `email` varchar(50) DEFAULT NULL COMMENT '郵箱',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',
  `version` int(11) DEFAULT '1' COMMENT '版本號',
  `deleted` int(1) DEFAULT '0' COMMENT '邏輯刪除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

insert  into `user`(`id`,`name`,`age`,`email`,`create_time`,`update_time`,`version`,`deleted`) values (1,'Daming',18,'[email protected]','2020-06-24 17:59:08','2020-06-24 17:59:08',1,0),(2,'Jack',20,'[email protected]','2020-06-24 17:59:08','2020-06-24 17:59:08',1,0),(3,'Tom',28,'[email protected]','2020-06-24 17:59:08','2020-06-24 17:59:08',1,0),(4,'Sandy',21,'[email protected]','2020-06-24 17:59:08','2020-06-24 17:59:08',1,0),(5,'Billie',36,'[email protected]','2020-06-24 17:59:08','2020-06-24 17:59:08',1,0);
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;

@Data
@AllArgsConstructor
public class User implements Serializable {
//    主鍵自增策略,需要這個主鍵設置爲自增
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private int age;
    private String email;
    // 自動更新,數據庫或者代碼級別的操作
    // 插入的時候進行自動填充
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    // 更新的的時候進行自動填充
    @TableField(fill = FieldFill.UPDATE)
    private Date updateTime;

    // 樂觀鎖Version註解,最好默認值取 1
    @Version
    private Integer version;

    // 邏輯刪除
    @TableLogic
    private Integer deleted;

    public User() {
    }

    public User(Long id, String name, int age, String email) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.email = email;
    }
}
// 日誌
@Slf4j
// 需要加入到我們的IOC容器當中
@Component
public  class MyMetaObjectHandler implements MetaObjectHandler {
    // 插入的時候的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill");
        this.setFieldValByName("createTime", new Date(),metaObject);
    }

    // 更新的時候的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill");
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

單元測試和效果展示


insert

Execute SQL:
    INSERT 
    INTO
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@d277579]
        user
        ( name, age, email, create_time ) 
    VALUES
        ( 'ZhangSan', 25, '[email protected]', '2020-06-25 09:05:33' )
    @Test
    void insertTest() {
        int result = userMapper.insert(new User(null, "ZhangSan", 25, "[email protected]"));
        System.out.println(result);
        userMapper.selectList(null).forEach(System.out::println);
    }

update

    UPDATE
        user 
    SET
        name='LiSi',
        age=25,
        email='[email protected]',
        update_time='2020-06-25 09:10:45' 
    WHERE
        id=6 
        AND deleted=0
    @Test
    void updateTest() {
        User liSi = new User(6l, "LiSi", 25, "[email protected]");
        int result = userMapper.updateById(liSi);
        System.out.println(result);
        userMapper.selectList(null).forEach(System.out::println);
    }

delete

    // 通過id進行刪除
    @Test
    void deleteByIdTest() {
        int result = userMapper.deleteById(6l);
        System.out.println(result);

        userMapper.selectList(null).
                forEach(System.out::println);
    }
    // 多條件刪除
    @Test
    void deleteByMapTest() {
        // 當前頁和頁面的大小
        HashMap<String, Object> map = new HashMap<>();
        // 多條件刪除
        map.put("name", "Tom");
        map.put("age", 28);
        int result = userMapper.deleteByMap(map);
        System.out.println(result);

        userMapper.selectList(null).
                forEach(System.out::println);
    }

select

    // 查詢所有
    @Test
    void selectListTest() {
        List<User> users = userMapper.selectList(null);
        System.out.println("查詢所有的用戶信息");
        users.forEach(System.out::println);
    }
    // 批量查詢
    @Test
    void selectBatchIdsTest() {
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1,2,3));
        users.forEach(System.out::println);
    }
    // 條件查詢
    @Test
    void selectByMapTest() {
        HashMap<String, Object> map = new HashMap<>();
        // 通過字段裏面多條件進行查詢
        map.put("id", 1l);
        map.put("name", "Jone");
        List<User> users = userMapper.selectByMap(map);
        users.forEach(System.out::println);
    }

樂觀鎖

樂觀鎖

概念:顧名思義,他總是認爲不會出現問題,無論幹什麼都不去上鎖!如果出現了問題,再次更新值測試

樂觀鎖的實現方式

1. 取出當前記錄,獲取當前記錄的version

2. 更新時帶上這個version,並且執行更新時更新這個version

3. 如果version不對應,那麼就執行失敗

簡單的示例

– A 如果執行過程中其他線程進行了更改,那麼就會執行失敗
update user set name = “zhangsan”, version = version + 1
where id = 2 and version = 1

– B 如果這個時候B先執行,那麼A就會執行失敗
update user set name = “zhangsan”, version = version + 2
where id = 2 and version = 1

悲觀鎖

概念:他總是認爲會出現問題,無論幹什麼都會去上鎖,然後再進行操作

    // 樂觀鎖的測試,單線程
    @Test
    void testOptimisticLocker() {
        // 查詢用戶信息
        User user = userMapper.selectById(5l);
//        log.info(TAG,user);
        System.out.println(user);
        user.setName("New Billie");
        // 進行更新
        userMapper.updateById(user);
        // ==>  Preparing: UPDATE user SET name=?, age=?, email=?, create_time=?, update_time=?, version=? WHERE id=? AND version=?
    }
    // 樂觀鎖會出現的問題,多線程操作時可能會導致失敗
    @Test
    void testOptimisticLockerMore() {
        // 查詢用戶信息
        User user = userMapper.selectById(5l);
        System.out.println(user);
        user.setName("New Billie01");

        // 插隊的線程
        User user02 = userMapper.selectById(5l);
        System.out.println(user);
        user02.setName("New Billie02");
        userMapper.updateById(user02);
        
        // 進行更新
        userMapper.updateById(user);

        // 結果是 New Billie02 ,因爲這個更新成功了,但是下面這個 New Billie01 的更新版本號對比失敗,於是只執行了一次更新
    }

分頁

    // 分頁查詢,但是效率不會太高,因爲查詢出來的信息比較多
    @Test
    void selectPageTest() {
        // 當前頁和頁面的大小
        Page<User> page = new Page<>(1, 5);
        IPage<User> userIPage = userMapper.selectPage(page, null);
        // 分頁的循環遍歷
        page.getRecords().forEach(System.out::println);

        // 下面可以直接獲取其中的一些屬性
        System.out.println(page.getTotal());
        System.out.println(page.getSize());
    }

多條件查詢(order by\group by\多表查詢)

    // 通過id進行刪除
    @Test
    // SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name IS NOT NULL AND email IS NOT NULL AND age >= 12
    void wrapper01Test() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper
                .isNotNull("name")
                .isNotNull("email")
                // 大於
                .ge("age", 12);

        userMapper.selectList(wrapper).forEach(System.out::println);
    }

    @Test
        // SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age BETWEEN 10 AND 30
    void wrapper02Test() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper
                .between("age", 10, 30);

        userMapper.selectList(wrapper).forEach(System.out::println);

        Integer count = userMapper.selectCount(wrapper);
        System.out.println(count);
    }

    @Test
        // SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name = 'Tom'
    void wrapper03Test() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper
                .eq("name", "Tom");

        User user = userMapper.selectOne(wrapper);
        System.out.println(user);
    }

    @Test
        // SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name NOT LIKE '%ac%' AND email LIKE 't%'
    void wrapper04Test() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper
                .notLike("name", "ac")
                .likeRight("email", "t");

        userMapper.selectList(wrapper).forEach(System.out::println);
    }

    @Test
        //SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND id IN (select id from user where id<3)
    void wrapper05Test() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper
                .inSql("id","select id from user where id<4");

        userMapper.selectObjs(wrapper).forEach(System.out::println);
    }

    @Test
       //SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 ORDER BY id DESC
    void wrapper06Test() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper
                // 升序
                //.orderByAsc("id")
                // 降序
                .orderByDesc("id");
        userMapper.selectList(wrapper).forEach(System.out::println);
    }

逆向工程實現


代碼自動生成器

作用:dao、pojo、service、controller 都可以直接使用代碼生成器去生成

1. 編寫逆向工程文件

這裏新建一個工程進行演示

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

// 演示例子,執行 main 方法控制檯輸入模塊表名回車自動生成對應項目目錄中
public class MyGenerator {

    public static void main(String[] args) {
        // 代碼生成器
        AutoGenerator mpg = new AutoGenerator();

        /**
         * 配置你整體的包屬性(service\controller\mapper)
         */
        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        // 當前項目根目錄的獲取
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("YeZhiyue");
        // 設置是否打開資源管理器中的目錄
        gc.setOpen(false);
        // 配置是否覆蓋原文件
        gc.setFileOverride(false);
        // 各層文件名稱方式,例如: %sAction 生成 UserAction
        gc.setServiceName("%sService");
       // id的自增策略
        gc.setIdType(IdType.ID_WORKER);
        // 配置日期類型
        gc.setDateType(DateType.ONLY_DATE);
        // 用於前後端分離,實體屬性 Swagger2 註解
//        gc.setSwagger2(true);
        // 將這個配置扔到我們的全局配置中
        mpg.setGlobalConfig(gc);


        /**
         * 配置你的數據源
         */
        // 數據源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/mybatisplus?useUnicode=true&useSSL=false&characterEncoding=utf8");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("root");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        /**
         * 這裏配置你的存放不同層次的bao(Controller\Service\Mapper)
         */
        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("innermodle");
        pc.setParent("com.example.demo");
        // 設置存放包的名稱
        pc.setEntity("proj");
        pc.setService("service");
        pc.setController("controller");
        pc.setMapper("mapper");
        mpg.setPackageInfo(pc);


        /**
         * 配置一些mybatispluse的特殊性質
         *  自動填充
         *  樂觀鎖
         *  邏輯刪除
         */
        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 設置需要進行映射的表名
        // TODO 2020/6/24 這裏是需要根據需求添加表
        strategy.setInclude("user","person");
        // 這裏直接可以配置將名稱中的下劃線 _ 轉化爲 駝峯命名
        // 表名
        strategy.setNaming(NamingStrategy.underline_to_camel);
        // 字段名
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 你的實體類的父類
//        strategy.setSuperEntityClass("Object");
        // 自動生成lombok
        strategy.setEntityLombokModel(true);
        // 設置自動邏輯刪除設置 deleted
        strategy.setLogicDeleteFieldName("deleted");
        // 自動填充策略 create_time update_time 的自動填充策略
        TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
        TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(createTime);
        tableFills.add(updateTime);
        strategy.setTableFillList(tableFills);
        // 樂觀鎖
        strategy.setVersionFieldName("version");
        strategy.setRestControllerStyle(true);
        // 配置Rest的使用風格
        strategy.setRestControllerStyle(true);
        // 這裏是對Controller進行配置命名的下劃線風格
        strategy.setControllerMappingHyphenStyle(true);// localhost:8080/hello_id_2
        // 配置總的
        mpg.setStrategy(strategy);

        // 最後執行所有配置
        mpg.execute();
    }
}

代碼生成之後需要自行對其中一些部分進行修改,比如講對象放入我們的IOC容器,給對象添加構造器方法…

public User(){

}
public User(Long id, String name, Integer age, String email) {
    this.id = id;
    this.name = name;
    this.age = age;
    this.email = email;
}

2. 添加配置文件

pom.xml

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>
        <!-- 模板引擎 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>


    </dependencies>

application.properties

# 服務端口
server.port=8080

# jdbc
spring.datasource.password=root
spring.datasource.username=root
# 配置安全連接爲false
spring.datasource.url=jdbc:mysql://localhost:3306/mybatisplus?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
# 配置驅動名稱
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 日誌:配置爲默認
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl


# ## mybatis的相關配置 ##

# 邏輯刪除配置
# 刪除之後的話我們就配置這個邏輯刪除字段爲 1
mybatis-plus.global-config.db-config.logic-delete-value=1
# 刪除之前的話我們就配置這個邏輯刪除字段爲 0
mybatis-plus.global-config.db-config.logic-not-delete-value=0

# 性能分析配置,這裏我們需要配置一下開發環境使得性能分析插件生效
spring.profiles.active=dev

# mybatis的代碼自動生成,這裏禁用模板緩存
spring.thymeleaf.cache=false

MyBatisPlusConfig.java

import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.EnableTransactionManagement;

// 這裏設置這個類爲配置類
@MapperScan("com.example.demo.mapper")
@EnableTransactionManagement
@Configuration
public class MyBatisPlusConfig {

    // TODO 2020/6/24 配置類
    // 樂觀鎖組件,樂觀鎖攔截類
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

    // 分頁查詢插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        // 這裏我們簡單的使用的話就只需要簡單的配置下面這一句話,如果有需求添加註釋中的配置
        return new PaginationInterceptor();
        //PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 設置請求的頁面大於最大頁後操作, true調回到首頁,false 繼續請求  默認false
        // paginationInterceptor.setOverflow(false);
        // 設置最大單頁限制數量,默認 500 條,-1 不受限制
        // paginationInterceptor.setLimit(500);
        // 開啓 count 的 join 優化,只針對部分 left join
        //paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        //return paginationInterceptor;
    }

    // 配置邏輯刪除
    // 3.1.1 之後不需要這個配置
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }

    // 配置性能測試
    @Bean
    @Profile({"dev","test"})// 設置 dev test 環境開啓,否則會導致性能比較低
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        // 設置sql執行的最大時間,如果超時那麼就執行失敗
        performanceInterceptor.setMaxTime(100);
        // sql是否進行格式化
        performanceInterceptor.setFormat(true);
        return performanceInterceptor;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章