Mybatis之簡介、使用操作(安裝、XML、SqlSession、映射的SQL語句、命名空間、作用域和生命周期)

學習的最大理由是想擺脫平庸,早一天就多一份人生的精彩;遲一天就多一天平庸的困擾。各位小伙伴,如果您:
想系統/深入學習某技術知識點…
一個人摸索學習很難堅持,想組團高效學習…
想寫博客但無從下手,急需寫作干貨注入能量…
熱愛寫作,愿意讓自己成為更好的人…

文章目錄

  • 一、Mybatis簡介
    • 1、什么是MyBatis?
    • 2、持久化
    • 3、持久層
    • 4、為什么需要Mybatis
    • 5、MyBatis的優點
  • 二、Mybatis使用操作
    • 1、安裝
    • 2、從 XML 中構建 SqlSessionFactory
    • 3、不使用 XML 構建 SqlSessionFactory
    • 4、從 SqlSessionFactory 中獲取 SqlSession
    • 5、探究已映射的 SQL 語句
    • 6、提示 對命名空間的一點補充
    • 7、作用域(Scope)和生命周期
      • 1、提示 對象生命周期和依賴注入框架
      • 2、SqlSessionFactoryBuilder
      • 3、SqlSessionFactory(可以想象成:數據庫連接池)
      • 4、SqlSession(連接到連接池的一個請求)
      • 5、映射器實例
  • 總結


一、Mybatis簡介

?

1、什么是MyBatis?

  • MyBatis 是一款優秀的持久層框架
  • MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集的過程
  • MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 實體類 【Plain Old Java Objects,普通的 Java對象】映射成數據庫中的記錄。
  • Mybatis官方文檔 : mybatis – MyBatis 3 | 簡介
  • GitHub : https://github.com/mybatis/mybatis-3

上述可能有的同學不知道什么是持久化什么是持久層,下面將給你闡述具體是什么。

2、持久化

  • 持久化是將程序數據在持久狀態和瞬時狀態間轉換的機制。
    • 即把數據(如內存中的對象)保存到可永久保存的存儲設備中(如磁盤)。持久化的主要應用是將內存中的對象存儲在數據庫中,或者存儲在磁盤文件中、XML數據文件中等等。
    • JDBC就是一種持久化機制。文件IO也是一種持久化機制。
    • 在生活中 : 將鮮肉冷藏,吃的時候再解凍的方法也是。將水果做成罐頭的方法也是。
  • 為什么需要持久化服務呢?那是由于內存本身的缺陷引起的
    • 內存斷電后數據會丟失,但有一些對象是無論如何都不能丟失的,比如銀行賬號等,遺憾的是,人們還無法保證內存永不掉電。
    • 內存過于昂貴,與硬盤、光盤等外存相比,內存的價格要高2~3個數量級,而且維持成本也高,至少需要一直供電吧。所以即使對象不需要永久保存,也會因為內存的容量限制不能一直呆在內存中,需要持久化來緩存到外存。

3、持久層

  • 什么是持久層?
    • 完成持久化工作的代碼塊 . ——> dao層 【DAO (Data Access Object) 數據訪問對象】
    • 大多數情況下特別是企業級應用,數據持久化往往也就意味著將內存中的數據保存到磁盤上加以固化,而持久化的實現過程則大多通過各種關系數據庫來完成。
    • 不過這里有一個字需要特別強調,也就是所謂的“層”。對于應用系統而言,數據持久功能大多是必不可少的組成部分。也就是說,我們的系統中,已經天然的具備了“持久層”概念?也許是,但也許實際情況并非如此。之所以要獨立出一個“持久層”的概念,而不是“持久模塊”,“持久單元”,也就意味著,我們的系統架構中,應該有一個相對獨立的邏輯層面,專著于數據持久化邏輯的實現.
    • 與系統其他部分相對而言,這個層面應該具有一個較為清晰和嚴格的邏輯邊界。 【說白了就是用來操作數據庫存在的!】

我們在學習的過程中不能學的稀里糊涂,在入門階段我們就應該知道,我們為什么要學MyBatis

4、為什么需要Mybatis

  • Mybatis就是幫助程序猿將數據存入數據庫中 , 和從數據庫中取數據 .
  • 傳統的jdbc操作 , 有很多重復代碼塊 .比如 : 數據取出時的封裝 , 數據庫的建立連接等等… , 通過框架可以減少重復代碼,提高開發效率 .
  • MyBatis 是一個半自動化的ORM框架 (Object Relationship Mapping) —>對象關系映射
  • 所有的事情,不用Mybatis依舊可以做到,只是用了它,所有實現會更加簡單!技術沒有高低之分,只有使用這個技術的人有高低之別

5、MyBatis的優點

  • 簡單易學:本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar文件+配置幾個sql映射文件就可以了,易于學習,易于使用,通過文檔和源代碼,可以比較完全的掌握它的設計思路和實現。

  • 靈活:mybatis不會對應用程序或者數據庫的現有設計強加任何影響。 sql寫在xml里,便于統一管理和優化。通過sql語句可以滿足操作數據庫的所有需求。

  • 解除sql與程序代碼的耦合:通過提供DAO層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提高了可維護性。

  • 提供xml標簽,支持編寫動態sql。

  • …….

  • 最重要的一點,使用的人多!公司需要!

二、Mybatis使用操作

1、安裝

?
要使用 MyBatis, 只需將 mybatis-x.x.x.jar 文件置于類路徑(classpath)中即可。

如果使用 Maven 來構建項目,則需將下面的依賴代碼置于 pom.xml 文件中:

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>x.x.x</version>
</dependency>

2、從 XML 中構建 SqlSessionFactory

這一步是每個程序員必須走過的一步:

每個基于 MyBatis 的應用都是以一個 SqlSessionFactory 的實例為核心的。SqlSessionFactory 的實例可以通過 SqlSessionFactoryBuilder 獲得。而 SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個預先配置的 Configuration 實例來構建出 SqlSessionFactory 實例。

從 XML 文件中構建 SqlSessionFactory 的實例非常簡單,建議使用類路徑下的資源文件進行配置。 但也可以使用任意的輸入流(InputStream)實例,比如用文件路徑字符串或 file:// URL 構造的輸入流。MyBatis 包含一個名叫 Resources 的工具類,它包含一些實用方法,使得從類路徑或其它位置加載資源文件更加容易。

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

需要注意的一點是:上述代碼要想在程序加載中就運行,那么就應該放在靜態方法(static)中,如果你的sqlSessionFactory在類外就已經聲明成私有了,類內的第三句就不用帶SqlSessionFactory了,這樣會導致找不到sqlSessionFactory。

private static SqlSessionFactory sqlSessionFactory;static{try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {throw new RuntimeException(e);}}public static SqlSession getSqlSession(){return sqlSessionFactory.openSession();}

XML 配置文件中包含了對 MyBatis 系統的核心設置,包括獲取數據庫連接實例的數據源(DataSource)以及決定事務作用域和控制方式的事務管理器(TransactionManager)。后面會再探討 XML 配置文件的詳細內容,這里先給出一個簡單的示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>

當然,還有很多可以在 XML 文件中配置的選項,上面的示例僅羅列了最關鍵的部分。 注意 XML 頭部的聲明,它用來驗證 XML 文檔的正確性。environment 元素體中包含了事務管理和連接池的配置。mappers 元素則包含了一組映射器(mapper),這些映射器的 XML 映射文件包含了 SQL 代碼和映射定義信息。

3、不使用 XML 構建 SqlSessionFactory

如果你更愿意直接從 Java 代碼而不是 XML 文件中創建配置,或者想要創建你自己的配置建造器,MyBatis 也提供了完整的配置類,提供了所有與 XML 文件等價的配置項。

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

注意該例中,configuration 添加了一個映射器類(mapper class)。映射器類是 Java 類,它們包含 SQL 映射注解從而避免依賴 XML 文件。不過,由于 Java 注解的一些限制以及某些 MyBatis 映射的復雜性,要使用大多數高級映射(比如:嵌套聯合映射),仍然需要使用 XML 配置。有鑒于此,如果存在一個同名 XML 配置文件,MyBatis 會自動查找并加載它(在這個例子中,基于類路徑和 BlogMapper.class 的類名,會加載 BlogMapper.xml)。具體細節稍后討論。

4、從 SqlSessionFactory 中獲取 SqlSession

既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的實例。SqlSession 提供了在數據庫執行 SQL 命令所需的所有方法。你可以通過 SqlSession 實例來直接執行已映射的 SQL 語句。例如:

try (SqlSession session = sqlSessionFactory.openSession()) {Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
}

誠然,這種方式能夠正常工作,對使用舊版本 MyBatis 的用戶來說也比較熟悉。但現在有了一種更簡潔的方式——使用和指定語句的參數和返回值相匹配的接口(比如 BlogMapper.class),現在你的代碼不僅更清晰,更加類型安全,還不用擔心可能出錯的字符串字面值以及強制類型轉換。

例如:

try (SqlSession session = sqlSessionFactory.openSession()) {BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog = mapper.selectBlog(101);
}

現在我們來探究一下這段代碼究竟做了些什么。

5、探究已映射的 SQL 語句

現在你可能很想知道 SqlSession 和 Mapper 到底具體執行了些什么操作,但 SQL 語句映射是個相當廣泛的話題,可能會占去文檔的大部分篇幅。 但為了讓你能夠了解個大概,這里會給出幾個例子。

在上面提到的例子中,一個語句既可以通過 XML 定義,也可以通過注解定義。我們先看看 XML 定義語句的方式,事實上 MyBatis 提供的所有特性都可以利用基于 XML 的映射語言來實現,這使得 MyBatis 在過去的數年間得以流行。如果你用過舊版本的 MyBatis,你應該對這個概念比較熟悉。 但相比于之前的版本,新版本改進了許多 XML 的配置,后面我們會提到這些改進。這里給出一個基于 XML 映射語句的示例,它應該可以滿足上個示例中 SqlSession 的調用。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper"><select id="selectBlog" resultType="Blog">select * from Blog where id = #{id}</select>
</mapper>

為了這個簡單的例子,我們似乎寫了不少配置,但其實并不多。在一個 XML 映射文件中,可以定義無數個映射語句,這樣一來,XML 頭部和文檔類型聲明部分就顯得微不足道了。文檔的其它部分很直白,容易理解。 它在命名空間 “org.mybatis.example.BlogMapper” 中定義了一個名為 “selectBlog” 的映射語句,這樣你就可以用全限定名
“org.mybatis.example.BlogMapper.selectBlog” 來調用映射語句了,就像上面例子中那樣:

Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);

你可能會注意到,這種方式和用全限定名調用 Java 對象的方法類似。這樣,該命名就可以直接映射到在命名空間中同名的映射器類,并將已映射的 select 語句匹配到對應名稱、參數和返回類型的方法。因此你就可以像上面那樣,不費吹灰之力地在對應的映射器接口調用方法,就像下面這樣:

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

第二種方法有很多優勢,首先它不依賴于字符串字面值,會更安全一點;其次,如果你的 IDE 有代碼補全功能,那么代碼補全可以幫你快速選擇到映射好的 SQL 語句。

6、提示 對命名空間的一點補充

在之前版本的 MyBatis 中,命名空間(Namespaces)的作用并不大,是可選的。 但現在,隨著命名空間越發重要,你必須指定命名空間。

命名空間的作用有兩個,一個是利用更長的全限定名來將不同的語句隔離開來,同時也實現了你上面見到的接口綁定。就算你覺得暫時用不到接口綁定,你也應該遵循這里的規定,以防哪天你改變了主意。 長遠來看,只要將命名空間置于合適的 Java 包命名空間之中,你的代碼會變得更加整潔,也有利于你更方便地使用 MyBatis。

命名解析:為了減少輸入量,MyBatis 對所有具有名稱的配置元素(包括語句,結果映射,緩存等)使用了如下的命名解析規則。

  • 全限定名(比如 “com.mypackage.MyMapper.selectAllThings)將被直接用于查找及使用。
  • 短名稱(比如 “selectAllThings”)如果全局唯一也可以作為一個單獨的引用。 如果不唯一,有兩個或兩個以上的相同名稱(比如 “com.foo.selectAllThings” 和 “com.bar.selectAllThings”),那么使用時就會產生“短名稱不唯一”的錯誤,這種情況下就必須使用全限定名。

對于像 BlogMapper 這樣的映射器類來說,還有另一種方法來完成語句映射。 它們映射的語句可以不用 XML 來配置,而可以使用 Java 注解來配置。比如,上面的 XML 示例可以被替換成如下的配置:

package org.mybatis.example;
public interface BlogMapper {@Select("SELECT * FROM blog WHERE id = #{id}")Blog selectBlog(int id);
}

使用注解來映射簡單語句會使代碼顯得更加簡潔,但對于稍微復雜一點的語句,Java 注解不僅力不從心,還會讓你本就復雜的 SQL 語句更加混亂不堪。 因此,如果你需要做一些很復雜的操作,最好用 XML 來映射語句。

選擇何種方式來配置映射,以及認為是否應該要統一映射語句定義的形式,完全取決于你和你的團隊。 換句話說,永遠不要拘泥于一種方式,你可以很輕松的在基于注解和 XML 的語句映射方式間自由移植和切換。

7、作用域(Scope)和生命周期

作用域和生命周期類別是至關重要的,因為錯誤的使用會導致非常嚴重的并發問題。

1、提示 對象生命周期和依賴注入框架

依賴注入框架可以創建線程安全的、基于事務的 SqlSession 和映射器,并將它們直接注入到你的 bean 中,因此可以直接忽略它們的生命周期。 如果對如何通過依賴注入框架使用 MyBatis 感興趣,可以研究一下 MyBatis-Spring 或 MyBatis-Guice 兩個子項目。

2、SqlSessionFactoryBuilder

這個類可以被實例化、使用和丟棄,一旦創建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 實例的最佳作用域是方法作用域(也就是局部方法變量)。 你可以重用 SqlSessionFactoryBuilder 來創建多個 SqlSessionFactory 實例,但最好還是不要一直保留著它,以保證所有的 XML 解析資源可以被釋放給更重要的事情。

3、SqlSessionFactory(可以想象成:數據庫連接池)

SqlSessionFactory 一旦被創建就應該在應用的運行期間一直存在,沒有任何理由丟棄它或重新創建另一個實例。 使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重復創建多次,多次重建 SqlSessionFactory 被視為一種代碼“壞習慣”。因此 SqlSessionFactory 的最佳作用域是應用作用域。 有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式

4、SqlSession(連接到連接池的一個請求)

每個線程都應該有它自己的 SqlSession 實例。SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。 絕對不能將 SqlSession 實例的引用放在一個類的靜態域,甚至一個類的實例變量也不行。 也絕不能將 SqlSession 實例的引用放在任何類型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你現在正在使用一種 Web 框架,考慮將 SqlSession 放在一個和 HTTP 請求相似的作用域中。 換句話說,每次收到 HTTP 請求,就可以打開一個 SqlSession,返回一個響應后,就關閉它。 這個關閉操作很重要,為了確保每次都能執行關閉操作,你應該把這個關閉操作放到 finally 塊中。 下面的示例就是一個確保 SqlSession 關閉的標準模式:

try (SqlSession session = sqlSessionFactory.openSession()) {// 你的應用邏輯代碼
}

在所有代碼中都遵循這種使用模式,可以保證所有數據庫資源都能被正確地關閉。

5、映射器實例

映射器是一些綁定映射語句的接口。映射器接口的實例是從 SqlSession 中獲得的。雖然從技術層面上來講,任何映射器實例的最大作用域與請求它們的 SqlSession 相同。但方法作用域才是映射器實例的最合適的作用域。 也就是說,映射器實例應該在調用它們的方法中被獲取,使用完畢之后即可丟棄。 映射器實例并不需要被顯式地關閉。盡管在整個請求作用域保留映射器實例不會有什么問題,但是你很快會發現,在這個作用域上管理太多像 SqlSession 的資源會讓你忙不過來。 因此,最好將映射器放在方法作用域內。就像下面的例子一樣:

try (SqlSession session = sqlSessionFactory.openSession()) {// 你的應用邏輯代碼
}

總結

以上就是Mybatis之簡介、使用操作(安裝、XML、SqlSession、映射的SQL語句、命名空間、作用域和生命周期)的相關知識點,希望對你有所幫助。
積跬步以至千里,積怠惰以至深淵。時代在這跟著你一起努力哦!

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

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

相關文章

Java項目-瑞吉外賣Day4

實現文件的上傳下載&#xff1a; 前端代碼&#xff1a; 對文件的操作就是對流的操作。 上傳文件的后端代碼&#xff0c;需要注意MultipartFile的名字必須與前端相對&#xff1a; 為文件存儲位置進行動態設置&#xff0c;配置application.xml 在CommonController中設置屬性讀…

Nodejs后端+express框架

前言 基于vue3Node后臺管理項目&#xff0c;補充nodejs和express相關知識。 文章目錄 一&#xff0c;express 1.官網 Express - 基于 Node.js 平臺的 web 應用開發框架 - Express中文文檔 | Express中文網 2.安裝 npm install express --save 二、MongoDB 特點 非關…

uniapp 藍牙小程序

在 uni-app 中開發藍牙相關的小程序涉及到使用 uni-app 提供的藍牙 API。uni-app 為多端開發提供了統一的 API&#xff0c;這意味著你編寫的代碼可以在不同的平臺上運行&#xff0c;包括微信小程序。 以下是實現藍牙功能的基本步驟和代碼示例&#xff1a; 1. 開啟藍牙適配器 …

java之SpringBoot開發實用篇

MENU SpringBoot開發實用篇KF-1.熱部署KF-1-1.手動啟動熱部署KF-1-2.自動啟動熱部署KF-1-3.參與熱部署監控的文件范圍配置KF-1-4.關閉熱部署 KF-2.配置高級KF-2-1.ConfigurationPropertiesKF-2-2.寬松綁定/松散綁定KF-2-3.常用計量單位綁定KF-2-4.校驗KF-2-5.數據類型轉換 KF-3…

【頭歌系統數據庫實驗】實驗8 SQL的復雜多表查詢-2

目錄 第1關&#xff1a;基于派生表查詢每個隊員解答中超過他平均memory的user_id及題目編號problem_id 第2關&#xff1a;用ANY/ALL實現查詢2019級選手&#xff08;user_id前4位為2019&#xff09;滿足比2020級其中一個選手注冊時間早即可的選手 第3關&#xff1a;用聚集查詢…

python zblog API實現類似XMLRPC/發布文章

我發現python對Zblog的XML發布并不友好&#xff0c;雖然也有對應的模塊&#xff0c;但是遠遠沒有XPCRPC更直接方便&#xff0c;但是使用xmlRpc是直接給發布文章帶來了不小的便利&#xff0c;但是對系統也并不友好&#xff0c;但是zblog也開放了Api&#xff0c;但是干部子弟不樂…

UE小:物品拼裝功能

藍圖B1的實現步驟&#xff1a; 獲取玩家控制器和視角&#xff1a;首先獲取玩家控制器&#xff0c;然后使用Deproject Screen to World節點將屏幕上的鼠標位置轉換為世界空間中的一條射線。 射線檢測&#xff1a;使用Line Trace by Channel或Line Trace for Objects節點發射射線…

深度學習測試流程

深度學習模型測試的功能旨在驗證模型在各種情況下的性能和魯棒性。以下是深度學習模型測試的主要功能&#xff1a; 性能評估&#xff1a; 測試模型在任務目標上的整體性能&#xff0c;例如分類準確性、回歸誤差等。評估指標的選擇取決于具體的任務類型。 泛化能力&#xff1a;…

《信息技術時代》期刊雜志論文發表投稿

《信息技術時代》期刊收稿方向&#xff1a;通信工程、大數據、計算機、辦公自動化、信息或計算機教育、電子技術、系統設計、移動信息、圖情信息研究、人工智能、智能技術、信息技術與網絡安全等。 刊名&#xff1a;信息技術時代 主管主辦單位&#xff1a;深圳灣科技發展有限…

C++筆記之int、size_t、uint8_t、unsigned char*區別

C筆記之int、size_t、uint8_t、unsigned char*區別 code review! 文章目錄 C筆記之int、size_t、uint8_t、unsigned char*區別1.ChatGPT第一次查詢解釋2.ChatGPT第二次查詢解釋3.分別的使用示例 1.ChatGPT第一次查詢解釋 size_t、uint8_t 和 int 是編程中使用的不同類型&…

《微信小程序開發從入門到實戰》學習四十七

4.4 云函數 4.4.5 云函數的定時觸發 如果云函數需要定時執行&#xff0c;可以使用云函數定時觸發器。配置了定時觸發器&#xff0c;云函數會在相應時間點被自動觸發。函數返回結果不會返回調用方 在需要添加觸發器的云函數下新建文件config.json。格式如下&#xff1a; &quo…

05-詳解調用服務時負載均衡的配置及其原理

負載均衡 負載均衡的原理(通用) LoadBalanced注解用來攔截它所標記的RestTemplate發起的http請求, 底層是利用了一個名為Ribbon的組件來實現負載均衡功能(Cloud高版本已經棄用) LoadBalancerInterceptor的intercept方法會對RestTemplate的請求進行攔截 public class LoadBal…

【Linux】使用Bash和GNU Parallel并行解壓縮文件

介紹 在本教程中&#xff0c;我們將學習如何使用Bash腳本和GNU Parallel實現高效并行解壓縮多個文件。這種方法在處理大量文件時可以顯著加快提取過程。 先決條件 確保系統上已安裝以下內容&#xff1a; BashGNU Parallel 你可以使用以下命令在不同Linux系統上安裝它們&am…

【數據庫】分支與循環函數存儲過程

目錄 函數 【1】 【2】 【3】? 【4】 存儲過程 思考&分析 函數 【1】 --&#xff08;1&#xff09;定義一個根據學生姓名查詢該生學習課程的函數stu_count。 --create function stu_count(sname char(8))--學生姓名 --returns char(12)--學習課程 --begin --…

layui分頁laypage結合Flask+Jinja2實現流程

Layui2.0普通用法<!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title>Demo</title><!-- 請勿在項目正式環境中引用該 …

uniapp iOS離線打包——運行項目到模擬器報錯?

運行項目、打包時報錯問題 記錄個人在開發過程中遇到的相關問題&#xff0c;后續有時間會不定時更新 文章目錄 運行項目、打包時報錯問題運行到模擬器報錯解決方案 打包報錯解決方案 運行到模擬器報錯 解決方案 選中項目工程 —> Build Settings 滑動底部 —> User-Defi…

Java基礎課的中下基礎課04

目錄 二十三、集合相關 23.1 集合 &#xff08;1&#xff09;集合的分支 23.2 List有序可重復集合 &#xff08;1&#xff09;ArrayList類 &#xff08;2&#xff09;泛型 &#xff08;3&#xff09;ArrayList常用方法 &#xff08;4&#xff09;Vector類 &#xff08;…

gin博客項目開發日志1

gin項目博客系統偽第一代 項目概述 1.1 目標 實現一個功能完整、易用的博客系統&#xff0c;允許用戶發布、編輯和管理博客文章。 1.2 背景 看到網上有很多語言寫的博客系統&#xff0c;但go的卻很少&#xff0c;正好&#xff0c;現在我在學go&#xff0c;可以拿博客來練練…

組件之間傳值

目錄 1&#xff1a;組件中的關系 2&#xff1a;父向子傳值 3&#xff1a;子組件向父組件共享數據 4&#xff1a;兄弟組件數據共享 1&#xff1a;組件中的關系 在項目中使用到的組件關系最常用兩種是&#xff0c;父子關系&#xff0c;兄弟關系 例如A組件使用B組件或者C組件…

深入了解UDP協議:特點、應用場景及市面上常見軟件案例

目錄 引言 UDP的特點 UDP的應用場景 市面上使用UDP的軟件案例 結論 引言 在計算機網絡中&#xff0c;UDP&#xff08;User Datagram Protocol&#xff09;是一種面向無連接、無狀態的傳輸層協議。與TCP相比&#xff0c;UDP具有獨特的特點和適用場景。本文將深入探討UDP協…