Mybatis-Plus 3.4.1學習
MybatisPlus
需要的基礎:spring,mybatis,springmvc
為什麼要學習
MybatisPlus可以節省我們大量工作時間,所有的CRUD程式碼它都可以自動化完成
JPA,tk-mapper,MybatisPlus
偷懶的
簡介
MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。
特性
- 無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑
- 損耗小:啟動即會自動注入基本 CURD,效能基本無損耗,直接面向物件操作
- 強大的 CRUD 操作:內建通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求
- 支援 Lambda 形式呼叫
- 支援主鍵自動生成:支援多達 4 種主鍵策略(內含分散式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
- 支援 ActiveRecord 模式:支援 ActiveRecord 形式呼叫,實體類只需繼承 Model 類即可進行強大的 CRUD 操作
- 支援自定義全域性通用操作:支援全域性通用方法注入( Write once, use anywhere )
- 內建程式碼生成器:採用程式碼或者 Maven 外掛可快速生成 Mapper 、 Model 、 Service 、 Controller 層程式碼,支援模板引擎,更有超多自定義配置等您來使用
- 內建分頁外掛:基於 MyBatis 物理分頁,開發者無需關心具體操作,配置好外掛之後,寫分頁等同於普通 List 查詢
- 分頁外掛支援多種資料庫:支援 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種資料庫
- 內建效能分析外掛:可輸出 Sql 語句以及其執行時間,建議開發測試時啟用該功能,能快速揪出慢查詢
- 內建全域性攔截外掛:提供全表 delete 、 update 操作智慧分析阻斷,也可自定義攔截規則,預防誤操作
支援資料庫
- mysql 、mariadb 、oracle 、db2 、h2 、hsql 、sqlite 、postgresql 、sqlserver 、presto 、Gauss 、Firebird
- Phoenix 、clickhouse 、Sybase ASE 、 OceanBase 、達夢資料庫 、虛谷資料庫 、人大金倉資料庫 、南大通用資料庫 、
快速入門
使用第三方元件:
- 匯入對應的依賴
- 研究依賴如何配置
- 程式碼如何編寫
- 提高擴充套件技術能力
步驟
- 建立資料庫 mybatis_plus
- 建立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)
);
——真實開發中,version(樂觀鎖),deleted(邏輯刪除),gmt_create、gmt_modified
DELETE FROM user;
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');
- 編寫專案,初始化專案!springboot
匯入依賴
<!--資料庫驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
說明:我們使用mybatis-plus可以節省我們大量的程式碼,儘量不要同時匯入mybatis和mybatis-plus,版本的差異
- 配置資料庫連線
配置檔案
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useUnicode=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-
傳統方式pojo-dao(連線mybatis,配置mapper.xml檔案)-service-controller
-
使用了mybatis-plus之後
- pojo
package com.company.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class User { private Long id; private String name; private Integer age; private String email; }
- mapper介面
package com.company.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.company.pojo.User; import org.springframework.stereotype.Repository; //在對應的Mapper上面繼承基本的類,BaseMapper @Repository //代表持久層 public interface UserMapper extends BaseMapper<User> { //所有的CRUD操作都已經編寫完成了 //不需要像以前的配置一大堆檔案 }
啟動類加上註解@MapperScan
package com.company; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; //掃描mapper資料夾 @MapperScan("com.company.mapper") @SpringBootApplication public class MybatisPlusApplication { public static void main(String[] args) { SpringApplication.run(MybatisPlusApplication.class, args); } }
- 使用,測試
//繼承了BaseMapper,所有的方法都來自父類,我們也可以編寫自己的擴充套件方法 @Autowired private UserMapper userMapper; @Test void contextLoads() { //引數是一個wrapper,條件構造器,這裡我們先不用,傳入null //查詢全部使用者 List<User> users = userMapper.selectList(null); users.forEach(System.out::println); }
-
思考問題
- SQL誰幫我們寫的,Mybatis-plus都寫好了
- 方法哪裡來的,Mybatis-plus都寫好了
- 技術沒有高低之分,只有使用技術的人有區別
配置日誌
所有的sql是不可見的,我們希望知道它是怎麼執行的,所以需要使用日誌
配置檔案增加 配置日誌
#配置日誌
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
配置完畢日誌之後,後面的學習就需要注意這個自動生成的SQL,就會喜歡上Mybatis-plus
CRUD擴充套件
insert插入
//測試插入
@Test
public void testInsert(){
User user = new User();
user.setName("小明的學習");
user.setAge(3);
user.setEmail("[email protected]");
int result = userMapper.insert(user); //幫我們自動生成id
System.out.println(result);
System.out.println(user);
}
資料庫插入的id的預設值為:全域性的唯一id
主鍵生成策略
對應資料庫中的主鍵(uuid,自增id,雪花演算法,redis,zookeeper)
分散式系統唯一id生成:https://www.cnblogs.com/haoxinyue/p/5208136.html
雪花演算法:
Twitter的snowflake演算法
snowflake是Twitter開源的分散式ID生成演算法,結果是一個long型的ID。其核心思想是:使用41bit作為毫秒數,10bit作為機器的ID(5個bit是資料中心:北京,上海。。,5個bit的機器ID),12bit作為毫秒內的流水號(意味著每個節點在每毫秒可以產生 4096 個 ID),最後還有一個符號位,永遠是0。具體實現的程式碼可以參看https://github.com/twitter/snowflake。 可以保證幾乎全球唯一
資料庫裡的主鍵策略修改 @TableId
package com.company.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String name;
private Integer age;
private String email;
}
IdType
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.baomidou.mybatisplus.annotation;
public enum IdType {
AUTO(0), //資料庫自增
NONE(1), //未設定主鍵
INPUT(2), //手動輸入
ASSIGN_ID(3), //預設的全域性唯一id
ASSIGN_UUID(4), //全域性唯一id uuid
/** @deprecated */
@Deprecated
ID_WORKER(3),
/** @deprecated */
@Deprecated
ID_WORKER_STR(3),
/** @deprecated */
@Deprecated
UUID(4);
private final int key;
private IdType(int key) {
this.key = key;
}
public int getKey() {
return this.key;
}
}
不同的主鍵策略測試
主鍵自增
配置主鍵自增
-
實體類欄位上@TableId(type = IdType.AUTO)
-
資料庫欄位一定要是自增, 資料庫欄位勾選自增
-
再次測試插入即可
其他型別
AUTO(0), //資料庫自增
NONE(1), //未設定主鍵
INPUT(2), //手動輸入
ASSIGN_ID(3), //預設的全域性唯一id
ASSIGN_UUID(4), //全域性唯一id uuid
一旦手動輸入id後,就需要自己設定id了
更新操作
//測試更新
@Test
public void testUpdate(){
User user = new User();
user.setId(1L);
user.setName("小明");
int i = userMapper.updateById(user);
System.out.println(i);
}
updateById 引數是一個物件
通過條件自動拼接sql
所以的sql都是自動幫你動態配置的
自動填充
建立時間,修改時間,這些操作一般都是自動化完成的,我們不希望手動更新
阿里巴巴開發手冊:所以的資料庫表:gmt_create,gmt_modified幾乎所有的表都要配置上,並且需要自動化
方式一:資料庫級別(工作中不允許修改資料庫)
- 在表中新增欄位,create_time,update_time
設定預設為CURRENT_TIMESTAMP
- 再次測試插入方法,我們需要先把實體類同步
新增欄位
private Date createTime;
private Date updateTime;
//測試更新
@Test
public void testUpdate(){
User user = new User();
user.setId(1L);
user.setName("小明");
user.setAge(32);
int i = userMapper.updateById(user);
System.out.println(i);
}
- 檢視結果,資料庫中已有自動更新時間
方式二:程式碼級別插入
- 刪除資料庫的預設值,更新操作
- 實體類欄位屬性上需要增加註解
//欄位新增填充內容
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
- 編寫處理器來處理這個註解即可
package com.company.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 ....");
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);
}
}
- 測試,插入資料,更新資料,時間都有變化
樂觀鎖
樂觀鎖:總是認為不會出現問題,無論幹什麼,不去加鎖,如果出現問題,再次更新值測試
悲觀鎖:無論幹什麼,都去上鎖
樂觀鎖實現方式:
- 取出記錄時,獲取當前version
- 更新時,帶上這個version
- 執行更新時,set version = newVersion where version = oldVersion
- 如果version不對,就更新失敗
測試一下MP的樂觀鎖外掛
- 給資料庫增加version欄位
- 實體類加對應欄位,同步實體類,加上註解
@Version //樂觀鎖version註解
private Integer version;
- 註冊元件
package com.company.config;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
//掃描mapper資料夾
@MapperScan("com.company.mapper")
@EnableTransactionManagement
@Configuration
public class MyBatisPlusConfig {
//註冊樂觀鎖外掛
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
- 測試,
//測試樂觀鎖成功
@Test
public void testOptimisticLocker(){
//查詢使用者資訊
User user = userMapper.selectById(1L);
//修改使用者資訊
user.setName("mie");
user.setEmail("[email protected]");
//執行更新操作
userMapper.updateById(user);
}
//測試樂觀鎖失敗,多執行緒下
@Test
public void testOptimisticLocker2(){
//執行緒1
User user = userMapper.selectById(1L);
//修改使用者資訊
user.setName("11mie");
user.setEmail("[email protected]");
//模擬另外一個執行緒執行了插隊操作
User user2 = userMapper.selectById(1L);
//修改使用者資訊
user2.setName("22mie");
user2.setEmail("[email protected]");
userMapper.updateById(user2);
//可以使用自旋鎖來多次嘗試提交
userMapper.updateById(user);//如果沒有樂觀鎖就會覆蓋插隊執行緒的值
}
查詢操作
//測試查詢
@Test
public void testSelectById(){
User user = userMapper.selectById(1L);
System.out.println(user);
}
//測試批量查詢
@Test
public void testSelectByBatchId(){
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
users.forEach(System.out::println);
}
//條件查詢之一 使用map操作
@Test
public void testSelectByBatchIds(){
Map<String,Object> map = new HashMap<>();
map.put("name","Tom");
map.put("age","3");
List<User> users = userMapper.selectByMap(map);
users.forEach(System.out::println);
}
分頁查詢
分頁在網站使用的十分之多
原始的limit
pageHelper 第三方外掛
MP其實也內建了分頁外掛
- 配置攔截器元件即可
//分頁外掛
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
- 直接使用Page物件即可
//測試分頁查詢
@Test
public void testPage(){
//引數一:當前頁
//引數二:頁面大小
//使用了分頁外掛之後,所有的分頁操作變的簡單
Page<User> page = new Page<>(2,5);
userMapper.selectPage(page, null);
page.getRecords().forEach(System.out::println);
System.out.println(page.getTotal());
}
刪除操作
//測試刪除
@Test
public void deleteById(){
userMapper.deleteById(1330002742293676036L);
}
//通過id批量刪除
@Test
public void deleteBatchId(){
userMapper.deleteBatchIds(Arrays.asList(1330002742293676034L,1330002742293676035L));
}
//通過Map刪除
@Test
public void deleteMap(){
Map<String,Object> map = new HashMap<>();
map.put("name","22mie");
userMapper.deleteByMap(map);
}
邏輯刪除
物理刪除:從資料庫中直接移除
邏輯刪除:在資料庫中沒有被移除,而是通過變數來讓他失效,deleted=0 =>deleted=1
管理員可以檢視被刪除的記錄,防止資料的丟失,類似於回收站
測試一下:
- 在資料表中增加一個deleted欄位
- 實體類中增加屬性,同步實體類
@TableLogic //邏輯刪除
private Integer deleted;
- 配置
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全域性邏輯刪除的實體欄位名(since 3.3.0,配置後可以忽略不配置步驟2)
logic-delete-value: 1 # 邏輯已刪除值(預設為 1)
logic-not-delete-value: 0 # 邏輯未刪除值(預設為 0)
- 測試
//測試刪除
@Test
public void deleteById(){
userMapper.deleteById(2L);
}
日誌列印,其實走的時更新操作
JDBC Connection [HikariProxyConnection@1703358554 wrapping com.mysql.cj.jdbc.ConnectionImpl@abbe000] will not be managed by Spring
==> Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0
==> Parameters: 2(Long)
<== Updates: 1
記錄在,deleted變化了,但是查詢不到
查詢會自動過濾邏輯刪除的
效能分析外掛
平時的開發中,會遇到一些慢sql,測試,drud。。
MP也提供效能分析外掛,如果超過這個時間就停止執行
- p6spy 依賴引入
application.yml <!-- https://mvnrepository.com/artifact/p6spy/p6spy -->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>
- application.yml 配置
spring:
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://localhost:3306/mybatis_plus?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useUnicode=true
username: root
password: 123456
- spy.properties 配置:
#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定義日誌列印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日誌輸出到控制檯
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日誌系統記錄 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 設定 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL字首
useprefix=true
# 配置記錄 Log 例外,可去掉的結果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 實際驅動可多個
#driverlist=org.h2.Driver
# 是否開啟慢SQL記錄
outagedetection=true
# 慢SQL記錄標準 2 秒
outagedetectioninterval=2
- 測試
//測試查詢
@Test
public void testSelectById(){
User user = userMapper.selectById(2L);
System.out.println(user);
}
結果
Consume Time:36 ms 2020-11-21 15:55:14
Execute SQL:SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE id=2 AND deleted=0
條件構造器wrapper
十分重要,wrapper
寫一些複雜的sql就可以使用它來替代
測試1 isNull
@Test
public void test(){
//查詢name不為空的使用者,且郵箱不為空的使用者,年齡大於等於12的人
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.isNotNull("name")
.isNotNull("email")
.ge("age",12);
userMapper.selectList(wrapper).forEach(System.out::println); //和map對比
}
測試2 eq
@Test
public void test2(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","Tom");
System.out.println(userMapper.selectOne(wrapper)); //查詢一個數據,出現多個結果使用list或者map
}
測試3 between
@Test
public void test3(){
//查詢年齡在20~30之間的使用者
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.between("age",20,30);
System.out.println(userMapper.selectCount(wrapper)); //查詢結果數
}
測試4 模糊查詢
//模糊查詢
@Test
public void test4(){
//
QueryWrapper<User> wrapper = new QueryWrapper<>();
//左和右 t%
wrapper.notLike("name","e")
.likeRight("email","t");
userMapper.selectMaps(wrapper).forEach(System.out::println); //查詢結果數
}
記住檢視打印出的sql進行分析
測試5 子查詢
@Test
public void test5(){
//
QueryWrapper<User> wrapper = new QueryWrapper<>();
//id在子查詢中查出來
wrapper.inSql("id","select id from user where id<3")
.notLike("name","e")
.likeRight("email","t");
userMapper.selectObjs(wrapper).forEach(System.out::println); //查詢結果數
}
測試6 排序
@Test
public void test6(){
//
QueryWrapper<User> wrapper = new QueryWrapper<>();
//通過id進行排序
wrapper.orderByDesc("id"); //desc降序,asc升序
userMapper.selectList(wrapper).forEach(System.out::println); //查詢結果數
}
官網:https://baomidou.com/guide/wrapper.html 有更多的例子
程式碼自動生成器
dao,pojo,service,controller 都自動編寫完成
一般都是 新建專案,匯入mybatis-plu依賴,配置檔案,然後再程式碼自動生成
AutoGenerator 是 MyBatis-Plus 的程式碼生成器,通過 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個模組的程式碼,極大的提升了開發效率。
使用教程
新增依賴
MyBatis-Plus 從 3.0.3
之後移除了程式碼生成器與模板引擎的預設依賴,需要手動新增相關依賴:
-
新增 程式碼生成器 依賴
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.1</version> </dependency>
-
新增 模板引擎 依賴,MyBatis-Plus 支援 Velocity(預設)、Freemarker、Beetl,使用者可以選擇自己熟悉的模板引擎,如果都不滿足您的要求,可以採用自定義模板引擎。
Velocity(預設):
<dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.2</version> </dependency>
Freemarker:
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.30</version> </dependency>
Beetl:
<dependency> <groupId>com.ibeetl</groupId> <artifactId>beetl</artifactId> <version>3.2.4.RELEASE</version> </dependency>
注意!如果您選擇了非預設引擎,需要在 AutoGenerator 中 設定模板引擎。
AutoGenerator generator = new AutoGenerator(); // set freemarker engine generator.setTemplateEngine(new FreemarkerTemplateEngine()); // set beetl engine generator.setTemplateEngine(new BeetlTemplateEngine()); // set custom engine (reference class is your custom engine class) generator.setTemplateEngine(new CustomTemplateEngine()); // other config ...
編寫配置
MyBatis-Plus 的程式碼生成器提供了大量的自定義引數供使用者選擇,能夠滿足絕大部分人的使用需求。
-
配置 GlobalConfig
//全域性配置 GlobalConfig globalConfig = new GlobalConfig(); globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java"); globalConfig.setAuthor("ming"); globalConfig.setOpen(false); globalConfig.setFileOverride(false);//是否覆蓋 globalConfig.setServiceName("%sService");//去service的I字首 globalConfig.setIdType(IdType.ASSIGN_ID); globalConfig.setDateType(DateType.ONLY_DATE); globalConfig.setSwagger2(true); generator.setGlobalConfig(globalConfig);
-
配置 DataSourceConfig
//設定資料來源 DataSourceConfig dataSourceConfig = new DataSourceConfig(); dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai"); dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver"); dataSourceConfig.setUsername("root"); dataSourceConfig.setPassword("123456"); dataSourceConfig.setDbType(DbType.MYSQL); generator.setDataSource(dataSourceConfig);
-
策略配置
//策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("user"); //設定要對映的表名
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//strategy.setSuperEntityClass("你自己的父類實體,沒有就不用設定");
strategy.setEntityLombokModel(true); //自動lombok
strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true); // localhost:8080/hello_id_2
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");
generator.setStrategy(strategy);
- 總的配置
package com.company;
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 MingCode {
public static void main(String[] args) {
//構建一個程式碼生成器物件
AutoGenerator generator = new AutoGenerator();
//全域性配置
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
globalConfig.setAuthor("ming");
globalConfig.setOpen(false);
globalConfig.setFileOverride(false);//是否覆蓋
globalConfig.setServiceName("%sService");//去service的I字首
globalConfig.setIdType(IdType.ASSIGN_ID);
globalConfig.setDateType(DateType.ONLY_DATE);
globalConfig.setSwagger2(true);
generator.setGlobalConfig(globalConfig);
//設定資料來源
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai");
dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
dataSourceConfig.setUsername("root");
dataSourceConfig.setPassword("123456");
dataSourceConfig.setDbType(DbType.MYSQL);
generator.setDataSource(dataSourceConfig);
//包的配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setModuleName("blog");
packageConfig.setParent("com.company");
packageConfig.setEntity("entity");
packageConfig.setMapper("mapper");
packageConfig.setService("service");
packageConfig.setController("controller");
generator.setPackageInfo(packageConfig);
//策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("user"); //設定要對映的表名
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//strategy.setSuperEntityClass("你自己的父類實體,沒有就不用設定");
strategy.setEntityLombokModel(true); //自動lombok
strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true); // localhost:8080/hello_id_2
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");
generator.setStrategy(strategy);
generator.execute();
}
}
-
執行會swagger註解爆紅是因為沒有匯入依賴
-
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>3.0.0</version> </dependency>