前言
為了鞏固所學(xué)的知識(shí),作者嘗試著開始發(fā)布一些學(xué)習(xí)筆記類的博客,方便日后回顧。當(dāng)然,如果能幫到一些萌新進(jìn)行新技術(shù)的學(xué)習(xí)那也是極好的。作者菜菜一枚,文章中如果有記錄錯(cuò)誤,歡迎讀者朋友們批評(píng)指正。
(博客的參考源碼可以在我主頁(yè)的資源里找到,如果在學(xué)習(xí)的過程中有什么疑問歡迎大家在評(píng)論區(qū)向我提出)
發(fā)現(xiàn)寶藏
前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。【寶藏入口】。
五、CRUD進(jìn)階開發(fā)I
1.mp日志簡(jiǎn)化(加快程序運(yùn)行速度)
- 在application.yml中添加配置
# 開啟mp日志 (輸出到控制臺(tái))
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- 運(yùn)行結(jié)果(多了很多查詢結(jié)果的詳細(xì)信息)
- 進(jìn)一步簡(jiǎn)化控制臺(tái)輸出
- 編輯applicatiion.yml(輸入banner就會(huì)有對(duì)應(yīng)提示)
- 創(chuàng)建logback.xml并編寫該配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
</configuration>
- 簡(jiǎn)化后的控制臺(tái)輸出(spring加載與mybatis-plus加載相關(guān)信息不再顯示)
2.條件查詢的三種方式
- 方式一:常規(guī)寫法按條件查詢
- 在測(cè)試類的查詢?nèi)糠椒?selectList() 方法上ctrl + 鼠標(biāo)左鍵進(jìn)入該方法的源代碼,可知當(dāng) selectList() 方法的參數(shù)為null的時(shí)候代表查全部,當(dāng)參數(shù)為Wrapper類的時(shí)候代表按該類的限制條件查詢
- 在Wrapper上ctrl + 鼠標(biāo)左鍵進(jìn)入該類源碼,然后crtl + H查看該類的繼承體系,可知該類是個(gè)抽象類,無(wú)法直接使用,此處我們選用該類的實(shí)現(xiàn)類QueryWrapper類來(lái)實(shí)現(xiàn)限制條件的編寫
- 在測(cè)試類的 testGetAll() 方法中編寫按條件查詢的代碼
@Test
void testGetAll() {
//按條件查詢
//創(chuàng)建QueryWrapper類對(duì)象
QueryWrapper qw = new QueryWrapper<>();
//編寫限制條件(查詢年齡小于18歲的用戶信息)
//lt代表 < gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
qw.lt("age", 18);
//將條件Wrapper<T>類型的參數(shù)qw傳入selectList()方法中
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
}
- 運(yùn)行結(jié)果
可以看到只查詢了2條記錄(原表有4條記錄)
2. 方式二:lambda格式按條件查詢I
- 常規(guī)寫法中的列名是寫在字符串里的,出錯(cuò)不容易發(fā)現(xiàn),可以借助lambda表達(dá)式確保列名不會(huì)寫錯(cuò),注意QuerWrapper接口后面要注入實(shí)體類
@Test
void testGetAll() {
//方式二:lambda格式按條件查詢I
//創(chuàng)建QueryWrapper類對(duì)象,并指定泛型
QueryWrapper<User> qw = new QueryWrapper<User>();
//編寫限制條件(查詢年齡大于18歲的用戶)
//lt代表 < gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
qw.lambda().gt(User::getAge, 18);
//將條件Wrapper<T>類型的參數(shù)qw傳入selectList()方法中
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
}
- 運(yùn)行結(jié)果
- 方式三:lambda格式按條件查詢II(推薦)
@Test
void testGetAll() {
//方式三:lambda格式按條件查詢II
//創(chuàng)建LambdaQueryWrapper類對(duì)象,并指定泛型
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//編寫限制條件(查詢年齡小于4歲的用戶)
//lt代表 < gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
lqw.lt(User::getAge, 4);
//將條件Wrapper<T>類型的參數(shù)lqw傳入selectList()方法中
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
- 運(yùn)行結(jié)果
- 多條件查詢(舉例)
- and邏輯(比如 x > 3 并且 x < 10)
@Test
void testGetAll() {
//方式三:lambda格式多條件查詢
//創(chuàng)建LambdaQueryWrapper類對(duì)象,并指定泛型
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//編寫限制條件(查詢大于3歲小于10歲的用戶)
//lt代表 < gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
//鏈?zhǔn)骄幊?/span>
lqw.lt(User::getAge, 10).lqw.gt(User::getAge, 3);
//將條件Wrapper<T>類型的參數(shù)傳入selectList()方法中
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
- 運(yùn)行結(jié)果
- or邏輯 (比如 x < 3 或者 x > 10)
@Test
void testGetAll() {
//方式三:lambda格式按條件查詢
//創(chuàng)建LambdaQueryWrapper類對(duì)象,并指定泛型
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//編寫限制條件(查詢年齡大10歲或者小于4歲的用戶)
//lt代表 < gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
//鏈?zhǔn)骄幊?/span>
lqw.gt(User::getAge, 10). or().lt(User::getAge, 4);
//將條件Wrapper<T>類型的參數(shù)傳入selectList()方法中
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
- 運(yùn)行結(jié)果
3.條件查詢null判斷
- 應(yīng)用場(chǎng)景舉例
當(dāng)我們?cè)诰W(wǎng)上購(gòu)物的時(shí)候篩選商品價(jià)格區(qū)間一般只設(shè)置上限或者下限,不設(shè)置值的那個(gè)輸入框需要進(jìn)行控制判斷
- 原本的User類作為下限類,新建一個(gè)Userquery類繼承User類表示上限
package com.example.dl_mp.domain.query;
import com.example.dl_mp.domain.User;
import lombok.Data;
//@Data 注解的主要作用是提高代碼的簡(jiǎn)潔,
// 使用這個(gè)注解可以省去代碼中大量的get()、 set()、 toString()等方法(這些通用方法可以一鍵生成);
//要使用 @Data 注解要先引入lombok,它是一個(gè)工具類庫(kù),可以用簡(jiǎn)單的注解形式來(lái)簡(jiǎn)化代碼,提高開發(fā)效率。
@Data
public class Userquery extends User {
//以年齡為例,設(shè)置上限屬性age2
private Integer age2;
}
- 模擬網(wǎng)頁(yè)傳入測(cè)試數(shù)據(jù)
@Test
void testGetAll() {
//模擬頁(yè)面?zhèn)鬟f過來(lái)的查詢數(shù)據(jù)
Userquery uq = new Userquery();
uq.setAge(3);
uq.setAge2(10);
//創(chuàng)建LambdaQueryWrapper類對(duì)象,并指定泛型
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//編寫限制條件(查詢年齡大于3歲或者小于10歲的用戶)
//lt代表 < gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
lqw.gt(User::getAge, uq.getAge());
lqw.lt(User::getAge, uq.getAge2());
//將條件Wrapper<T>類型的參數(shù)傳入selectList()方法中
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
- 運(yùn)行結(jié)果(但是如果getAge ()或者getAge2()為空,則查詢失?。?/li>
- 用if語(yǔ)句判斷(太多的if語(yǔ)句程序冗余,能用但是不推薦)
@Test
void testGetAll() {
//模擬頁(yè)面?zhèn)鬟f過來(lái)的查詢數(shù)據(jù)
Userquery uq = new Userquery();
//此處不設(shè)置下限Age的值
//uq.setAge(3);
uq.setAge2(10);
//創(chuàng)建LambdaQueryWrapper類對(duì)象,并指定泛型
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//編寫限制條件(查詢年齡小于10歲的用戶)
//lt代表 < gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
if(null != uq.getAge()){
lqw.gt(User::getAge, uq.getAge());
}
lqw.lt(User::getAge, uq.getAge2());
//將條件Wrapper<T>類型的參數(shù)傳入selectList()方法中
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
- 運(yùn)行結(jié)果
- 用【mybatis-plus條件構(gòu)造器】的語(yǔ)法格式
@Test
void testGetAll() {
//模擬頁(yè)面?zhèn)鬟f過來(lái)的查詢數(shù)據(jù)
Userquery uq = new Userquery();
uq.setAge(3);
//此處不設(shè)置上限限Age2的值
//uq.setAge2(10);
//創(chuàng)建LambdaQueryWrapper類對(duì)象,并指定泛型
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//編寫限制條件(查詢年齡大于3歲的用戶)
//lt代表 < gt代表 >,第一個(gè)參數(shù)是列名,第二個(gè)參數(shù)是限制條件的數(shù)值
lqw.lt(null != uq.getAge2(), User::getAge, uq.getAge2());
lqw.gt(null != uq.getAge(), User::getAge, uq.getAge());
//將條件Wrapper<T>類型的參數(shù)傳入selectList()方法中
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
- 運(yùn)行結(jié)果
4. 查詢投影
- 如果我們只希望返回某些列的數(shù)據(jù),而不是所有列的數(shù)據(jù),我們可以用SELECT 列1, 列2, 列3 FROM …,讓結(jié)果集僅包含指定列。這種操作稱為【投影查詢】
2.lambda表達(dá)式查詢指定字段
@Test
void testGetAll() {
//查詢投影
//創(chuàng)建LambdaQueryWrapper類對(duì)象,并指定泛型
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//lambda表達(dá)式查詢指定字段
lqw.select(User::getId, User::getAge);
//將條件Wrapper<T>類型的參數(shù)傳入selectList()方法中
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
- 運(yùn)行結(jié)果
- 如果使用的不是lambda表達(dá)式,就需要手動(dòng)指定字段
@Test
void testGetAll() {
//查詢投影
//創(chuàng)建QueryWrapper類對(duì)象,并指定泛型
QueryWrapper<User> lqw = new QueryWrapper<User>();
//非lambda表達(dá)式查詢指定字段
lqw.select("age", "id", "password");
//將條件Wrapper<T>類型的參數(shù)傳入selectList()方法中
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
- 運(yùn)行結(jié)果
- 聚合查詢 selectMaps()(count、max、min、avg、sum)
@Test
void testGetAll() {
//查詢投影
//創(chuàng)建QueryWrapper類對(duì)象,并指定泛型
QueryWrapper<User> lqw = new QueryWrapper<User>();
//聚合查詢(count、max、min、avg、sum),lambda無(wú)法做聚合查詢
//as 起別名
//查詢表中有多少條記錄
lqw.select("count(*) as count");
//將條件Wrapper<T>類型的參數(shù)傳入selectMaps()方法中
List<Map<String, Object>> userList = userDao.selectMaps(lqw);
System.out.println(userList);
}
- 運(yùn)行結(jié)果(結(jié)果集 Map 中 count 是 key, 4 是value)
- 分組查詢( gruopBy() )
@Test
void testGetAll() {
//查詢投影
//創(chuàng)建QueryWrapper類對(duì)象,并指定泛型
QueryWrapper<User> lqw = new QueryWrapper<User>();
//分組查詢(groupby)
//as 起別名
//按電話分組并分別計(jì)數(shù)
lqw.select("count(*) as count, tel");
lqw.groupBy("tel");
//將條件Wrapper<T>類型的參數(shù)傳入selectMaps()方法中
List<Map<String, Object>> userList = userDao.selectMaps(lqw);
System.out.println(userList);
}
- 運(yùn)行結(jié)果
- 模糊查詢(like)
@Test
void testGetAll() {
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//模糊匹配 like, Left 和 Right指的是%在左邊還是右邊
lqw.likeRight(User::getName,"J");
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
- 更多請(qǐng)見【官方條件構(gòu)造器詳解】【查詢投影詳解】
5.映射匹配兼容性(@TableField()和@TableName())
- 問題一 :表字段與編碼屬性設(shè)計(jì)不匹配
- 如圖表字段為 ‘pwd’ ,而實(shí)體類為 ‘password’,查詢會(huì)出現(xiàn)異常,可以在實(shí)體類中通過 @TableField(value = “pwd”) 注解將實(shí)體類屬性與表名進(jìn)行映射匹配
- 問題二 :編碼中添加了數(shù)據(jù)庫(kù)中未定義的屬性
如圖,實(shí)體類中有用于判斷用戶是否在線的online屬性,而數(shù)據(jù)庫(kù)中沒有相應(yīng)的字段,查詢會(huì)出現(xiàn)異常,可以通過 @TableField(exist = false) 設(shè)置該屬性在數(shù)據(jù)庫(kù)中不存在
- 問題三 :采用默認(rèn)查詢開發(fā)了更多字段查看權(quán)限
如圖,用戶密碼默認(rèn)在查詢字段中,而該字段并不隨便對(duì)外開放,可以用**@TableField(select = false)**將該字段的查詢權(quán)限關(guān)閉
- 問題四 :表名與編碼開發(fā)設(shè)計(jì)不同步
可以通過 @TableName(“tbl_user”) 注解將實(shí)體類名與數(shù)據(jù)庫(kù)表名關(guān)聯(lián)起來(lái)
6.id生成策略(@TableId()或全局配置)
-
Mybatis-plus提供了多種主鍵生成策略, 可以在Pojo類中主鍵上加注解進(jìn)行配置,例如數(shù)據(jù)庫(kù)主鍵自增 @TableId(type=IdType.AUTO)
-
不同的表應(yīng)用不同的id生成策略:
日志:自增(1,2,3,4,……) 購(gòu)物訂單:特殊規(guī)則(FQ23948AK3843) 外賣單:關(guān)聯(lián)地區(qū)日期等信息(10 04 20200314 34 91) 關(guān)系表:可省略id ……
-
策略種類
- 全局配置id生成策略
假設(shè)我們希望默認(rèn)全部都使用 AUTO 策略(數(shù)據(jù)庫(kù)ID自增),那么可以在 application.yml 中添加如下配置進(jìn)行修改:
mybatis-plus.global-config.db-config.id-type=auto
7.多數(shù)據(jù)操作(_BatchIds())
- 應(yīng)用場(chǎng)景
購(gòu)物車刪除多條記錄 - 在testSave()方法中添加兩條新紀(jì)錄,效果如圖
- 刪除多條記錄( deleteBatchIds ( Collection<> ) )
- 代碼
@Test
void testDelete(){
//刪除指定多條數(shù)據(jù)
List<Long> list = new ArrayList<>();
list.add(12L);
list.add(13L);
userDao.deleteBatchIds(list);
}
- 運(yùn)行結(jié)果
- 查詢多條記錄
- 代碼
- 運(yùn)行結(jié)果
六、CRUD進(jìn)階開發(fā)II
1.邏輯刪除( @TableLogic() 或者 全局配置)
- 應(yīng)用場(chǎng)景
- 假如編號(hào)為1的員工辭職了,他的姓名,工號(hào)等信息要?jiǎng)h除,但是他工作的合同編號(hào),成交日期,金額等信息需要保留,如果直接執(zhí)行按id刪除操作,會(huì)把所有相關(guān)的數(shù)據(jù)刪除掉,邏輯刪除可以解決這個(gè)問題。
- 邏輯刪除指的是修改數(shù)據(jù)的某個(gè)字段,使其表示為已刪除狀態(tài),而非刪除數(shù)據(jù),保留該數(shù)據(jù)在數(shù)據(jù)庫(kù)中,但是查詢時(shí)不顯示該數(shù)據(jù)(查詢時(shí)過濾掉該數(shù)據(jù))。
- 在navicat中右鍵user表,點(diǎn)擊設(shè)計(jì)表選項(xiàng)添加字段delete, 并設(shè)置默認(rèn)值為0,代表未進(jìn)行邏輯刪除,然后點(diǎn)擊保存
3.在對(duì)應(yīng)的user實(shí)體類中添加邏輯刪除字段 deleted , 并通過 @TableLogic() 注解設(shè)置未進(jìn)行邏輯刪除的值 value 和 邏輯刪除的值 delval
//lombok
@Data
@TableName("user")
public class User {
//設(shè)置主鍵生成策略
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String name;
@TableField(value = "pwd",select = false)
private String password;
private Integer age;
private String tel;
//邏輯刪除字段,標(biāo)記當(dāng)前記錄是否被刪除
@TableLogic(value = "0" ,delval = "1")
private Integer deleted;
}
- 在測(cè)試類中的 testDelete() 方法方法中刪除id為1的記錄
- 代碼
@Test
void testDelete(){
//模擬邏輯刪除
userDao.deleteById(1L);
}
- 運(yùn)行結(jié)果
從控制臺(tái)輸出以及表更新后的情況來(lái)看,可以知道邏輯刪除做的其實(shí)是更新操作,并且此時(shí)查詢?nèi)坎辉O(shè)置條件會(huì)默認(rèn)查詢 邏輯刪除字段 deleted = 0(自定義的值)的記錄
- 在全局配置中配置邏輯刪除相關(guān)信息
- 在注解中的字符串里配置容易出錯(cuò),我們可以在全局配置文件中配置邏輯刪除的相關(guān)參數(shù)
- MyBatisPlus全局配置示例
global-config:
db-config:
#全局配置邏輯刪除字段名
logic-delete-field: deleted
#邏輯已刪除值(默認(rèn)1)
logic-delete-value: 1
#邏輯未刪除值(默認(rèn)0)
logic-not-delete-value: 0
2.樂觀鎖(@version)
- 應(yīng)用場(chǎng)景舉例
添加和刪除的操作簡(jiǎn)單的介紹完了,接下來(lái)介紹一下修改相關(guān)的問題及其解決方在案:樂觀鎖。比如我們?cè)诰W(wǎng)上購(gòu)物進(jìn)行秒殺活動(dòng)的時(shí)候,大家都去搶一個(gè)商品,每搶一次商品數(shù)量減一,最后一個(gè)被搶完的時(shí)候需要一個(gè)限制條件防止異常,這個(gè)處理并發(fā)問題的解決方案叫做樂觀鎖。它通過一個(gè)字段來(lái)標(biāo)識(shí),每搶一次該標(biāo)識(shí)+1,這樣每個(gè)人拿到的標(biāo)識(shí)都不一樣,當(dāng)標(biāo)識(shí)到達(dá)設(shè)定值后程序開始攔截請(qǐng)求。
- 添加樂觀鎖字段version
在user表上右鍵設(shè)計(jì)表格,點(diǎn)擊添加字段,編輯version字段,設(shè)置數(shù)據(jù)類型為int,默認(rèn)值為1
效果如下
- 在實(shí)體類user中添加樂觀鎖字段version,并添加@version注解
- 在Mpconfig類中添加樂觀鎖攔截器
要實(shí)現(xiàn)每次訪問version的效果需要在訪問的sql語(yǔ)句里添加功能可以實(shí)現(xiàn) version = version + 1 的字段,mp里樂觀鎖攔截器可以做這個(gè)事情
- 在測(cè)試類的 testUpdate()方法中編輯修改記錄的代碼看看效果
- 代碼
void testUpdate(){
User user = new User();
user.setId(3L);
user.setName("Jock666");
//要傳version,如果沒有傳version就沒有鎖機(jī)制
user.setVersion(1);
userDao.updateById(user);
}
- 運(yùn)行結(jié)果
右邊的version是傳入的version,左邊的version是更新后的version,可以看到實(shí)現(xiàn)了version = version + 1的效果
6. 開啟鎖機(jī)制的第二種方法,先查詢,再進(jìn)行更新操作
- 代碼
@Test
void testUpdate(){
//1.先通過要修改的數(shù)據(jù)id將當(dāng)前數(shù)據(jù)查詢出來(lái)
User user = userDao.selectById(3L);
//2.將要修改的屬性逐一設(shè)置進(jìn)去
user.setName("Jock777");
userDao.updateById(user);
- 運(yùn)行結(jié)果
- 模擬多用戶秒殺場(chǎng)景
假設(shè)此時(shí)秒殺活動(dòng)已經(jīng)過去了2秒,數(shù)據(jù)庫(kù)里id為3的商品樂觀鎖字段version已經(jīng)累加到了3
假設(shè)用戶1 user, 用戶2 user2 再進(jìn)行秒殺活動(dòng),用戶2先訪問秒殺界點(diǎn)擊下單,然后數(shù)庫(kù)更新代表該商品的 id 為 3 的樂觀鎖字段version, 當(dāng)用戶1再進(jìn)行訪問下單的時(shí)候,version == 3的條件不成立,該更新請(qǐng)求操作失效,即秒殺失敗
- 代碼
@Test
void testUpdate(){
//用戶1查詢時(shí)version=3
User user = userDao.selectById(3L);
//用戶2查詢時(shí)version=3
User user2 = userDao.selectById(3L);
user2.setName("Jock aaa");
//用戶2更新后version==4
userDao.updateById(user2);
user.setName("Jock bbb");
//此時(shí)用戶1更新時(shí)verion=3的條件不成立,該更新語(yǔ)句失效
userDao.updateById(user);
}
- 運(yùn)行結(jié)果
3. mp快速開發(fā)-代碼生成器
1.場(chǎng)景介紹
在我們開發(fā)mp項(xiàng)目的時(shí)候,創(chuàng)建編寫實(shí)體類功能的時(shí)候,模板都差不多,區(qū)別就是模塊名不一樣,這就類似于造句,只要提供模板和參數(shù),mp就能自動(dòng)幫我們生成代碼
- 模板 :MyBatisPlus提供
- 數(shù)據(jù)庫(kù)相關(guān)配置 :讀取數(shù)據(jù)庫(kù)獲取信息
- 開發(fā)者自定義配置 :手工配置
- 創(chuàng)建新的springboot空項(xiàng)目DL_mp_generator(不勾選任何依賴,一會(huì)手動(dòng)加),創(chuàng)建好新項(xiàng)目后導(dǎo)入 代碼生成器 以及 velocity模板引擎 等坐標(biāo)(完整代碼見資源mybatis-plus源碼)
//pom.xml文件
<dependencies>
<!--代碼生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<!--velocity模板引擎-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
</dependencies>
- 核心代碼
創(chuàng)建Generator類,編寫核心代碼
此時(shí)運(yùn)行沒有什么意義,因?yàn)槭裁葱畔⒍紱]有配置
public class Generator {
public static void main(String[] args) {
//創(chuàng)建生成器對(duì)象
AutoGenerator autoGenerator = new AutoGenerator();
//執(zhí)行生成器
autoGenerator.execute();
}
}
4.配置數(shù)據(jù)源
public class Generator {
public static void main(String[] args) {
//創(chuàng)建生成器對(duì)象
AutoGenerator autoGenerator = new AutoGenerator();
//配置數(shù)據(jù)源信息
DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
dataSource.setUsername("root");
dataSource.setPassword("root");
autoGenerator.setDataSource(dataSource);
//執(zhí)行生成器
autoGenerator.execute();
}
}
(默認(rèn)生成文件路徑在D盤根目錄下)
2.配置文件生成路徑
- 代碼
public class Generator {
public static void main(String[] args) {
//創(chuàng)建生成器對(duì)象
AutoGenerator autoGenerator = new AutoGenerator();
//配置數(shù)據(jù)源
DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
dataSource.setUsername("root");
dataSource.setPassword("root");
autoGenerator.setDataSource(dataSource);
//設(shè)置全局配置
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java"); //設(shè)置代碼生成位置
globalConfig.setOpen(true); //設(shè)置生成完畢后是否打開生成代碼所在的目錄
globalConfig.setAuthor("東離與糖寶"); //設(shè)置作者
globalConfig.setFileOverride(true); //設(shè)置是否覆蓋原始生成的文件
globalConfig.setMapperName("%sDao"); //設(shè)置數(shù)據(jù)層接口名,%s為占位符,指代模塊名稱
globalConfig.setIdType(IdType.ASSIGN_ID); //設(shè)置Id生成策略
autoGenerator.setGlobalConfig(globalConfig);
//執(zhí)行生成器
autoGenerator.execute();
}
}
- 運(yùn)行結(jié)果
(默認(rèn)生成的包名叫baomidou)
- 配置包名相關(guān)信息
先把baomidou包刪除,并將臨時(shí)表名改為tbl_user并執(zhí)行如下代碼
- 代碼
public class Generator {
public static void main(String[] args) {
//創(chuàng)建生成器對(duì)象
AutoGenerator autoGenerator = new AutoGenerator();
//配置數(shù)據(jù)源
DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
dataSource.setUsername("root");
dataSource.setPassword("root");
autoGenerator.setDataSource(dataSource);
//設(shè)置全局配置
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java"); //設(shè)置代碼生成位置
globalConfig.setOpen(true); //設(shè)置生成完畢后是否打開生成代碼所在的目錄
globalConfig.setAuthor("東離與糖寶"); //設(shè)置作者
globalConfig.setFileOverride(true); //設(shè)置是否覆蓋原始生成的文件
globalConfig.setMapperName("%sDao"); //設(shè)置數(shù)據(jù)層接口名,%s為占位符,指代模塊名稱
globalConfig.setIdType(IdType.ASSIGN_ID); //設(shè)置Id生成策略
autoGenerator.setGlobalConfig(globalConfig);
//設(shè)置包名相關(guān)配置
PackageConfig packageInfo = new PackageConfig();
packageInfo.setParent("com.aaa"); //設(shè)置生成的包名,與代碼所在位置不沖突,二者疊加組成完整路徑
packageInfo.setEntity("domain"); //設(shè)置實(shí)體類包名
packageInfo.setMapper("dao"); //設(shè)置數(shù)據(jù)層包名
autoGenerator.setPackageInfo(packageInfo);
//執(zhí)行生成器
autoGenerator.execute();
}
}
- 運(yùn)行結(jié)果
解析舉例; 可以看到根據(jù)表名稱生成了tbl前綴,并且實(shí)體類中有g(shù)etter和setter方法
- 策略配置
- 代碼
public class Generator {
public static void main(String[] args) {
//創(chuàng)建生成器對(duì)象
AutoGenerator autoGenerator = new AutoGenerator();
//配置數(shù)據(jù)源
DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
dataSource.setUsername("root");
dataSource.setPassword("root");
autoGenerator.setDataSource(dataSource);
//設(shè)置全局配置
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java"); //設(shè)置代碼生成位置
globalConfig.setOpen(true); //設(shè)置生成完畢后是否打開生成代碼所在的目錄
globalConfig.setAuthor("東離與糖寶"); //設(shè)置作者
globalConfig.setFileOverride(true); //設(shè)置是否覆蓋原始生成的文件
globalConfig.setMapperName("%sDao"); //設(shè)置數(shù)據(jù)層接口名,%s為占位符,指代模塊名稱
globalConfig.setIdType(IdType.ASSIGN_ID); //設(shè)置Id生成策略
autoGenerator.setGlobalConfig(globalConfig);
//設(shè)置包名相關(guān)配置
PackageConfig packageInfo = new PackageConfig();
packageInfo.setParent("com.aaa"); //設(shè)置生成的包名,與代碼所在位置不沖突,二者疊加組成完整路徑
packageInfo.setEntity("domain"); //設(shè)置實(shí)體類包名
packageInfo.setMapper("dao"); //設(shè)置數(shù)據(jù)層包名
autoGenerator.setPackageInfo(packageInfo);
//策略設(shè)置
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setInclude("tbl_user"); //設(shè)置當(dāng)前參與生成的表名,參數(shù)為可變參數(shù)
strategyConfig.setTablePrefix("tbl_"); //設(shè)置數(shù)據(jù)庫(kù)表的前綴名稱,模塊名 = 數(shù)據(jù)庫(kù)表名 - 前綴名 例如: User = tbl_user - tbl_
strategyConfig.setRestControllerStyle(true); //設(shè)置是否啟用Rest風(fēng)格
strategyConfig.setVersionFieldName("version"); //設(shè)置樂觀鎖字段名
strategyConfig.setLogicDeleteFieldName("deleted"); //設(shè)置邏輯刪除字段名
strategyConfig.setEntityLombokModel(true); //設(shè)置是否啟用lombok
autoGenerator.setStrategy(strategyConfig);
//執(zhí)行生成器
autoGenerator.execute();
}
}
- 運(yùn)行結(jié)果
解析舉例: 可以看到數(shù)據(jù)庫(kù)表前綴名稱 tbl_ 在生成實(shí)體類等文件的時(shí)候被成功剪切,并且生成了樂觀鎖和邏輯刪除字段,并且啟用lombok(自帶getter 和 setter方法)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-494792.html
總結(jié)
歡迎各位留言交流以及批評(píng)指正,如果文章對(duì)您有幫助或者覺得作者寫的還不錯(cuò)可以點(diǎn)一下關(guān)注,點(diǎn)贊,收藏支持一下。
(博客的參考源碼可以在我主頁(yè)的資源里找到,如果在學(xué)習(xí)的過程中有什么疑問歡迎大家在評(píng)論區(qū)向我提出)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-494792.html
到了這里,關(guān)于Mybatis-Plus 進(jìn)階開發(fā) -- Mybatis-Plus 入門教程(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!