【Java企業級開發】(六)Java框架技術-Maven和MyBatis

? 一、Maven

1.1 非Maven項目的缺點

問題一:

? ? ? ? 項目中的jar包資源需要我們自己從網上下載后,手動導入到項目中使用,不好管理

問題二:

? ? ? ? jar包版本控制麻煩

1.2 Maven介紹

? ? ? ? Maven是使用Java語言編寫的基于項目對象模型(POM)項目管理工具軟件。開發者可以通過一小段描述信息來管理項目構建、報告和文檔。使用Maven可以更好的幫助我們完成項目的管理。

1.3 Maven倉庫

? ? ? ? 中央倉庫(Central Repository):Maven官方服務器。里面存放了絕大多數市面上流行的jar。允許用戶政策后,上傳自己的項目到官方服務器。網址在國外,經常訪問不了。

https://mvnrepository.com/https://mvnrepository.com/? ? ? ? 鏡像倉庫(Mirror Repository):對于國內來說,訪問國外的Maven倉庫會特別慢。鏡像倉庫就是另一臺備份/復制了中央倉庫的服務器。平時使用時國內開發者多使用阿里云鏡像或華為云鏡像,這樣可以大大提升從中央倉庫下載資源的速度。但它的角色仍然是一個遠程庫。

? ? ? ? 本地倉庫(Local Repository):本機的文件夾作為本地倉庫,本地倉庫指本機的一份拷貝,用來緩存遠程下載,包含你尚未發布的臨時構件。

1.4 Maven的資源坐標

<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.3.0</version>
</dependency>

GroupId:一般是逆向公司域名com.xxx。同一個公司的GroupId都是相同的。

ArtifactId:一般是項目(jar)名,如:mysql-connector-java。

Version:版本號8.0.28。

1.5?Maven的下載和安裝

? ? ? ? 從maven官網下載Maven,官網地址:

Welcome to Apache Maven – Mavenhttps://maven.apache.org/

1.6 Maven常用配置

(1)配置本地倉庫

? ? ? ? 隨便選擇一個目錄作為本地倉庫

? ? ? ? 在配置文件中指定本地倉庫的位置

配置文件位置:F:\Java-IDEA\apache-maven-3.9.11\conf\settings.xml(就是剛剛1.5中下載的Maven包的路徑中)

(2) 配置鏡像倉庫

配置文件位置:F:\Java-IDEA\apache-maven-3.9.11\conf\settings.xml(就是剛剛1.5中下載的Maven包的路徑中)

<mirror><id>alimaven</id><mirrorOf>central</mirrorOf><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>

(3)配置JDK

? ? ? ? 在使用Maven之后,項目由Maven來完成編譯和打包運行,需要指定使用的JDK版本。

配置文件位置:F:\Java-IDEA\apache-maven-3.9.11\conf\settings.xml(就是剛剛1.5中下載的Maven包的路徑中)

<profile><id>jdk-17</id><activation><activeByDefault>true</activeByDefault><jdk>17</jdk></activation><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><maven.compiler.compilerVersion>17</maven.compiler.compilerVersion></properties>
</profile>

1.7 創建Maven項目

(1)降版本操作

? ? ? ? 目前我們下載的Maven版本是3.9.11,JDK的版本是17,由于市面上對于這個版本的配置并不兼容,會出現一系列的問題,所以,我們要將Maven和JDK的版本降低到一個穩定兼容的版本:

manen:切換版本為3.6.3

https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.ziphttps://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zipJDK:切換版本為8

????????這個鏈接中有所有的JDK下載地址
Index of java-local/jdkhttps://repo.huaweicloud.com/java/jdk/

?(2)創建Maven項目
創建空項目

IDEA集成Maven操作

(3)Maven項目目錄結構

?(4)測試Maven中MySql數據庫鏈接
package com.study.test01;import java.sql.*;public class Test {public static void main(String[] args) throws SQLException, ClassNotFoundException {// 加載驅動:Class.forName("com.mysql.cj.jdbc.Driver");// 獲取連接String url = "jdbc:mysql://127.0.0.1:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";/*=====url中參數含義=====useSSL:是否使用SSL認證機制-不使用 falseuseUnicode:是否使用unicode字符集-使用characterEncoding=UTF-8:使用unicode的utf-8策略serverTimezone:時區參數-東八區allowPublicKeyRetrieval:允許客戶端從服務器獲取公鑰*/String username = "root";String password = "root";Connection conn = DriverManager.getConnection(url, username, password);// 創建會話Statement stmt = conn.createStatement();// 發送SQL(更新操作)ResultSet resultSet = stmt.executeQuery("select * from t_book");// 處理結果while (resultSet.next()) { // 判斷是否有記錄存在System.out.println(resultSet.getString("id") + "----" + resultSet.getString("name") + "----" + resultSet.getString("author") + "----" + resultSet.getDouble("price"));}// 關閉資源stmt.close();conn.close();}
}

二、框架

2.1 框架出現的意義

? ? ? ? 重復/基礎代碼封裝,同時添加額外功能

? ? ? ? 釋放程序員寫代碼精力,更關注業務層面

? ? ? ? 框架是半成品

2.2 框架的優缺點

? ? 優點

? ? ? ? 更好用

? ? ? ? 更強大

? ? ? ? 開發周期短

? ? 缺點

? ? ? ? 更多的學習成本

? ? ? ? 初學者容易出錯

? ? ? ? 對于初學者,出了錯誤更難解決

2.3 常見框架

常見Java框架分類:

(1)持久層框架:MyBatis、Hibernate、Spring Data、iBatis

(2)MVC框架:Spring MVC、Struts1、Struts2

(3)項目管理框架:Spring Framework、Spring Boot

(4)微服務框架:Spring Cloud

(5)權限管理框架:Spring Security、Shiro

三、MyBatis使用

3.1 MyBatis是持久層框架

? ? ? ? 持久層是分層開發中專門負責訪問數據源的一層,Java項目中每一層都由自己的作用,持久層的作用就是訪問數據源,把訪問數據源的代碼和業務邏輯代碼分離開,有利于后期維護和團隊分工開發。同時也增加了數據訪問代碼的復用性。

3.2 MyBatis是ORM框架

? ? ? ? ORM(Object/Relation Mapping),中文名稱:對象/關系映射。是一種解決數據庫發展和面向對象編程語言發展不匹配問題而出現的技術。

3.3 搭建第一個MyBatis框架

(1)創建數據庫表
(2)創建Maven項目
(3)添加依賴

添加MySql依賴(在pom.xml文件中)

?(4)創建MyBatis全局配置文件

參考官網:入門_MyBatis中文網https://mybatis.net.cn/getting-started.html

配置JDBC連接
<?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="mysql"><environment id="mysql"><!--事務配置--><transactionManager type="JDBC"></transactionManager><!--數據源--><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/study?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai&amp;allowPublicKeyRetrieval=true"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments>
</configuration>
?(5)創建實體類

? ? ? ? 實體類的參數要跟數據庫中的列名保持一致

(6)創建映射文件

創建映射文件

在核心配置文件中進行掃描?

(7)編寫測試類,啟動項目?
package com.study.test;import com.study.pojo.Book;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class Test {public static void main(String[] args) throws IOException {// 指定核心配置文件的路徑String resource = "mybatis.xml";// 獲取加載配置文件的輸入流InputStream inputStream = Resources.getResourceAsStream(resource);// 加載配置文件:創建工廠類SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 通過工廠類獲取一個會話SqlSession sqlSession = sqlSessionFactory.openSession();// 執行查詢List<Object> list = sqlSession.selectList("a.b.sellectAllBooks");// 遍歷for (int i = 0; i < list.size(); i++) {Book book = (Book) list.get(i);System.out.println(book.getName() + "---" + book.getAuthor() + "---" + book.getPrice());}//關閉資源sqlSession.close();}
}

四、MyBatis配置

4.1 別名設置

? ? ? ? MyBatis提供了別名機制可以對某個類起別名或給某個包下所有類起別名,簡化resultType取值的寫法。

? ? ? ? 在核心配置文件中(mybatis.xml),通過<typeAlias>標簽明確設置類型的別名。

  • type:類型全限定路徑
  • alias:別名名稱
<typeAliases><typeAlias type="com.study.pojo.Book" alias="book"></typeAlias>
</typeAliases>

? ? ? ? 當類個數比較多時,明確指定別名工作量較大,可以通過<package>標簽指定包下全部類的別名。指定后所有類的別名就是類名。(也不區分大小寫)

<typeAliases><!--單獨設置別名--><typeAlias type="com.study.pojo.Book" alias="book"></typeAlias><!--統一設置別名--><package name="com.study.pojo"/>
</typeAliases>

ps:明確指定別名和指定包的方式可以同時存在

4.2 內置別名

????????MyBatis框架中內置了一些常見類型的別名。這些別名不需要配置?

別名映射的類型別名映射的類型別名映射的類型
_bytebytestringStringdateDate
_longlongbyteBytedecimalDecimal
_shortshortlongLongbigdecimalBigDecimal
_intintshortShortobjectObject
_inergerintintIntegermapMap
_doubledoubleintegerIntegerhashmapHashMap
_floatfloatdoubleDoublelistList
_booleanbooleanfloatFloatarraylistArrayList
booleanBooleancollectionCollection
iteratorIterator

4.3 屬性文件配置

? ? ? ? MyBatis支持加載屬性文件(.properties文件),可以通過在屬性文件中配置數據庫里娜姬屬性然后加載。這種方式要比直接寫稍微麻煩一點點,但是卻可以把所有的數據庫連接寫道了統一的文件中,以后查看或修改時更加方便。

在src/main/resources目錄中創建db.properties文件:

url=jdbc:mysql://127.0.0.1:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
driver=com.mysql.cj.jdbc.Driver
username=root
password=root

修改mybatis.xml文件,設置加載屬性。通過${key}獲取屬性文件中配置的值:

<!--    加載properties配置文件-->
<properties resource="db.properties"><!--數據源 示例:-->
<dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/>
</dataSource>

4.4 MyBatis啟動日志功能

????????MyBatis框架內置日志工廠。日志工廠負責自動加載項目中的配置的日志。MyBatis支持以下日志:

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j(deprecated since 3.5.9)
  • JDK logging

(1)在pom.xml文件中配置

<!--Log4j的依賴-->
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

(2)在resources中新建log4j.properties配置文件。名稱必須叫這個名字,擴展名必須是.properties

# log4j中定義的級別:fatal(致命錯誤)>error(錯誤)>warn(警告)>info(普通信息)>debug(調試信息)>trace(跟蹤信息)
log4j.rootLogger = trace,console### console ### 控制臺
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%p] [%-d{yyy--MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n

? ? ? ? 如果說你是想看sql執行過程,那么可以整體調高,局部降低:將整個日志的級別調為ERROR,然后mapper.xml涉及的內容級別降低為TRACE。這樣整體的多余信息不會輸出,然后mapper.xml中的涉及內容會詳細打印,log4j.properties加入:

#log4j.looger是固定的,a.b是命名空間的名字
log4j.logger.a.b = trace

五、接口

(1)類是類,接口是接口。

(2)接口:定義規則。實現類:實現接口,實現規則。

(3)接口:用interface來表示。

(4)在JDK1.8之前,接口中的內容:常量、抽象方法。

(5)實現類實現接口,利用implements關鍵字

(6)實現類實現接口后,重寫接口中當以的抽象方法

(7)接口不能創建對象,需要用接口指向實現類的形式創建對象(多態形式)

六、依據接口綁定方案創建項目

6.1 創建新的Maven項目

6.2 配置pom.xml,引入依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>TestMyBatis02</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--MySql驅動的依賴--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--MyBatis的依賴--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><!--Log4j的依賴--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies></project>

6.3 配置全局配置文件MyBatis.xml

?6.4 引入數據庫配置和日志配置

db.properties

url=jdbc:mysql://127.0.0.1:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
driver=com.mysql.cj.jdbc.Driver
username=root
password=root

log4j.properties

log4j.rootLogger = error,consolelog4j.logger.a.b = tracelog4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%p] [%-d{yyy--MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n

6.5 創建數據庫的實體類

package com.study.pojo;public class Book {private int id;private String name;private String author;private double price;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}// 構造器public Book(int id, String name, String author, double price) {this.id = id;this.name = name;this.author = author;this.price = price;}
}

6.6 創建接口

6.7 創建映射文件

要求:namespace取值必須是接口的全限定路徑、標簽中的id屬性值必須和方法名對應

<?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="com.study.mapper.BookMapper"><select id="selectAllBooks" resultType="Book">select * from t_book</select>
</mapper>

6.8 編寫測試類(通過動態代理模式)

package com.study.test;import com.study.mapper.BookMapper;
import com.study.pojo.Book;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class Test {public static void main(String[] args) throws IOException {// 指定核心配置文件的路徑String resource = "mybatis.xml";// 獲取加載配置文件的輸入流InputStream inputStream = Resources.getResourceAsStream(resource);// 加載配置文件:創建工廠類SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 通過工廠類獲取一個會話SqlSession sqlSession = sqlSessionFactory.openSession();// 執行查詢// 動態代理模式 = BookMapper mapper = BookMapper (接口 = 實現類)BookMapper mapper = sqlSession.getMapper(BookMapper.class); // 參數:接口List list = mapper.selectAllBooks();// 遍歷操作for (int i = 0; i < list.size(); i++) {Book book = (Book) list.get(i);System.out.println(book.getName());}//關閉資源sqlSession.close();}
}

七、MyBatis的參數傳遞問題

7.1 如何進行參數傳遞

使用接口綁定方案之前:

? ? ? ? (1)如果是一個參數,直接傳遞

? ? ? ? (2)如果是多個參數,封裝成對象/集合

使用接口綁定方案之后:

? ? ? ? 可以直接調用方法傳遞參數即可。?

7.2 獲取數據方式

(1)使用內置名稱進行調用

使用符號:#{}進行獲取

{}中名字的使用規則

arg0、arg1、argM(M為從0開始的數字,和方法參數順序對應)

param1、param2、paramN(N為從1開始的數字,和方法參數順序對應)

<select id="selectOneBook" resultType="Book">select * from t_book where name = #{param1} and author = #{param2}
</select>

(2)使用對象類型傳遞參數

使用符號:#{}進行獲取

直接利用屬性名即可

<select id="selectOneBook2" resultType="Book">select * from t_book where name = #{name} and author = #{author}
</select>

(3)傳遞多個不同類型的參數

使用符號:#{}進行獲取

argM.屬性名

paramN.屬性名

PS:argM.或者paramN.不可以省略不寫

<select id="selectOneBook3" resultType="Book">select * from t_book where name = #{param1} and author = #{param2.author}
</select>

7.3 數據庫修改數據

增加操作

????????映射文件

insert(增加)、delete(刪除)、update(修改)

<insert id="insertBook">insert into t_book(id,name,author,price) values (#{id},#{name},#{author},#{price})
</insert>

注意:修改數據庫時有一個事務相關的操作

// 這里會涉及一個跟事務相關的操作:提交(commit)
sqlSession.commit();

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

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

相關文章

學習秒殺系統-頁面優化技術

文章目錄前言頁面緩存URL緩存對象緩存頁面緩存取緩存手動渲染URL緩存對象緩存頁面靜態化&#xff0c;前后端分離&#xff08;常用&#xff09;GET POST區別如何解決超賣&#xff1f;重復賣&#xff1f;&#xff08;簡單版&#xff09;靜態資源優化多個JS/CSS組合&#xff0c;減…

QCC系列顯示交互層的自研技術突破與實踐

在音頻設備智能化進程中&#xff0c;顯示交互的流暢度與兼容性已成為用戶體驗的核心指標。傳統方案中&#xff0c;TFT 彩屏與多語言適配常面臨硬件驅動沖突、功耗失控、字符顯示錯亂等問題。作為高通平臺十年級方案商&#xff0c;騰泰技術在 QCC 系列中聚焦顯示交互層的自研技術…

JMeter 實現 Protobuf 加密解密

一、 .proto文件編譯成.jar文件 相關依賴下載詳見&#xff1a;將 message.proto 編譯成 .jar文件 1.依賴于java編譯環境 2.依賴protoc編譯jar包 編譯目錄 1.創建一個根目錄&#xff1a;protobuf 2.在protobuf下創建build、output、lib、src目錄 lib&#xff1a;放 protobu…

發票識別在費控系統應用剖析

一、發票識別與費控系統的融合價值1.1 解決傳統費控痛點效率瓶頸突破&#xff1a;將人工處理每張發票的5-8分鐘縮短至秒級自動識別準確性飛躍&#xff1a;關鍵字段識別準確率從人工的95%提升至99%以上合規性強化&#xff1a;自動對接稅務系統驗真&#xff0c;虛假發票識別率提升…

Rust實戰:決策樹與隨機森林實現

基于 Rust 實現決策樹(Decision Tree)和隨機森林(Random Forest)的實例 Linfa的基本定義 Linfa是意大利語中“淋巴”(lymph)的意思,在醫學領域指淋巴系統相關的結構或功能。淋巴系統由淋巴管、淋巴結、脾臟等組成,負責免疫防御和體液平衡。 Linfa在生物學中的作用 …

9. isaacsim4.2教程-ROS加相機/CLOCK

在本示例中&#xff0c;我們將學習如何&#xff1a; 向場景中添加額外的相機并將其安裝在機器人上 添加相機發布器&#xff08;Camera Publishers&#xff09; 通過 rostopics 發送真實的合成感知數據&#xff08;ground truth synthetic perception data&#xff09; 前提…

微信小程序171~180

1.封裝購物車接口API import http from /utils/httpexport const reqAddCrt ({ goodsId, count, ...data }) > {return http.get(/cart/addToCart/${goodsId}/${count}, data) }export const reqCartList () > {return http.get(/cart/getCartList) }export const reqU…

修改 docker 容器的掛載配置(保持數據不丟的情況)

一、核心原理Docker 容器的運行時配置&#xff08;包括掛載&#xff09;是啟動時確定的&#xff0c;一旦啟動無法直接修改。因此&#xff0c;需通過以下步驟實現&#xff1a;保存原容器中的數據&#xff08;避免丟失&#xff09;&#xff1b;基于原鏡像創建新容器&#xff0c;同…

MVCC(多版本并發控制)介紹及實現原理

一、什么是MVCC&#xff1f; MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并發控制&#xff09;是數據庫中用于解決并發訪問問題的一種機制。它通過為數據維護多個版本&#xff0c;讓讀寫操作在不同版本上獨立進行&#xff0c;從而避免了傳統鎖機制中…

密碼學基礎概念詳解:從古典加密到現代密碼體系

一、引言&#xff1a;為什么我們需要密碼學&#xff1f; 在數字化時代&#xff0c;信息已成為核心生產要素&#xff0c;而信息安全則是保障社會運轉的基石。當我們在電商平臺輸入銀行卡密碼時&#xff0c;當我們通過即時通訊工具發送私密消息時&#xff0c;當企業在云端存儲核心…

小鵬汽車視覺算法面試30問全景精解

小鵬汽車視覺算法面試30問全景精解 ——智能駕駛 車路協同 視覺創新:小鵬汽車視覺算法面試核心考點全覽 前言 小鵬汽車作為中國智能電動汽車的創新引領者,致力于通過AI與自動駕駛技術推動智能出行的變革。小鵬視覺算法團隊深耕自動駕駛感知、車路協同、智能座艙、3D重建…

程序是如何生成的-以c語言為例

一&#xff0c;序言 從代碼到能跑的程序&#xff0c;整個過程就像 “把外文翻譯成母語&#xff0c;再組裝成能直接用的東西”&#xff0c;一步步來更清楚&#xff1a; 源代碼&#xff08;程序員寫的代碼&#xff0c;如C語言文件&#xff09;↓ 預處理&#xff08;處理#開頭的命…

風險識別清單:構建動態化的風險管理體系

在項目管理實踐中&#xff0c;風險識別是確保項目成功的關鍵環節。PMBOK提出的風險提示清單&#xff08;Prompt List&#xff09;為項目團隊提供了一個系統化的思考框架&#xff0c;幫助突破個人經驗局限&#xff0c;實現更全面的風險覆蓋。這一工具的價值不僅在于其提供的標準…

從“點狀用例”到“質量生態”:現代軟件測試的演進、困局與破局

測試的三次范式躍遷業務高速迭代下的四大困局質量工程化&#xff1a;流程、平臺、度量三位一體左移與右移&#xff1a;把缺陷扼殺在搖籃&#xff0c;也把監控鋪到墳墓自動化金字塔的再平衡&#xff1a;UI、API、單元、契約、e2e數據驅動測試&#xff1a;從“拍腦袋”到“科學實…

【C++】繼承和多態擴展學習

目錄 1. 菱形虛擬繼承原理剖析 1.1.虛基表 2. 單繼承和多繼承的虛函數表深入探索 2.1 單繼承虛函數表深入探索 2.2 多繼承虛函數表深入探索 ?編輯 2.3 菱形繼承、菱形虛擬繼承 3. 繼承和多態考察的一些常見問題 1. 菱形虛擬繼承原理剖析 繼承的文章中我們講到C的多繼承…

Visual Studio Code 遠端云服務器開發使用指南

目錄 一、下載安裝 1、官方下載 2、下載加速方案 二、基于Ubuntu系統的開發環境搭建方案 1、開發環境配置 2、云服務器架構 3、工作流程關系 4、總結 三、推薦插件 1、免配置插件 1. Remote-SSH - 遠程登錄Linux服務器 2. C/C - 必備的C/C開發插件 3. C/C Extensi…

技術演進中的開發沉思-41 MFC系列:定制 AppWizard

MFC開發&#xff0c;最為重要的無非就是用“MFC AppWizard” 對話框做開發了&#xff0c;第一次使用感覺像拆收音機的孩子 —— 左邊是項目類型選擇&#xff0c;右邊是一堆打勾的選項&#xff0c;點完 “完成”&#xff0c;屏幕上就冒出了能直接編譯運行的窗口程序。那時還不知…

Libevent(3)之使用教程(2)創建事件

Libevent(3)之使用教程(2)創建事件 Author: Once Day Date: 2025年6月29日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 本文檔翻譯于&#xff1a;Fast portable non-bl…

Kotlin 作用域函數 let 的實現原理

Kotlin 中的 let 是一個 標準庫擴展函數&#xff0c;它廣泛用于作用域函數&#xff08;Scope Functions&#xff09;中&#xff0c;尤其適用于對可空對象&#xff08;nullable&#xff09;做非空判斷并執行代碼塊的場景。 示例代碼 val name: String? "123" name?…

從FDTD仿真到光學神經網絡:機器學習在光子器件設計中的前沿應用工坊

FDTD仿真與光學神經網絡的基礎概念 FDTD&#xff08;時域有限差分&#xff09;是一種數值方法&#xff0c;用于求解麥克斯韋方程組&#xff0c;廣泛應用于光子器件設計。光學神經網絡通過光波導、衍射元件等物理結構實現矩陣運算&#xff0c;具有低能耗、高并行的優勢。 機器學…