MybatisPlus使用示例參考
目錄:
配置入門
單元測試和效果展示
逆向工程實現
配置入門
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;
}
}