mybatis-flex實現(xiàn)鏈式操作的示例代碼
鏈式操作?
在 MyBatis-Flex 中,內(nèi)置了 QueryChain.java 、 UpdateChain.java 以及 DbChain.java 用于對數(shù)據(jù)進行鏈式查詢操作和鏈式操作(修改和刪除)。
- QueryChain:鏈式查詢
- UpdateChain:鏈式更新
- DbChain:鏈式調(diào)用 Db + Row
QueryChain 示例?
例如,查詢文章列表代碼如下:
@SpringBootTest
class ArticleServiceTest {
@Autowired
ArticleService articleService;
@Test
void testChain() {
List<Article> articles = articleService.queryChain()
.select(ARTICLE.ALL_COLUMNS)
.from(ARTICLE)
.where(ARTICLE.ID.ge(100))
.list();
}
}若不是在 Service 中,我們也可以通過 QueryChain.of(mapper) 方法,自己創(chuàng)建一個 QueryChain 實例,代碼如下:
List<Article> articles = QueryChain.of(mapper)
.select(ARTICLE.ALL_COLUMNS)
.from(ARTICLE)
.where(ARTICLE.ID.ge(100))
.list();UpdateChain 示例?
假設(shè)我們要更新 Account 的 userName 為 "張三",更新年齡在之前的基礎(chǔ)上加 1,更新代碼如下:
@Test
public void testUpdateChain1() {
UpdateChain.of(Account.class)
.set(Account::getUserName, "張三")
.setRaw(Account::getAge, "age + 1")
.where(Account::getId).eq(1)
.update();
}以上方法調(diào)用時,MyBatis-Flex 內(nèi)部執(zhí)行的 SQL 如下:
UPDATE `tb_account` SET `user_name` = '張三' , `age` = age + 1 WHERE `id` = 1
另一個示例:
@Test
public void testUpdateChain2() {
//更新數(shù)據(jù)
UpdateChain.of(Account.class)
.set(Account::getAge, ACCOUNT.AGE.add(1))
.where(Account::getId).ge(100)
.and(Account::getAge).eq(18)
.update();
//查詢所有數(shù)據(jù)并打印
QueryChain.of(accountMapper)
.where(Account::getId).ge(100)
.and(Account::getAge).eq(18)
.list()
.forEach(System.out::println);
}通過 UpdateChain 進行 update(),其執(zhí)行的 SQL 如下:
UPDATE `tb_account` SET `age` = `age` + 1 WHERE `id` >= 100 AND `age` = 18
QueryChain 的方法?
- one():獲取一條數(shù)據(jù)
- list():獲取多條數(shù)據(jù)
- page():分頁查詢
- obj():當(dāng) SQL 查詢只返回 1 列數(shù)據(jù)的時候,且只有 1 條數(shù)據(jù)時,可以使用此方法
- objList():當(dāng) SQL 查詢只返回 1 列數(shù)據(jù)的時候,可以使用此方法
- count():查詢數(shù)據(jù)條數(shù)
- exists():是否存在,判斷 count 是否大于 0
QueryChain 擴展方法?
one() 系列方法?
- one():獲取一條數(shù)據(jù)
- oneAs(asType):查詢數(shù)據(jù),并直接轉(zhuǎn)換為 vo、dto 等
- oneWithRelations:查詢一條數(shù)據(jù)及其關(guān)聯(lián)數(shù)據(jù)
- oneWithRelationsAs:查詢一條數(shù)據(jù)及其關(guān)聯(lián)數(shù)據(jù),并直接轉(zhuǎn)換為 vo、dto 等
- oneOpt:返回 Optional 類型,獲取一條數(shù)據(jù)
- oneAsOpt(asType):返回 Optional 類型,查詢數(shù)據(jù),并直接轉(zhuǎn)換為 vo、dto 等
- oneWithRelationsOpt:返回 Optional 類型,查詢一條數(shù)據(jù)及其關(guān)聯(lián)數(shù)據(jù)
- oneWithRelationsAsOpt:返回 Optional 類型,查詢一條數(shù)據(jù)及其關(guān)聯(lián)數(shù)據(jù),并直接轉(zhuǎn)換為 vo、dto 等
list() 系列方法?
- list():查詢數(shù)據(jù)列表
- listWithRelations():查詢數(shù)據(jù)列表及其關(guān)聯(lián)數(shù)據(jù)
- listAs():查詢數(shù)據(jù)列表,并直接轉(zhuǎn)換為 vo、dto 等
- listWithRelationsAs():查詢數(shù)據(jù)列表,及其關(guān)聯(lián)數(shù)據(jù),并直接轉(zhuǎn)換為 vo、dto 等
page() 系列方法?
- page(page):分頁查詢數(shù)據(jù)列表
- pageAs(page):分頁查詢數(shù)據(jù)列表,并直接轉(zhuǎn)換為 vo、dto 等
obj() 系列方法?
- obj():查詢第一列,且第一條數(shù)據(jù)
- objAs(asType):查詢第一列,且第一條數(shù)據(jù)并轉(zhuǎn)換為指定類型,比如 Long, String 等
- objOpt():返回 Optional 類型,查詢第一列,且第一條數(shù)據(jù)
- objAsOpt(asType):返回 Optional 類型,查詢第一列,且第一條數(shù)據(jù)并轉(zhuǎn)換為指定類型,比如 Long, String 等
objList() 系列方法?
- objList():查詢第一列
- objListAs(asType):查詢第一列,并轉(zhuǎn)換為指定類型,比如 Long, String 等
代碼實戰(zhàn)示例?
示例 1:查詢 Entity 列表?
List<Article> articles = articleService.queryChain()
.select(ARTICLE.ALL_COLUMNS)
.from(ARTICLE)
.where(ARTICLE.ID.ge(100))
.list();示例 2:查詢 1 條 Entity 數(shù)據(jù)?
Article article = articleService.queryChain()
.select(ARTICLE.ALL_COLUMNS)
.from(ARTICLE)
.where(ARTICLE.ID.ge(100))
.limit(1)
.one();示例 3:查詢 VO 數(shù)據(jù)(ArticleVo)?
ArticleVo.java
public class ArticleVo {
private Long id;
private Long accountId;
private String title;
private String content;
//評論量最多的內(nèi)容
private Long maxComments;
//getter setter
}查詢代碼:
ArticleVo articleVo = articleService.queryChain()
.select(
ARTICLE.ALL_COLUMNS,
max(ARTICLE.comments).as(ArticleVo::maxComments)
).from(ARTICLE)
.where(ARTICLE.ID.ge(100))
.limit(1)
.oneAs(ArticleVo.class);示例 4:多對多關(guān)聯(lián)查詢 VO 數(shù)據(jù)(ArticleVo)?
ArticleVo.java 及其 文章分類 定義:
public class ArticleVo {
private Long id;
private Long accountId;
private String title;
private String content;
//文章和分類的 多對多 關(guān)系配置
@RelationManyToMany(
joinTable = "tb_article_category_mapping", // 中間表
selfField = "id", joinSelfColumn = "article_id",
targetField = "id", joinTargetColumn = "category_id"
)
private List<ArticleCategory> categories;
//getter setter
}查詢代碼:
ArticleVo articleVo = articleService.queryChain()
.select()
.from(ARTICLE)
.where(ARTICLE.ID.ge(100))
.limit(1)
.oneWithRelationsAs(ArticleVo.class);通過 oneWithRelationsAs 方法查詢 ArticleVo 及其關(guān)聯(lián)數(shù)據(jù)(多對多的文章分類)。 更多關(guān)于關(guān)聯(lián)查詢的內(nèi)容請參考章節(jié):《關(guān)聯(lián)查詢》。
DbChain 示例?
使用 DbChain 之后無需將 QueryWrapper 與 Row 的構(gòu)建分離,直接即可進行操作。
// 新增 Row 構(gòu)建
DbChain.table("tb_account")
.setId(RowKey.AUTO)
.set("user_name", "zhang san")
.set("age", 18)
.set("birthday", new Date())
.save();
// 查詢 QueryWrapper 構(gòu)建
DbChain.table("tb_account")
.select("id", "user_name", "age", "birthday")
.where("age > ?", 18)
.list()
.forEach(System.out::println);到此這篇關(guān)于mybatis-flex實現(xiàn)鏈式操作的示例代碼的文章就介紹到這了,更多相關(guān)mybatis-flex鏈式操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis-Flex實現(xiàn)分頁查詢的示例代碼
- Mybatis-flex整合達夢數(shù)據(jù)庫的實現(xiàn)示例
- Spring Boot整合MyBatis-Flex全過程
- SpringBoot使用MyBatis-Flex實現(xiàn)靈活的數(shù)據(jù)庫訪問
- mybatis-flex實現(xiàn)多數(shù)據(jù)源操作
- MyBatis-Flex實現(xiàn)多表聯(lián)查(自動映射)
- Springboot集成Mybatis-Flex的示例詳解
- mybatis-flex與springBoot整合的實現(xiàn)示例
- MyBatis-Flex 邏輯刪除的用法小結(jié)
相關(guān)文章
SpringBoot整合MOTT動態(tài)讀取數(shù)據(jù)庫連接信息并連接MQTT服務(wù)端
MQTT是一種輕量級的消息傳輸協(xié)議(Message Queuing Telemetry Transport),旨在實現(xiàn)設(shè)備之間的低帶寬和高延遲的通信,本文給大家介紹了SpringBoot整合MOTT動態(tài)讀取數(shù)據(jù)庫連接信息并連接MQTT服務(wù)端,需要的朋友可以參考下2024-04-04
Spring Cloud Zuul路由網(wǎng)關(guān)服務(wù)過濾實現(xiàn)代碼
這篇文章主要介紹了Spring Cloud Zuul路由網(wǎng)關(guān)服務(wù)過濾實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04
Intellij Idea中批量導(dǎo)入第三方j(luò)ar包的全過程
引入jar包一般都是針對小的java項目,這篇文章主要給大家介紹了關(guān)于Intellij Idea中批量導(dǎo)入第三方j(luò)ar包的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2021-10-10
SpringBoot中自定義注解實現(xiàn)參數(shù)非空校驗的示例
這篇文章主要介紹了SpringBoot中自定義注解實現(xiàn)參數(shù)非空校驗,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-11-11
Spring Boot集成Sorl搜索客戶端的實現(xiàn)代碼
本篇文章主要介紹了Spring Boot集成Sorl搜索客戶端的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
Springboot 如何實現(xiàn)filter攔截token驗證和跨域
這篇文章主要介紹了Springboot 如何實現(xiàn)filter攔截token驗證和跨域操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Spring Boot與Spring Security的跨域問題解決方案
跨域問題是指在Web開發(fā)中,瀏覽器出于安全考慮,限制了不同域名之間的資源訪問,本文重點給大家介紹Spring Boot與Spring Security的跨域問題解決方案,感興趣的朋友一起看看吧2023-09-09
Spring boot調(diào)用Oracle存儲過程的兩種方式及完整代碼
這篇文章主要給大家介紹了關(guān)于Spring boot調(diào)用Oracle存儲過程的兩種方式及完整代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

