SpringBoot中MyBatis-Flex的集成和使用

一、MyBatis-Flex 是什么?

????????MyBatis-Flex是一個基于MyBatis的數據訪問框架,專門為Flex應用程序而設計的。它提供了一種靈活而高效的方式來處理Flex應用程序中的數據訪問,可以輕松地連接到各種數據源,并提供了一些方便的工具和功能,包括對象關系映射(ORM)、動態查詢、分頁、事務處理等等。它的主要目的是簡化數據訪問的過程,使得開發人員可以更加專注于業務邏輯的開發,而不是一些瑣碎的數據訪問細節。

????????總而言之,MyBatis-Flex 能夠極大地提高我們的開發效率和開發體驗,讓我們有更多的時間專注于自己的事情。

官方文檔:MyBatis Flex官方網站

二、特征?

1、輕量型
  • 輕依賴:除了 MyBatis,沒有任何第三方依賴輕依賴、沒有任何攔截器
  • 輕實現:原理是通過 SqlProvider 的方式實現
  • 輕運行:沒有任何的 Sql 解析,帶來了這么幾個好處:1、極高的性能;2、方便對代碼進行跟蹤和調試; 3、更高的把控性
2、使用靈活
  • 支持 Entity 的增刪改查、以及分頁查詢
  • MyBatis-Flex 提供了 Db + Row^靈活?工具,可以無需實體類對數據庫進行增刪改查以及分頁查詢
  • MyBatis-Flex 內置的 QueryWrapper^靈活?可以輕易的幫助我們實現多表查詢、子查詢和鏈接查詢等常見的 SQL 查詢場景
3、功能強大
  • 支持任意關系型數據庫,還可以通過方言持續擴展
  • 支持多主鍵,邏輯刪除、數據脫敏、數據填充和樂觀鎖配置等

三、MyBatis Flex的使用

1、創建數據庫表

創建sql如下:

CREATE TABLE IF NOT EXISTS `tb_account`
(`id`        INTEGER PRIMARY KEY auto_increment,`user_name` VARCHAR(100),`age`       INTEGER,`birthday`  DATETIME
);INSERT INTO tb_account(id, user_name, age, birthday)
VALUES (1, '張三', 18, '2020-01-11'),(2, '李四', 19, '2021-03-21');
2、創建 Spring Boot 項目,添加 依賴

可以使用?Spring Initializer?快速初始化一個 Spring Boot 工程。

需要添加的 Maven 主要依賴示例:

pom.xml配置如下:

<dependencies><dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-spring-boot-starter</artifactId><version>1.7.5</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></dependency><!-- for test only --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
3、對 Spring Boot 項目進行配置

在 application.yml 中配置數據源:

# DataSource Config
spring:datasource:url: jdbc:mysql://localhost:3306/flex_testusername: rootpassword: 12345678

在 Spring Boot 啟動類中添加?@MapperScan?注解,掃描 Mapper 文件夾:

@SpringBootApplication
@MapperScan("com.mybatisflex.test.mapper")
public class MybatisFlexTestApplication {public static void main(String[] args) {SpringApplication.run(MybatisFlexTestApplication.class, args);}}
4、編寫實體類和 Mapper 接口

這里使用了?Lombok?注解來簡化代碼,類代碼如下:

@Data
@Table("tb_account")
public class Account {@Id(keyType = KeyType.Auto)private Long id;private String userName;private Integer age;private Date birthday;}
  • 使用?@Table("tb_account")?設置實體類與表名的映射關系
  • 使用?@Id(keyType = KeyType.Auto)?標識主鍵為自增

Mapper 接口繼承 BaseMapper 接口:

public interface AccountMapper extends BaseMapper<Account> {}

這部分也可以使用 MyBatis-Flex 的代碼生成器來生,功能非常強大的。詳情進入:代碼生成器章節?了解。

5、開始使用

添加測試類,進行功能測試:

import static com.mybatisflex.test.entity.table.AccountTableDef.ACCOUNT;@SpringBootTest
class MybatisFlexTestApplicationTests {@Autowiredprivate AccountMapper accountMapper;@Testvoid contextLoads() {QueryWrapper queryWrapper = QueryWrapper.create().select().where(ACCOUNT.AGE.eq(18));Account account = accountMapper.selectOneByQuery(queryWrapper);System.out.println(account);}}

控制臺輸出:

Account(id=1, userName=張三, age=18, birthday=Sat Jan 11 00:00:00 CST 2020)

以上的?示例?中,?ACCOUNT?為 MyBatis-Flex 通過 APT 自動生成,只需通過靜態導入即可,無需手動編碼。

點擊查看更多APT文檔?APT 文檔。

若覺得 APT 使用不習慣,也可以使用代碼生成器來生成。點擊?代碼生成器文檔?了解。

四、同類框架「功能」對比

MyBatis-Flex 主要是和?MyBatis-Plus?與?Fluent-MyBatis?對比,內容來源其官網、git 或者 網絡文章,若有錯誤歡迎糾正。

  • MyBatis-Plus:老牌的 MyBatis 增強框架,開源于 2016 年。
  • Fluent-MyBatis:阿里云開發的 MyBatis 增強框架(來自于阿里云·云效產品團隊)

功能對比:

功能或特點MyBatis-FlexMyBatis-PlusFluent-MyBatis
對 entity 的基本增刪改查???
分頁查詢???
分頁查詢之總量緩存???
分頁查詢無 SQL 解析設計(更輕量,及更高性能)???
多表查詢: from 多張表???
多表查詢: left join、inner join 等等???
多表查詢: union,union all???
單主鍵配置???
多種 id 生成策略???
支持多主鍵、復合主鍵???
字段的 typeHandler 配置???
除了 MyBatis,無其他第三方依賴(更輕量)???
QueryWrapper 是否支持在微服務項目下進行 RPC 傳輸??未知
邏輯刪除???
樂觀鎖???
SQL 審計???
數據填充???
數據脫敏????(收費)?
字段權限????(收費)?
字段加密????(收費)?
字典回寫????(收費)?
Db + Row???
Entity 監聽???
多數據源支持?借助其他框架或收費?
多數據源是否支持 Spring 的事務管理,比如?@Transactional?和?TransactionTemplate?等???
多數據源是否支持 "非Spring" 項目???
多租戶???
動態表名???
動態 Schema???

以上內容來自第三方相關產品的官方文檔或第三方平臺,若有錯誤,歡迎糾正。

五、同類框架「性能」對比

????????本文主要是展示了 MyBatis-Flex 和 Mybaits-Plus 的「性能」對比。Mybaits-Plus 是一個非常優秀 Mybaits 增強框架, 其開源于 2016 年,有很多的成功案例。

測試方法:

????????使用 h2 數據庫,在初始化的時候分別為 mybatis-flex 和 mybatis-plus 創建兩個不同的數據庫, 但是完全一樣的數據結構、數據內容和數據量(每個庫 2w 條數據)。

????????開始之前先進行預熱,之后通過打印時間戳的方式進行對比,誰消耗的時間越少,則性能越高(每次測試 10 輪)。

1、測試單條數據查詢?

MyBatis-Flex 的代碼如下:

QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.where(FLEX_ACCOUNT.ID.ge(100)
.or(FLEX_ACCOUNT.USER_NAME.eq("admin" + ThreadLocalRandom.current().nextInt(10000))));
mapper.selectOneByQuery(queryWrapper);

MyBatis-Plus 的代碼如下:

QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.ge("id", 100);
queryWrapper.or();
queryWrapper.eq("user_name", "admin" + ThreadLocalRandom.current().nextInt(10000));
queryWrapper.last("limit 1");
mapper.selectOne(queryWrapper);

10 輪的測試結果:

---------------
>>>>>>>testFlexSelectOne:134
>>>>>>>testPlusSelectOneWithLambda:989
>>>>>>>testPlusSelectOne:830
---------------
>>>>>>>testFlexSelectOne:75
>>>>>>>testPlusSelectOneWithLambda:732
>>>>>>>testPlusSelectOne:795
---------------
>>>>>>>testFlexSelectOne:65
>>>>>>>testPlusSelectOneWithLambda:938
>>>>>>>testPlusSelectOne:714
---------------
>>>>>>>testFlexSelectOne:105
>>>>>>>testPlusSelectOneWithLambda:740
>>>>>>>testPlusSelectOne:669
---------------
>>>>>>>testFlexSelectOne:57
>>>>>>>testPlusSelectOneWithLambda:691
>>>>>>>testPlusSelectOne:773
---------------
>>>>>>>testFlexSelectOne:65
>>>>>>>testPlusSelectOneWithLambda:693
>>>>>>>testPlusSelectOne:695
---------------
>>>>>>>testFlexSelectOne:56
>>>>>>>testPlusSelectOneWithLambda:754
>>>>>>>testPlusSelectOne:665
---------------
>>>>>>>testFlexSelectOne:56
>>>>>>>testPlusSelectOneWithLambda:714
>>>>>>>testPlusSelectOne:717
---------------
>>>>>>>testFlexSelectOne:57
>>>>>>>testPlusSelectOneWithLambda:696
>>>>>>>testPlusSelectOne:671
---------------
>>>>>>>testFlexSelectOne:59
>>>>>>>testPlusSelectOneWithLambda:739
>>>>>>>testPlusSelectOne:659

測試結論

MyBatis-Flex 的查詢單條數據的速度,大概是 MyBatis-Plus 的 5 ~ 10+ 倍。

2、測試列表(List)數據查詢?

要求返回的數據為 10 條數據。

MyBatis-Flex 的代碼如下:

QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.where(FLEX_ACCOUNT.ID.ge(100).or(FLEX_ACCOUNT.USER_NAME
.eq("admin" + ThreadLocalRandom.current().nextInt(10000))))
.limit(10);
mapper.selectListByQuery(queryWrapper);

MyBatis-Plus 的代碼如下:

QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.ge("id", 100);
queryWrapper.or();
queryWrapper.eq("user_name", "admin" + ThreadLocalRandom.current().nextInt(10000));
queryWrapper.last("limit 10");
mapper.selectList(queryWrapper);

10 輪的測試結果:

---------------
>>>>>>>testFlexSelectTop10:90
>>>>>>>testPlusSelectTop10WithLambda:743
>>>>>>>testPlusSelectTop10:678
---------------
>>>>>>>testFlexSelectTop10:85
>>>>>>>testPlusSelectTop10WithLambda:692
>>>>>>>testPlusSelectTop10:684
---------------
>>>>>>>testFlexSelectTop10:84
>>>>>>>testPlusSelectTop10WithLambda:692
>>>>>>>testPlusSelectTop10:670
---------------
>>>>>>>testFlexSelectTop10:85
>>>>>>>testPlusSelectTop10WithLambda:737
>>>>>>>testPlusSelectTop10:667
---------------
>>>>>>>testFlexSelectTop10:85
>>>>>>>testPlusSelectTop10WithLambda:691
>>>>>>>testPlusSelectTop10:684
---------------
>>>>>>>testFlexSelectTop10:97
>>>>>>>testPlusSelectTop10WithLambda:760
>>>>>>>testPlusSelectTop10:666
---------------
>>>>>>>testFlexSelectTop10:80
>>>>>>>testPlusSelectTop10WithLambda:673
>>>>>>>testPlusSelectTop10:637
---------------
>>>>>>>testFlexSelectTop10:81
>>>>>>>testPlusSelectTop10WithLambda:653
>>>>>>>testPlusSelectTop10:639
---------------
>>>>>>>testFlexSelectTop10:82
>>>>>>>testPlusSelectTop10WithLambda:659
>>>>>>>testPlusSelectTop10:636
---------------
>>>>>>>testFlexSelectTop10:81
>>>>>>>testPlusSelectTop10WithLambda:654
>>>>>>>testPlusSelectTop10:656

測試結論

MyBatis-Flex 的查詢 10 條數據的速度,大概是 MyBatis-Plus 的 5~10 倍左右。

3、分頁查詢?

MyBatis-Flex 的代碼如下:

QueryWrapper queryWrapper = new QueryWrapper().where(FLEX_ACCOUNT.ID.ge(100));
mapper.paginate(page, pageSize, 20000, queryWrapper);

MyBatis-Plus 的代碼如下:

LambdaQueryWrapper<PlusAccount> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.ge(PlusAccount::getId, 100);queryWrapper.eq(PlusAccount::getEmail, "michael@gmail.com");
Page<PlusAccount> p = Page.of(page, pageSize, 20000, false);
mapper.selectPage(p, queryWrapper);

10 輪的測試結果:

---------------
>>>>>>>testFlexPaginate:90
>>>>>>>testPlusPaginate:671
---------------
>>>>>>>testFlexPaginate:78
>>>>>>>testPlusPaginate:643
---------------
>>>>>>>testFlexPaginate:80
>>>>>>>testPlusPaginate:638
---------------
>>>>>>>testFlexPaginate:79
>>>>>>>testPlusPaginate:613
---------------
>>>>>>>testFlexPaginate:75
>>>>>>>testPlusPaginate:627
---------------
>>>>>>>testFlexPaginate:72
>>>>>>>testPlusPaginate:606
---------------
>>>>>>>testFlexPaginate:69
>>>>>>>testPlusPaginate:585
---------------
>>>>>>>testFlexPaginate:70
>>>>>>>testPlusPaginate:589
---------------
>>>>>>>testFlexPaginate:69
>>>>>>>testPlusPaginate:586
---------------
>>>>>>>testFlexPaginate:68
>>>>>>>testPlusPaginate:585

測試結論

Mybatis-Flex 的分頁查詢速度,大概是 Mybatis-Plus 的 5~10 倍左右。

4、數據更新?

Mybatis-Flex 的代碼如下:

FlexAccount flexAccount = new FlexAccount();
flexAccount.setUserName("testInsert" + i);
flexAccount.setNickname("testInsert" + i);
flexAccount.addOption("key1", "value1");
flexAccount.addOption("key2", "value2");
flexAccount.addOption("key3", "value3");
flexAccount.addOption("key4", "value4");
flexAccount.addOption("key5", "value5");QueryWrapper queryWrapper = QueryWrapper.create().where(FLEX_ACCOUNT.ID.ge(9200)).and(FLEX_ACCOUNT.ID.le(9300)).and(FLEX_ACCOUNT.USER_NAME.like("admin")).and(FLEX_ACCOUNT.NICKNAME.like("admin"));mapper.updateByQuery(flexAccount, queryWrapper);

Mybatis-Plus 的代碼如下:

PlusAccount plusAccount = new PlusAccount();
plusAccount.setUserName("testInsert" + i);
plusAccount.setNickname("testInsert" + i);
plusAccount.addOption("key1", "value1");
plusAccount.addOption("key2", "value2");
plusAccount.addOption("key3", "value3");
plusAccount.addOption("key4", "value4");
plusAccount.addOption("key5", "value5");LambdaUpdateWrapper<PlusAccount> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.ge(PlusAccount::getId, 9000);
updateWrapper.le(PlusAccount::getId, 9100);
updateWrapper.like(PlusAccount::getUserName, "admin");
updateWrapper.like(PlusAccount::getNickname, "admin");mapper.update(plusAccount, lambdaUpdateWrapper);

10 輪的測試結果:

---------------
>>>>>>>testFlexUpdate:58
>>>>>>>testPlusUpdate:524
---------------
>>>>>>>testFlexUpdate:51
>>>>>>>testPlusUpdate:503
---------------
>>>>>>>testFlexUpdate:49
>>>>>>>testPlusUpdate:490
---------------
>>>>>>>testFlexUpdate:45
>>>>>>>testPlusUpdate:472
---------------
>>>>>>>testFlexUpdate:48
>>>>>>>testPlusUpdate:470
---------------
>>>>>>>testFlexUpdate:44
>>>>>>>testPlusUpdate:460
---------------
>>>>>>>testFlexUpdate:43
>>>>>>>testPlusUpdate:459
---------------
>>>>>>>testFlexUpdate:44
>>>>>>>testPlusUpdate:461
---------------
>>>>>>>testFlexUpdate:40
>>>>>>>testPlusUpdate:444
---------------
>>>>>>>testFlexUpdate:41
>>>>>>>testPlusUpdate:444

測試結論

Mybatis-Flex 的數據更新速度,大概是 Mybatis-Plus 的 5~10+ 倍。

總之性能測試結果:

不論是MyBatis-Flex 單條查詢分頁查詢還是數據更新,速度均是 MyBatis-Plus 的 5~10 倍左右!!!

六、MyBatis-Flex 支持的數據庫

MyBatis-Flex 支持的數據庫類型,如下表格所示,我們還可以通過自定義方言的方式,持續添加更多的數據庫支持。

數據庫描述
mysqlMySQL 數據庫
mariadbMariaDB 數據庫
oracleOracle11g 及以下數據庫
oracle12cOracle12c 及以上數據庫
db2DB2 數據庫
H2H2 數據庫
hsqlHSQL 數據庫
sqliteSQLite 數據庫
postgresqlPostgreSQL 數據庫
sqlserver2005SQLServer2005 數據庫
sqlserverSQLServer 數據庫
dm達夢數據庫
xugu虛谷數據庫
kingbasees人大金倉數據庫
phoenixPhoenix HBase 數據庫
gaussGauss 數據庫
clickhouseClickHouse 數據庫
gbase南大通用(華庫)數據庫
gbase-8s南大通用數據庫 GBase 8s
oscar神通數據庫
sybaseSybase ASE 數據庫
OceanBaseOceanBase 數據庫
FirebirdFirebird 數據庫
derbyDerby 數據庫
highgo瀚高數據庫
cubridCUBRID 數據庫
goldilocksGOLDILOCKS 數據庫
csiidbCSIIDB 數據庫
hanaSAP_HANA 數據庫
impalaImpala 數據庫
verticaVertica 數據庫
xcloud行云數據庫
redshift亞馬遜 redshift 數據庫
openGauss華為 openGauss 數據庫
TDengineTDengine 數據庫
informixInformix 數據庫
greenplumGreenplum 數據庫
uxdb優炫數據庫
DorisDoris數據庫
Hive SQLHive 數據庫
lealoneLealone 數據庫
sinodb星瑞格數據庫

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211871.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211871.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211871.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

虛擬機和主機間復制粘貼

文章目錄 前言一、版本介紹二、安裝工具1.確認配置2.安裝工具3.重啟 總結 前言 在Windows中使用虛擬機&#xff0c;可以很方便地linux&#xff0c;就像是在本地操作服務器一樣。 一、版本介紹 虛擬機&#xff1a;VMware 15 操作系統&#xff1a;CentOS 7 二、安裝工具 1.確…

delphi android打開外部文件,報錯android.os.FileUriExposedException解決方法

Android 7.0強制啟用了被稱作 StrictMode的策略&#xff0c;帶來的影響就是你的App對外無法暴露file://類型的URI了。 如果你使用Intent攜帶這樣的URI去打開外部App(比如&#xff1a;打開系統相機拍照)&#xff0c;那么會拋出FileUriExposedException異常。 Delphi 為Android…

C++(14):通過tuple在構造對象時注入類型不確定的對象/插件

有的時候我們需要在構建對象時注入一系列類型不確定的對象或插件,怎么才能實現呢? #include <iostream> #include <string> #include <tuple>using namespace std;class A{ public:A(int a) : m_a(a){cout<<"construct A:"<<m_a<…

windows系統安裝RocketMQ_dashboard

1.下載源碼 按照官網說明下載源碼 官網 官網文檔 2.源碼安裝 2.1.① 編譯rocketmq-dashboard 注釋掉報錯的maven插件frontend-maven-plugin、maven-antrun-plugin mvn clean package -Dmaven.test.skiptrue2.2.② 運行rocketmq-dashboard java -jar target/rocketmq-…

Qt基礎-connect函數詳解

本文詳解Qt的connect函數用法。 目錄 定義 形式 函數原型 實例說明 定義 Qt中的信號槽為核心內容,一定要熟練掌握。鏈接信號使用connect函數。 QObject::connect函數,顧名思義,鏈接函數,作用是鏈接信號(signal)和槽(

tamcat亂碼

學習springmvc時tamcat亂碼 ①、啟動時tomcat控制臺亂碼 解決方法是&#xff1a;1、先把idea設置里的默認字節碼改成utf-8 ? 2、把idea顯示編碼改成utf-8&#xff0c;在末尾加上&#xff08; -Dfile.encodingUTF-8&#xff09; ? 3、最后重啟idea 加上這個 -Dfile.encodingU…

CSS基礎概念之選擇器類型

CSS選擇器類型 選擇器表示元素在樹結構中的特定模式。選擇器(selector)術語指的是&#xff0c;簡單選擇器(simple selector)&#xff0c;復合選擇器(compound selector)&#xff0c;復雜選擇器(complex selector)&#xff0c;或者選擇器列表(selector list)。選擇器的主題是任…

【軟考中級——軟件設計師】備戰經驗 筆記總結分享

考試成績 我第一次備考是在2022 然后那時候取消了這次是第二次 靠前我一個月復習的看了以前的筆記 然后刷了七八道歷年題目學習資料推薦 &#xff1a;zst——2021 b站鏈接自薦一下我的筆記 &#xff1a; 軟考筆記專欄 視頻確實很長 &#xff0c; 我的建議就是先看筆記 然后不會…

OD機考真題搜集:歡樂的周末

題目 小華和小為是很要好的朋友,他們約定周末一起吃飯。通過手機交流,他們在地圖上選擇了多個聚餐地點(由于自然地形原因,部分聚餐地點不可達),求小為和小華都可以到達的聚餐地點有多少個? 輸入 第一行輸入m,n,分別代表地圖的長度和寬度 第二行開始輸入具體地圖信息…

1-2、Java環境搭建

語雀原文鏈接 文章目錄 1、JDK安裝2、Hello World2-1、Hello World示例2-2、類名和文件名2-3、注釋2-4、javadoc 3、環境變量3-1、Path作用3-2、classpath3-3、JAVA_HOME 4、Java組成5、跨平臺原理5-1、Java跨平臺原理5-2、C語言的跨平臺原理 1、JDK安裝 下載地址&#xff1a…

打造Github首頁的動態飛線效果

一、導語 Github首頁的地球動態飛線&#xff0c;大家都比較熟悉吧 二、分析 由大量隨機的3點構造出貝塞爾曲線&#xff0c;然后開始從起點到終點的飛行后&#xff0c;然后再從起點到終點的消失&#xff0c;就此完成整個過程 三、基礎代碼 createCurve(startPoint, endPoint…

unity 2d 入門 飛翔小鳥 死亡閃爍特效(十三)

一、c#腳本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Bling : MonoBehaviour {public Texture img;public float speed;public static bool changeWhite false;private float alpha0f;// Start is called before the fi…

信創運維產業的發展與趨勢:IT管理的新視角

隨著數字化時代的來臨&#xff0c;信息技術應用的各個方面都在發生變革。在這個過程中&#xff0c;信創運維產業的發展尤為引人注目。它不僅是數字化轉型的關鍵驅動力&#xff0c;也是國家經濟發展的重要支柱。本文將探討信創運維產業的發展與趨勢&#xff0c;以及國家如何管理…

芯片量產導入知識

什么是芯片量產 從芯片功能設計到生產制造、測試等環節&#xff0c;每一個環節都至關重要。 對于保障大規模發貨后芯片指標表現的一致性&#xff0c;以及產品應用生命周期內的穩定性和可靠性&#xff0c;需要考慮多種因素。以下是一些相關的觀點&#xff1a; 可量產性設計&am…

Stable Diffusion 系列教程 - 2 WebUI 參數詳解

Stable Diffusion 的整個算法組合為&#xff1a; UNet VAE 文本編碼器 UNet&#xff1a;就是我們大模型里的核心。 文本編碼器&#xff1a;將我們的prompt進行encoder為算法能理解的內容&#xff08;可以理解為SD外包出去的項目CLIP&#xff09;。 VAE&#xff1a;對UNet生…

【牛牛送書 | 第三期】《一本書講透Java線程:原理與實踐》帶你深入JAVA多線程

目錄 摘要&#xff1a; 多線程對于Java的意義 為什么Java工程師必須掌握多線程 Java多線程使用方式 如何學好Java多線程 參與方式&#x1f947; 摘要&#xff1a; 互聯網的每一個角落&#xff0c;無論是大型電商平臺的秒殺活動&#xff0c;社交平臺的實時消息推送&#x…

1.2.啟動線程的五類種方法

一.new MyThread().start() 繼承Thread類創建線程類 定義一個繼承Thread類的子類&#xff0c;并重寫該類的run()方法 創建Thread子類的實例&#xff0c;即創建了線程對象 調用該線程對象的start()方法啟動線程 二.new Thread(r).start() 實現Runnable接口創建線程類 定義R…

Qt槽函數不響應不執行的一種原因:ui提升導致重名

背景&#xff1a; 一個包含了組件提升的ui&#xff0c;有個按鈕的槽函數就是不響應&#xff0c;于是找原因。 分析&#xff1a; 槽函數的對應一是通過connect函數綁定信號&#xff0c;二是on_XXX_signal的命名方式。界面上部件的槽函數通常是第二種。 我反復確認細節&#…

寫一個程序拷貝文件

使用所學文件操作&#xff0c;在當前目錄下放一個文件data.txt&#xff0c;寫一個程序&#xff0c;將data.txt文件拷貝一份&#xff0c;生成data_copy.txt文件。 基本思路&#xff1a; 打開文件data.txt&#xff0c;讀取數據打開文件data_copy.txt&#xff0c;寫數據從data.t…

如何使用拼多多根據ID取商品詳情 API 獲取熱銷商品信息?

使用拼多多根據ID取商品詳情 API 獲取熱銷商品信息是一種高效且便捷的方式&#xff0c;可以快速獲取到拼多多平臺上熱銷商品的信息。以下是獲取熱銷商品信息的步驟和示例代碼&#xff1a; 一、步驟 注冊成為拼多多開發者&#xff0c;并獲取API密鑰。確定要獲取熱銷商品信息的…