【JavaEE】(19) MyBatis-plus

一、MyBatis Generator

? ? ? ? 為 MyBastis 框架設計的代碼生成工具,簡化持久層編碼工作。根據數據庫表自動生成 Java 實體類、Mapper 接口、SQL 的 xml 文件。讓開發者專注于業務邏輯。

1、引入插件

? ? ? ? MyBatis?官網搜索 MyBatis Generator 插件:Running MyBatis Generator With Maven – MyBatis Generator Corehttps://mybatis.org/generator/running/runningWithMaven.html

            <plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.6</version><executions><execution><id>Generate MyBatis Artifacts</id><phase>deploy</phase><goals><goal>generate</goal></goals></execution></executions><configuration><!--generator配置文件所在位置--><configurationFile>src/main/resources/generator/generatorConfig.xml</configurationFile><!-- 允許覆蓋生成的文件;xml不會覆蓋, 采用追加的方式--><overwrite>true</overwrite><verbose>true</verbose><!--將當前pom的依賴項添加到生成器的類路徑中--><includeCompileDependencies>true</includeCompileDependencies></configuration><!--該插件的依賴,在 <dependencies> 中引入的它識別不到--><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency></dependencies></plugin>

2、修改 generatorConfig.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- 配置生成器 -->
<generatorConfiguration><!-- 一個數據庫一個context --><context id="MysqlTables" targetRuntime="MyBatis3Simple"><!--禁用自動生成的注釋--><commentGenerator><property name="suppressDate" value="true"/><property name="suppressAllComments" value="true" /></commentGenerator><!--數據庫連接信息--><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://127.0.0.1:3306/book_test?serverTimezone=Asia/Shanghai&amp;nullCatalogMeansCurrent=true"userId="root"password="root"></jdbcConnection><!-- 生成實體類, 配置路徑 --><javaModelGenerator targetPackage="com.edu.generator.model" targetProject="src/main/java" ><property name="enableSubPackages" value="false"/><property name="trimStrings" value="true"/></javaModelGenerator><!-- 生成mapxml文件 --><sqlMapGenerator targetPackage="generatorMapper" targetProject="src/main/resources" ><property name="enableSubPackages" value="false" /></sqlMapGenerator><!-- 生成mapxml對應client,也就是接口dao --><javaClientGenerator targetPackage="com.edu.generator.mapper" targetProject="src/main/java" type="XMLMAPPER" ><property name="enableSubPackages" value="false" /></javaClientGenerator><!-- table可以有多個,tableName表示要匹配的數據庫表 --><table tableName="user_info" domainObjectName="UserInfo" enableSelectByExample="true"enableDeleteByExample="true" enableDeleteByPrimaryKey="true" enableCountByExample="true"enableUpdateByExample="true"><!--   類的屬性是否用數據庫中的真實字段名做為屬性名, 不指定這個屬性會自動轉換 _ 為駝峰命名規則         --><property name="useActualColumnNames" value="false" /><!-- 數據庫表主鍵 --><generatedKey column="id" sqlStatement="Mysql" identity="true" /></table><table tableName="book_info" domainObjectName="BookInfo" enableSelectByExample="true"enableDeleteByExample="true" enableDeleteByPrimaryKey="true" enableCountByExample="true"enableUpdateByExample="true"><!--   類的屬性是否用數據庫中的真實字段名做為屬性名, 不指定這個屬性會自動轉換 _ 為駝峰命名規則         --><property name="useActualColumnNames" value="false" /><!-- 數據庫表主鍵 --><generatedKey column="id" sqlStatement="Mysql" identity="true" /></table></context>
</generatorConfiguration>
  • targetRuntime="MyBatis3Simple":"MyBatis3Simple" 生成的 SQL 的 xml 語句比較簡單;"MyBatis3" 比較復雜。
  • targetPackage="com.edu.generator.model":生成在哪個包。
  • tableName="user_info":數據庫對應的表名。
  • domainObjectName="BookInfo":對應的實體類名。
  • <generatedKey column="id":主鍵名。
  • <property name="useActualColumnNames" value="false" />:屬性名自動轉換成駝峰命名規則。

? ? ? ? 只生成實體類的版本:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- 配置生成器 -->
<generatorConfiguration><!-- 一個數據庫一個context --><context id="MysqlTables" targetRuntime="MyBatis3Simple"><!-- 禁用自動生成的注釋 --><commentGenerator><property name="suppressDate" value="true"/><property name="suppressAllComments" value="true" /></commentGenerator><!-- 數據庫連接信息 --><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://127.0.0.1:3306/mybatis_test?serverTimezone=Asia/Shanghai&amp;nullCatalogMeansCurrent=true"userId="root"password="123456"></jdbcConnection><!-- 生成實體類配置 --><javaModelGenerator targetPackage="com.edu.mybatis.plus.model" targetProject="src/main/java" ><property name="enableSubPackages" value="false"/><property name="trimStrings" value="true"/></javaModelGenerator><!-- 移除SQL映射文件生成器(不生成Mapper XML) --><!-- 移除Java客戶端生成器(不生成Mapper接口) --><!-- 表配置 --><table tableName="user_info" domainObjectName="UserInfo"><property name="useActualColumnNames" value="false" /><generatedKey column="id" sqlStatement="Mysql" identity="true" /></table></context>
</generatorConfiguration>

3、生成代碼

? ? ? ? 在 maven 中運行插件,自動生成代碼:

? ? ? ? 生成的文件:

? ? ? ? 實體類把 getter、setter 都生成了,為了好看,可以調整為 @Data:

? ? ? ? Mapper 接口、xml 文件生成了一些基礎的數據庫操作。(不建議用,mxl 文件代碼太亂了,看著很復雜)

? ? ? ? 該插件的使用,需要配置很多東西,比如數據庫連接的信息,但是這些信息已經在 spring boot 的配置文件中配置過了,因此該插件還不夠方便。對于 mapper、xml 的編寫,Mybatis-plus 框架才是我們學習的重點。用用 MyBatis Generator 的實體類自動生成即可。

二、MyBatis-plus

? ? ? ? MyBatis-plus 在 MyBatis 的基礎上擴展功能,跟 MyBatis 不沖突。直接在 Spring Boot 項目的POM 文件中引入依賴即可。

? ? ? ? 官方文檔:

快速開始 | MyBatis-Plushttps://baomidou.com/getting-started/

1、快速上手

創建一個 Spring Boot 項目:

引入依賴:spring boot3 對應的版本

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.12</version>
</dependency>

配置數據庫連接信息(.yml)。

啟動類加入?@MapperScan,指定要掃描的 Mapper 文件路徑。或者每個 mapper 類加@Mapper,二選其一

創建要操作的表對應的實體類。

編寫 Mapper 接口類:

2、簡單 CRUD 單元測試

(1)查

    @Testpublic void testSelectAll() {System.out.println(("----- 查詢所有 ------"));List<UserInfo> userList = userInfoMapper.selectList(null);userList.forEach(System.out::println);}@Testvoid testSelectById(){System.out.println(("----- 按 主鍵 查詢 ------"));UserInfo userInfo = userInfoMapper.selectById(2);System.out.println(userInfo);}@Testvoid testSelectByIds(){System.out.println(("----- 按 主鍵 集合查詢 ------"));List<UserInfo> userInfos = userInfoMapper.selectByIds(List.of(1,2));userInfos.forEach(System.out::println);}

(2)增

    @Testvoid testInsert(){System.out.println(("----- 插入一條數據 ------"));UserInfo userInfo = new UserInfo();userInfo.setUserName("Jay");userInfo.setPassword("Chou");int insert = userInfoMapper.insert(userInfo);System.out.println("影響行數:"+ insert);}

id 生成了隨機數:

想自增需要使用 @TableId 設置:

id 會從最大值 2 開始自增:

如果想修改最大值:表上右鍵 >> 設計表 >> 選項 修改

(3)改

    @Testvoid testUpdate(){System.out.println(("----- 按 主鍵 更新一條數據 ------"));UserInfo userInfo = new UserInfo();userInfo.setId(2);userInfo.setUserName("lisi");userInfo.setDeleteFlag(1);userInfoMapper.updateById(userInfo);}

(4)刪

    @Testvoid testDelete(){System.out.println(("----- 按 主鍵 刪除一條數據 ------"));userInfoMapper.deleteById(-2019921918);}

3、命名映射注解

? ? ? ? MyBatis-plus 如何將類名、屬性名與數據庫表、主鍵字段、普通字段對應:

  • 根據實體類名推斷表名。(@TableName
  • 默認 id 屬性是主鍵。(@TableId
  • 駝峰規則的屬性名對應的蛇形命名,就是表字段。(@TableField
  • 如果 java 命名不符合自動對應的的規則,可以用注解進行綁定

4、打印日志

? ? ? ? 把 mybatis 改成 mybatis-plus 即可:

mybatis-plus:configuration: # 配置打印 MyBatis ?志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5、自動生成代碼(了解)

參考:代碼生成器 | MyBatis-Plus

引入依賴:generator + 模板引擎

        <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.12</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version></dependency>

自動生成代碼:

?public void test() {FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/book_test?characterEncoding=utf8" +"&useSSL=false&allowPublicKeyRetrieval=true","root", "123456").globalConfig(builder -> builder.outputDir(Paths.get(System.getProperty("user.dir")) + "/src/main/java")).packageConfig(builder -> builder.parent("com.edu.mybatis.plus.generator").entity("entity").mapper("mapper").service("service").xml("mapper.xml")).strategyConfig(builder -> builder.entityBuilder().enableLombok()).templateEngine(new FreemarkerTemplateEngine()).execute();}?

6、復雜 CRUD 操作

(1)什么是條件構造器

? ? ? ? 條件構造器(Wrapper 類)允許鏈式構造條件(用 . 的方式直接引用條件構造方法),避免編寫復雜 SQL,同時減少?SQL 注入風險。

  • AbstractWrapper:抽象類,提供 Wrapper 類共有的方法和屬性。
  • QueryWrapper:構造查詢條件。
  • UpdateWrapper:構造更新條件,可以不用構造實體類設置 set。
  • LambdaQueryWrapper:基于 Lambda 表達式構造查詢條件。
  • LambdaUpdateWrapper:基于 Lambda 表達式構造更新條件。

????????AbstractWrapper 實現了 Compare 接口,包含了各種條件構造器,比如大于、等于、模糊查詢等,這些操作是四種 Wrapper 共有的:(更多詳情參考官方文檔)

? ? ? ? (Lambda)QueryWrapper 和 (Lambda)UpdateWrapper 的不同之處就是紅框的部分。綠框是構造函數,其余方法都是差不多一樣的。

(2)QueryWrapper

? ? ? ? 增刪改查都能用?QueryWrapper 實現。

查詢

SELECT id,user_name,password FROM user_info WHERE delete_flag = 0 AND user_name 
LIKE "%min%"
    @Testvoid testQueryWrapper(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.select("id", "user_name", "password").eq("delete_flag", 0).like("user_name", "min");List<UserInfo> userList = userInfoMapper.selectList(queryWrapper);userList.forEach(System.out::println);}

更新:需要構造實體類,設置修改值。

UPDATE user_info SET delete_flag=1 WHERE id < 3
    @Testvoid testQueryWrapper2(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();UserInfo userInfo = new UserInfo();userInfo.setDeleteFlag(1);queryWrapper.lt("id", 3);userInfoMapper.update(userInfo, queryWrapper);}

DELETE FROM user_info WHERE user_name = Jay2
    @Testvoid testQueryWrapper3(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("user_name", "Jay2");userInfoMapper.delete(queryWrapper);}

(3)UpdateWrapper

更新:不用構造實體類,直接 set。

 UPDATE user_info SET delete_flag=0 WHERE id IN (1,2)
    @Testvoid testUpdateWrapper(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.set("delete_flag", 0).in("id", List.of(1,2));userInfoMapper.update(updateWrapper);}

直接 set sql 語句更新

 UPDATE user_info SET delete_flag=delete_flag+1 WHERE id IN (1,2)
    @Testvoid testUpdateWrapper2(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.setSql("delete_flag = delete_flag + 1").in("id", List.of(1,2));userInfoMapper.update(updateWrapper);}

(4)LambdaQueryWrapper

? ? ? ? 字段名容易寫錯,Lambda 的版本就是用 實體類名::get屬性名替代字段名字符串

? ? ? ? 可以直接 new Lambda 版本 new 普通版本再使用?lambda 方法轉為?Lambda 版本

SQL:

SELECT id,user_name,password FROM user_info WHERE delete_flag = 0 AND user_name 
LIKE "%min%"
    @Testvoid testLambdaQueryWrapper(){
//        LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.lambda().select(UserInfo::getId, UserInfo::getUserName, UserInfo::getPassword).eq(UserInfo::getDeleteFlag, 0).like(UserInfo::getUserName, "min");List<UserInfo> userList = userInfoMapper.selectList(queryWrapper);userList.forEach(System.out::println);}

(5)LambdaUpdateWrapper

SQL:

 UPDATE user_info SET delete_flag=0 WHERE id IN (1,2)
    @Testvoid testLambdaUpdateWrapper(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.lambda().set(UserInfo::getDeleteFlag, 1).in(UserInfo::getId, List.of(1,2));userInfoMapper.update(updateWrapper);}

setIncrBy:遞增

setDecrBy:遞減

示例:

UPDATE user_info SET delete_flag = delete_flag + 1
    @Testvoid testLambdaUpdateWrapper(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.lambda().set(UserInfo::getDeleteFlag, 1).in(UserInfo::getId, List.of(1,2));userInfoMapper.update(updateWrapper);}

(6)自定義 SQL

? ? ? ? MyBatis-plus 框架提供的操作不能滿足所有的需求,我們可以利用 Wrapper 構造條件,在 Mapper 自定義 SQL。

  • 條件構造器傳參:參數名 ew 或者重命名?@Param(Constants.WRAPPER)

  • 構造器使用:${ew.customSqlSegment} 引用。

SQL:

select id,username,password FROM user_info WHERE user_name = "admin"

注解方式:

    @Select("SELECT id, user_name, password FROM user_info ${ew.customSqlSegment}")UserInfo selectByCustom(@Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper);

XML 方式:

    <select id="selectByCustom2" resultType="com.edu.mybatis.plus.model.UserInfo">SELECT id, user_name, password FROM user_info ${ew.customSqlSegment}</select>

測試代碼:

    @Testvoid testSelectByCustom(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.lambda().eq(UserInfo::getUserName, "admin");userInfoMapper.selectByCustom(queryWrapper);}

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

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

相關文章

Android之騰訊TBS文件預覽

文章目錄前言一、效果圖二、實現步驟1.去官網注冊并創建應用[騰訊官網](https://console.cloud.tencent.com/tbs/client)2.下載arr文件并引入[騰訊TBS](https://download.csdn.net/download/Android_Cll/91764395)3.application實例化4.activity實例化5.下載網絡文件6.PreviewA…

基于微信小程序的化妝品成分查詢系統源碼

源碼題目&#xff1a;基于微信小程序的化妝品成分查詢系統源碼?? 文末聯系獲取&#xff08;含源碼、技術文檔&#xff09;博主簡介&#xff1a;10年高級軟件工程師、JAVA技術指導員、Python講師、文章撰寫修改專家、Springboot高級&#xff0c;歡迎高校老師、同行交流合作。畢…

STM32 啟動執行邏輯與代碼燒入方法詳解:從底層原理到實操落地

STM32 啟動執行邏輯與代碼燒入方法詳解&#xff1a;從底層原理到實操落地背景概要STM32啟動和執行的核心邏輯鏈條代碼燒入到STM32的途徑方法結束語背景概要 在學習STM32時候我們知道代碼需要通過一些下載器&#xff08;如ST-Link、J-Link&#xff09;或者串口下載燒入到STM32芯…

Go對接印度股票數據源指南:使用StockTV API

一、StockTV API簡介 StockTV提供全球200國家的實時金融數據&#xff0c;覆蓋股票、外匯、期貨和加密貨幣市場。針對印度市場&#xff08;國家ID14&#xff09;&#xff0c;其主要優勢包括&#xff1a; 毫秒級低延遲響應7x24小時穩定服務日均處理億級數據免費技術支持 官方資源…

ESP8266:Arduino學習

ESP8266一&#xff1a;環境搭建使用Ardino框架&#xff0c;在官網下載&#xff0c;下載離線的支持包二&#xff1a;實現簡單的項目1. 點燈{pinMode(LED_PIN, OUTPUT); // 設置引腳為輸出模式digitalWrite(LED_PIN, HIGH); // 點亮 LED}I/O引腳的三種模式分別為&#xff1a;INPU…

青少年軟件編程(python六級)等級考試試卷-客觀題(2023年3月)

更多內容和歷年真題請查看網站&#xff1a;【試卷中心 -----> 電子學會 ----> 機器人技術 ----> 六級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 青少年軟件編程&#xff08;python六級&#xff09;等級考試試卷-客觀題&#xff08;2023年3月&#xff09…

mongodb influxdb

、您需要提前配置 MongoDB 和 InfluxDB。讓我幫您說明配置步驟&#xff1a; MongoDB 配置 啟動 MongoDB 容器后&#xff0c;進入容器創建數據庫&#xff1a; # 進入 MongoDB 容器 docker exec -it mongo mongosh -u root -p 123456# 創建 product 數據庫 use product# 創建集合…

模擬電路中什么時候適合使用電流傳遞信號,什么時候合適使用電壓傳遞信號

一、應用 1.實際應用中&#xff0c;需要進行權衡&#xff0c;比如抗干擾能力&#xff0c;傳輸距離&#xff0c;功耗 2.電壓信號比較容易受到干擾&#xff0c;對噪聲比較敏感&#xff0c;有噪聲容限一說 3.電流信號對噪聲不敏感 4.電源電壓下降的穩定性或者長距離傳輸中的損耗問…

Flink2.0學習筆記:使用HikariCP 自定義sink實現數據庫連接池化

stevensu1/EC0823: Flink2.0學習筆記&#xff1a;使用HikariCP 自定義sink實現數據庫連接池化 在 Flink 流處理應用中使用 HikariCP 實現數據庫連接池化&#xff0c;對于寫入關系型數據庫&#xff08;如 MySQL、PostgreSQL&#xff09;的 自定義 Sink 來說&#xff0c;不僅是推…

Ubuntu安裝及配置Git(Ubuntu install and config Git Tools)

Setup Git sudo apt update sudo apt install git // 查看git版本 git --versionConfig Github // 不清楚username和email的可以直接在github網站上點擊頭像選擇settings來查看 git config --global user

將C++資源管理測試框架整合到GitLab CI/CD的完整實踐指南

將C資源管理測試框架整合到GitLab CI/CD的完整實踐指南 摘要 本文深入探討了如何將先進的C資源管理測試框架無縫集成到GitLab CI/CD流水線中&#xff0c;實現自動化資源監控、性能回歸檢測和高質量測試。通過實際案例和最佳實踐&#xff0c;展示了如何構建一個能夠精確控制CPU親…

Web漏洞

一、Sql注入 sql注入漏洞的成因是由于后端數據庫查詢語句沒有做過濾導致了前端輸入字符串可以直接拼接到語句而獲取數據庫信息。 1.類型 數字型和字符型 區分&#xff1a;數字型可以進行加減運算&#xff0c;id11會獲取id2的信息&#xff0c;而字符型只會獲取1的數據 2.方…

Java中使用Spring Boot+Ollama構建本地對話機器人

目錄結構Ollama是什么安裝 Ollama下載大模型運行模型Java和IDEA版本創建一個springboot項目創建一個簡單的對話接口啟動spring boot流式對話輸出用原生 HTML 打造可交互前端接入 OpenAI、DeepSeek 等云模型&#xff08;可選&#xff09;原文地址傳送門 我是想做一個大模型本地部…

學習設計模式《二十四》——訪問者模式

一、基礎概念 訪問者模式的本質是【預留后路&#xff0c;回調實現】。仔細思考訪問者模式&#xff0c;它的實現主要是通過預先定義好調用的通路&#xff0c;在被訪問的對象上定義accept方法&#xff0c;在訪問者的對象上定義visit方法&#xff1b;然后在調用真正發生的時候&…

Rust 符號體系全解析:分類、應用與設計意圖

Rust 的符號體系是其語法規則、內存安全與類型安全設計的核心載體。每個符號不僅承擔特定功能&#xff0c;更隱含 Rust 對 “安全” 與 “表達力” 的平衡邏輯。本文按功能維度&#xff0c;系統梳理 Rust 中所有常用符號&#xff0c;結合代碼示例與設計背景&#xff0c;提供全面…

神經網絡|(十六)概率論基礎知識-伽馬函數·上

【1】引言 前序學習進程中&#xff0c;對經典的二項分布和正態分布已經有一定的掌握。 今天為學習一種稍顯復雜的分布提前布局一下&#xff0c;學習伽馬函數。 【2】伽馬函數 伽馬函數有兩種經典寫法&#xff0c;一種是積分形式&#xff0c;另一種是無窮乘積形式。 【2.1】…

安全向量模板類SiVector

實現一個安全向量模板類 SiVector&#xff0c;其設計目標是&#xff1a;在保持 std::vector 易用性的基礎上&#xff0c;增強越界訪問的安全性&#xff08;避免崩潰&#xff09;&#xff0c;同時兼容 std::vector 的核心接口和使用習慣。支持嵌套使用&#xff08;如 SiVector&l…

Cloudflare 推出 GenAI 安全工具,守護企業數據

8 月 26 日,Cloudflare 為其企業平臺 Cloudflare One 推出了新的安全功能,幫助企業安全地采用 ChatGPT、Claude 和 Gemini 等生成式 AI 工具。該工具構建為云訪問安全代理 (CASB),通過 API 集成來監控和保護這些 AI 服務,無需安裝設備。 隨著企業對 GenAI 的使用激增——C…

Mac測試端口連接的幾種方式

在 macOS 上測試端口是否開放&#xff0c;可通過以下三種常用方法實現&#xff08;推薦優先使用系統自帶的 nc 命令&#xff0c;簡單高效&#xff09;&#xff1a;方法 1&#xff1a;用系統自帶 nc&#xff08;netcat&#xff09;測試&#xff08;最推薦&#xff09;nc 是 macO…

用PyTorch實現多類圖像分類:從原理到實際操作

引言 圖像分類作為計算機視覺的基石&#xff0c;已深度滲透到我們生活的方方面面——從醫療影像中早期腫瘤的識別、自動駕駛汽車對道路元素的實時檢測&#xff0c;到衛星圖像的地形分析與零售行業的商品識別&#xff0c;其核心都是讓機器學會"看懂"世界并做出分類決…