SpringBoot 集成Mybatis Plus

一、為什么SpringBoot不推薦使用Mybatis

Spring Boot 不推薦使用 MyBatis,主要源于二者在設計理念、生態融合和開發風格上的差異。Spring Boot 強調“約定優于配置”,追求高效的開發體驗和統一的框架風格。它通過自動配置和依賴注入,將復雜的基礎設施工作隱藏在背后,讓開發者可以專注于業務邏輯。而 MyBatis 更偏向于手動控制,強調 SQL 編寫的靈活性與精確性,這種“顯式配置”的風格在 Spring Boot 的體系中顯得不夠“Spring 化”。

在 Spring Boot 中,JPA(通常基于 Hibernate)得到了默認和深度的支持。它不僅提供了實體類到數據庫表之間的自動映射能力,還能通過接口繼承如 JpaRepository 來實現大部分常見的 CRUD 操作,幾乎不需要寫 SQL。這種面向對象的操作方式非常契合 Spring Boot 的開發理念。而 MyBatis 缺乏這樣的統一接口標準,每一個查詢都必須手動書寫 Mapper 接口和 SQL 映射,導致代碼重復多、維護成本高,不利于構建統一規范的架構。

此外,Spring Boot 的許多生態組件都是圍繞 JPA 構建的。例如 Spring Data、Spring Data REST、Spring Security 等在與 JPA 協同工作時,可以自動識別實體類、權限注解和倉庫接口,實現快速集成與配置。而 MyBatis 在這些方面往往需要額外的手工代碼或第三方擴展來彌補功能差距,使得整個開發過程不夠簡潔和一致。

MyBatis 對復雜 SQL 的支持是它的優勢,但也意味著它無法享受到像 JPA 那樣的自動建表、字段同步、懶加載、級聯操作等特性,這使得在開發初期或者需求頻繁變化的項目中,使用 MyBatis 會顯得繁瑣與低效。同時,它的類型轉換和對象關系映射能力相對較弱,復雜嵌套對象處理起來也需要手動配置,這與 Spring Boot 鼓勵的自動化、低侵入、高復用的理念相悖。

因此,Spring Boot 并不是技術上無法使用 MyBatis,而是在它所倡導的開發模式中,MyBatis 顯得不夠“現代”,不夠“自動”,也不夠“統一”。在快速開發和規范統一的項目場景中,Spring Boot 更愿意推薦使用 JPA 或 Spring Data,只有在 SQL 控制要求高或性能調優需求明顯的項目中,MyBatis 才是一個合適的選擇。這也解釋了為什么 Spring Boot 對 MyBatis 提供了官方 Starter,但始終沒有像支持 JPA 那樣將其設為默認或推薦選項。

二、Mybatis Plus 簡介

MyBatis-Plus 是在 MyBatis 基礎上進行增強的一個持久層框架,旨在簡化 MyBatis 的開發過程,提高效率,降低重復代碼。它并不改變 MyBatis 的核心理念,而是在其上層進行了封裝,使開發者可以更方便地進行 CRUD 操作和復雜查詢。MyBatis 本身需要手動編寫 SQL 和 Mapper 接口,而 MyBatis-Plus 提供了豐富的自動化功能,如內置通用 Mapper、Service、分頁插件、條件構造器等,從而大大減少了模板代碼的數量。

通過集成 MyBatis-Plus,開發者可以僅通過繼承 BaseMapper 接口,立即擁有一整套通用的數據庫操作方法,如 selectById、insert、updateById、deleteById 等,避免了重復的 Mapper 方法定義。此外,它還支持強大的 Lambda 條件構造器,能用鏈式方式編寫類型安全的查詢條件,提升代碼可讀性和可維護性。MyBatis-Plus 還提供分頁插件、樂觀鎖插件、邏輯刪除、SQL 性能分析等實用功能,幫助開發者應對企業級應用中常見的持久層需求。

雖然 MyBatis-Plus 不屬于 Spring Boot 官方推薦的技術棧,但它卻很好地彌補了 MyBatis 開發繁瑣、重復代碼多的問題,使得 MyBatis 在與 Spring Boot 集成時更加現代化和高效。對于那些既想保留 SQL 控制力,又不想從零開始構建 CRUD 接口的團隊來說,MyBatis-Plus 是一個非常實用且易于上手的選擇。它在不改變原有 MyBatis 使用方式的前提下,通過增強功能提升了開發體驗,越來越多的企業項目也因此傾向于在 Spring Boot 中選擇 MyBatis-Plus 作為持久層方案。

三、SpringBoot 集成 Mybatis Plus

1、準備 SpringBoot 項目

創建如上結構

2、導入依賴

<dependencies><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
</dependencies>

3、創建實體類

package com.goose.entity;import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;import java.util.Date;@Data
@AllArgsConstructor
// @Getter
// @Setter
// @ToString
@NoArgsConstructor
public class Teacher {private Integer id;private String name;private String gender;private String subject;@DateTimeFormat(pattern = "yyyy-MM-dd")private Date hireDate;
}

4、創建好配置文件

application.yml

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSourceurl: jdbc:mysql://localhost:3306/springbootdemousername: rootpassword: 123456# 配置MyBatis日志
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5、創建配置類

package com.goose.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

這個配置類為 MyBatis-Plus 啟用分頁功能,在執行分頁查詢時自動處理?LIMIT?語句等邏輯,無需手寫 SQL 來分頁。

6、創建mapper 接口

package com.goose.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.goose.entity.Teacher;
import org.springframework.stereotype.Repository;@Repository
public interface TeacherMapper extends BaseMapper<Teacher> {}

7、安裝 lombok 插件

File——Settings——Plugins

搜索找到 lombok 插件,下載安裝后,重啟 IDE

?

Lombok 是一個 Java 編譯器級別的工具庫,它的作用是通過注解的方式,自動為 Java 類生成常見的樣板代碼,如 getter、setter、構造函數、toString、equals、hashCode 等,從而大幅度簡化代碼、提升開發效率、減少冗余。

具體來說,Lombok 插件的主要作用如下:

  • 簡化 Getter/Setter 編寫:使用 @Getter 和 @Setter 注解,可以自動為類的字段生成對應的 getter 和 setter 方法,無需手寫。
  • 自動生成構造函數:@NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor 可以自動生成無參、全參和指定字段的構造函數。
  • 簡化 toString/equals/hashCode 方法:使用 @ToString、@EqualsAndHashCode 注解后,不再需要手動重寫這些方法。
  • 簡化 Builder 模式編寫:@Builder 可以自動實現鏈式調用構建對象的方式,適用于構造參數多的類。
  • 提供 Data 注解一站式生成常見方法:@Data 相當于同時加上 @Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor,是實體類開發中非常常用的注解。
  • 簡化日志對象創建:@Slf4j、@Log4j 等注解可以自動為類生成對應類型的日志對象。

Lombok 插件的運行機制是在編譯期通過注解處理器修改字節碼,并不會在源碼中直接生成方法,因此你看不到生成的 getter/setter,但它們確實存在于最終編譯后的 class 文件中。Ctrl + F12 進行查看

由于它改寫的是編譯行為,所以在 IDEA 中使用時,必須安裝 Lombok 插件并開啟注解處理器,否則會出現提示找不到方法的錯誤。

8、創建數據庫表

生成測試數據

9、編寫測試類

簡單的CRUD操作可以不用再自己編寫SQL,直接調用BaseMapper 中的方法即可。

這里直接使用持久層進行注入,不涉及到頁面的使用

package com.goose;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.goose.entity.Teacher;
import com.goose.mapper.TeacherMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.text.SimpleDateFormat;
import java.util.*;@SpringBootTest
class MybatisDemo1ApplicationTests {@Autowiredpublic TeacherMapper teacherMapper;@Testpublic void findAll() {teacherMapper.selectList(null).forEach(System.out::println);}/* 插入實體對象*/@Testpublic void insert() {Date now = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");simpleDateFormat.format(now);Teacher teacher = new Teacher();teacher.setName("李華");teacher.setGender("male");teacher.setSubject("化學");teacher.setHireDate(now);teacherMapper.insert(teacher);}/* 根據主鍵id刪除一條數據*/@Testpublic void deleteById() {teacherMapper.deleteById(16);}/* 傳入實體數據,根據實體中的數據進行刪除*/@Testpublic void deleteById_Entity() {Teacher teacher = new Teacher();teacher.setId(18);teacherMapper.deleteById(teacher);}@Testpublic void deleteByMap() {// string放列名,Object放想要刪除該列中滿足某條件Map<String, Object> map = new HashMap<>();// 這里使用name作為條件map.put("name", "Ivy Ma");map.put("gender", "female");// 刪除所有name 為 Ivy Ma 的教師// 可以多行刪除,但是不會操作具有外鍵約束的內容// DELETE FROM teacher WHERE gender = ? AND name = ?teacherMapper.deleteByMap(map);}@Testpublic void delete() {QueryWrapper<Teacher> teacherQueryWrapper = new QueryWrapper<>();// eq應該是等于的,le應該是小于,ge應該是大于// teacherQueryWrapper.eq("name","Queena");// DELETE FROM teacher WHERE (name = ?)// teacherMapper.delete(teacherQueryWrapper);teacherQueryWrapper.eq("name", "Queena");teacherQueryWrapper.eq("subject", "Biology");// DELETE FROM teacher WHERE (name = ? AND subject = ?)teacherMapper.delete(teacherQueryWrapper);}@Testpublic void deleteBathIds() {List<Integer> list = new ArrayList<>();list.add(14);list.add(22);list.add(6);list.add(18);// ==>  Preparing: DELETE FROM teacher WHERE id IN ( ? , ? , ? , ? )// ==> Parameters: 14(Integer), 22(Integer), 6(Integer), 18(Integer)teacherMapper.deleteBatchIds(list);}@Testpublic void update() {Teacher teacher = new Teacher();teacher.setId(21);teacher.setSubject("English");teacher.setGender("male");// 傳入的對象需要主鍵// ==>  Preparing: UPDATE teacher SET gender=?, subject=? WHERE id=?// ==> Parameters: male(String), English(String), 21(Integer)teacherMapper.updateById(teacher);}@Testpublic void updateBy() {QueryWrapper<Teacher> teacherQueryWrapper = new QueryWrapper<>();teacherQueryWrapper.eq("subject", "English");Teacher teacher = new Teacher();teacher.setGender("female");// ==>  Preparing: UPDATE teacher SET gender=? WHERE (subject = ?)// ==> Parameters: female(String), English(String)teacherMapper.update(teacher, teacherQueryWrapper);}@Testpublic void selectById() {Teacher teacher = teacherMapper.selectById(32);// ==>  Preparing: SELECT id,name,gender,subject,hire_date FROM teacher WHERE id=?// ==> Parameters: 32(Integer)System.out.println(teacher);}@Testpublic void selectBatchIds() {List<Integer> list = new ArrayList<>();list.add(34);list.add(42);list.add(26);list.add(38);// ==>  Preparing: SELECT id,name,gender,subject,hire_date FROM teacher WHERE id IN ( ? , ? , ? , ? )// ==> Parameters: 34(Integer), 42(Integer), 26(Integer), 38(Integer)List<Teacher> teachers = teacherMapper.selectBatchIds(list);System.out.println(teachers);}@Testpublic void selectByMap(){Map<String, Object> map = new HashMap<>();map.put("gender","male");map.put("subject","Chemistry");// ==>  Preparing: SELECT id,name,gender,subject,hire_date FROM teacher WHERE gender = ? AND subject = ?// ==> Parameters: male(String), Chemistry(String)List<Teacher> teachers = teacherMapper.selectByMap(map);System.out.println(teachers);}@Testpublic void selectOne(){QueryWrapper<Teacher> teacherQueryWrapper = new QueryWrapper<>();teacherQueryWrapper.eq("name","Jason");// 只能查一條數據,數據多于一條,拋出錯誤,查詢條件比較嚴格Teacher teacher = teacherMapper.selectOne(teacherQueryWrapper);System.out.println(teacher);}@Testpublic void exist(){QueryWrapper<Teacher> teacherQueryWrapper = new QueryWrapper<>();teacherQueryWrapper.eq("subject","Chemistry");// ==>  Preparing: SELECT COUNT( * ) FROM teacher WHERE (subject = ?)boolean exists = teacherMapper.exists(teacherQueryWrapper);System.out.println(exists);}@Testpublic void selectCount(){QueryWrapper<Teacher> teacherQueryWrapper = new QueryWrapper<>();teacherQueryWrapper.eq("gender","female");// ==>  Preparing: SELECT COUNT( * ) FROM teacher WHERE (gender = ?)// ==> Parameters: female(String)Long aLong = teacherMapper.selectCount(teacherQueryWrapper);System.out.println(aLong);}@Testpublic void selectList(){QueryWrapper<Teacher> teacherQueryWrapper = new QueryWrapper<>();teacherQueryWrapper.eq("gender","female");// ==>  Preparing: SELECT id,name,gender,subject,hire_date FROM teacher WHERE (gender = ?)// ==> Parameters: female(String)List<Teacher> teachers = teacherMapper.selectList(teacherQueryWrapper);System.out.println(teachers);}@Testpublic void selectMaps(){QueryWrapper<Teacher> teacherQueryWrapper = new QueryWrapper<>();teacherQueryWrapper.eq("gender","female");// ==>  Preparing: SELECT id,name,gender,subject,hire_date FROM teacher WHERE (gender = ?)// ==> Parameters: female(String)List<Map<String, Object>> maps = teacherMapper.selectMaps(teacherQueryWrapper);// 把每個Teacher對象拆開了,拆成單獨的map對象System.out.println(maps);}@Testpublic void selectObjs(){QueryWrapper<Teacher> teacherQueryWrapper = new QueryWrapper<>();teacherQueryWrapper.eq("gender","female");// ==>  Preparing: SELECT id,name,gender,subject,hire_date FROM teacher WHERE (gender = ?)// ==> Parameters: female(String)List<Object> objects = teacherMapper.selectObjs(teacherQueryWrapper);// [1, 3, 4, 5, 7, 9, 11, 13, 15, 19, 20, 21, 23, 25, 27, 29, 31, 33, 35, 37, 38, 39, 41, 43, 45, 47, 49]// 只返回第一個字段的值System.out.println(objects);}@Testpublic void testSelectPage() {// 創建分頁對象:第1頁,每頁5條記錄Page<Teacher> page = new Page<>(1, 5);// 構造查詢條件:只查 gender = 'female'QueryWrapper<Teacher> wrapper = new QueryWrapper<>();wrapper.eq("gender", "female");// 執行分頁查詢Page<Teacher> resultPage = teacherMapper.selectPage(page, wrapper);// 打印分頁結果System.out.println("總記錄數: " + resultPage.getTotal());System.out.println("總頁數: " + resultPage.getPages());System.out.println("當前頁數據:");resultPage.getRecords().forEach(System.out::println);}@Testpublic void testSelectMapsPage() {// 分頁參數Page<Map<String, Object>> page = new Page<>(1, 5);// 查詢條件:查 subject = 'Math'QueryWrapper<Teacher> wrapper = new QueryWrapper<>();wrapper.eq("subject", "Math");// 分頁查詢返回 Map 列表Page<Map<String, Object>> resultPage = teacherMapper.selectMapsPage(page, wrapper);// 打印結果System.out.println("總記錄數: " + resultPage.getTotal());System.out.println("總頁數: " + resultPage.getPages());System.out.println("當前頁 Map 數據:");resultPage.getRecords().forEach(System.out::println);}
}

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

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

相關文章

PI 思維升級 PI設計的典范轉移:從阻抗思維到諧振控制

們先來回想一件事&#xff0c;根據歐姆定律&#xff0c;阻抗是不是越低越好&#xff1f; 代表即使有很大的瞬時電流&#xff0c;瞬間的電壓降也不會超過某個極限&#xff01;理論上是&#xff01; 可是這其實忽略了兩個關鍵的要素&#xff1a;PDN阻抗有諧振&#xff1a;諧振代表…

如何制定企業級服務器安全策略(Security Policy)

制定一套**企業級服務器安全策略&#xff08;Security Policy&#xff09;**對于保護服務器資源、數據安全和業務連續性至關重要。以下是制定安全策略的詳細指南&#xff0c;包括安全策略的核心要素、實施步驟和具體措施&#xff0c;幫助企業構建全面的服務器安全防護體系。1. …

n1 armbian docker compose 部署aipan mysql

apt update apt install docker-compose-plugin -y #安裝docker compose docker compose version Docker Compose version v2.38.2 sudo mkdir -p /sda1/data/mysql/conf.d sudo chown -R 999:999 /sda1/data/mysql # MySQL 用戶 UID 通常為 999 cat docker-compose.yml vers…

RAG情境化分段向量模型voyage-context-3,聚焦分段細節,融入全局文檔上下文

最近看到一個有意思的工作&#xff0c;原文來自&#xff1a; https://blog.voyageai.com/2025/07/23/voyage-context-3/?utm_sourceTWITTER&utm_mediumORGANIC_SOCIAL voyage-context-3&#xff1a;聚焦分段細節&#xff0c;融入全局文檔上下文 概要&#xff1a; Voyage A…

計算機體系結構中的中斷服務程序ISR是什么?

計算機體系結構中的中斷服務程序ISR是什么&#xff1f; 在計算機體系結構中&#xff0c;中斷服務程序&#xff08;Interrupt Service Routine, ISR&#xff09; 是操作系統或硬件直接調用的關鍵代碼模塊&#xff0c;用于響應來自硬件設備、軟件異常或系統事件的中斷信號。其核心…

開源項目XBuilder前端框架

spx-gui/ 配置文件package.json 項目依賴和腳本配置vite.config.ts Vite構建工具配置tsconfig.json TS項目配置主文件tsconfig.app.json 應用程序的TS配置tsconfig.node.json Node.js環境的TS配置index.html 應用入口HTML文件src/ 源碼目錄main.ts 應用入口文件&#xff0c;初始…

0723 單項鏈表

Part 1.完成單向鏈表&#xff0c;并完成下面功能1.單鏈表節點創建鏈表是物理空間上不連續的一個結構&#xff0c;需要創建一個next作為指向下一個節點的指針&#xff0c;所以需要建立一個結構體包含數據域&#xff0c;next指針域&#xff0c;記錄長度的數據域。因為長度只有頭節…

基于 ASP.NET Web 應用程序(.NET Framework)的花店系統

1.1功能模塊實現1.1.1整體結構界面由兩部分組成&#xff1a;左側導航欄、右側內容展示區。使用了 Bootstrap 5 的樣式庫&#xff0c;并結合了 ASP.NET MVC 的 Html.ActionLink 和 Razor 條件判斷語句來動態生成菜單項。1.1.2導航欄功能模塊導航欄基礎結構導航欄基礎結構使用 Bo…

C++ Qt6 CMake qml文件啟動方式說明

在Qt6之后,Qt程序默認使用CMake進行構建,當然也可以使用qmake, 本篇博客介紹Qt6.8之前和Qt6.8版本中QtQuick程序的啟動方式。 在QtQuick程序main.cpp里qml的文件啟動分為兩種:(1)直接加載qml文件,(2)加載qml模塊,下面分別介紹這兩種啟動方式。 方式1:直接啟動qml文…

字符串 “asdasjkfkasgfgshaahsfaf” 經過哈夫曼編碼之后存儲比特數是多少?

要計算字符串 “asdasjkfkasgfgshaahsfaf” 經過哈夫曼編碼后的存儲比特數&#xff0c;需按以下步驟進行&#xff1a;步驟 1&#xff1a;統計字符出現頻率先統計字符串中每個字符的出現次數&#xff1a;a&#xff1a;出現 6 次s&#xff1a;出現 6 次d&#xff1a;出現 1 次j&a…

什么是游戲盾(高防版)?

隨著網絡游戲產業的快速發展&#xff0c;游戲服務器的安全問題日益受到關注。DDoS攻擊、CC攻擊等網絡威脅常常導致游戲卡頓、斷線甚至服務器宕機&#xff0c;嚴重影響玩家體驗。游戲盾&#xff08;高防版&#xff09;是一種專為游戲業務設計的網絡安全防護服務&#xff0c;集成…

openGauss數據庫在CentOS 7 中的單機部署與配置

部署 版本選擇 通過openGuass官網下載地址 &#xff0c;我們可以看到它支持x86_64與Aarch64兩種平臺&#xff0c;又分成openEuler 22、openEuler 20、Centos 7以及Docker 版本。 進入CentOS 7標簽&#xff0c;看到又分成企業版、輕量版、極簡版與分布式鏡像版。 本文只討論…

HTTP響應狀態碼詳解

HTTP 響應狀態碼&#xff08;HTTP Status Code&#xff09;是服務器在響應客戶端請求時返回的 3 位數字代碼&#xff0c;用于表示請求的處理狀態。以下是常見的 HTTP 狀態碼及其含義&#xff1a; 1xx&#xff08;信息性狀態碼&#xff09; 表示請求已被接收&#xff0c;需要繼…

Pytorch中register_buffer和torch.nn.Parameter的異同

說下register_buffer和Parameter的異同 相同點方面描述追蹤都會被加入 state_dict&#xff08;模型保存時會保存下來&#xff09;。與 Module 的綁定都會隨著模型移動到 cuda / cpu / float() 等而自動遷移。都是 nn.Module 的一部分都可以通過模塊屬性訪問&#xff0c;如 self…

吉吉巳資源整站源碼完整打包,適用于搭建資源聚合/整合類站點,全網獨家,拿來就用

想要搭建一個資源整合站點&#xff0c;如影視聚合類站點、資訊聚合類站點、圖集聚合類站點等&#xff0c;需要花費大量的時間來查找合適的系統或源碼。然后要去測試&#xff0c;修復bug&#xff0c;一直到能夠正常的運營使用&#xff0c;花費的時間絕對不短&#xff0c;今天分享…

嵌入式學習的第三十五天-進程間通信-HTTP

TCP/IP協議模型&#xff1a;應用層&#xff1a;HTTP;傳輸層&#xff1a;TCP UDP;網絡層&#xff1a;IPv4 IPv6網絡接口層一、HTTP協議1. 萬維網WWW(World Wide Web) 世界范圍內的&#xff0c;聯機式的信息儲藏所。 萬維網解決了獲取互聯網上的數據時需要解決的以下問題&#x…

es 和 lucene 的區別

1. Lucene 是“發動機”&#xff0c;ES 是“整車”Lucene&#xff1a;只是一個 Java 庫&#xff0c;提供倒排索引、分詞、打分等底層能力。你必須自己寫代碼處理索引創建、更新、刪除、分片、分布式、故障恢復、API 封裝等所有邏輯。Elasticsearch&#xff1a;基于 Lucene 的分…

AS32S601 系列 MCU芯片GPIO Sink/Source 能力測試方法

一、引言隨著電子技術的飛速發展&#xff0c;微控制器&#xff08;MCU&#xff09;在工業控制、汽車電子、商業航天等眾多領域得到了廣泛應用。國科安芯推出的AS32S601 系列 MCU 以其卓越的性能和可靠性&#xff0c;成為了眾多設計工程師的首選之一。為了確保其在實際應用中的穩…

JAVA-08(2025.07.24學習記錄)

面向對象類package com.mm;public class Person {/*** 名詞-屬性*/String name;int age;double height;/*** 動詞-方法*/public void sleep(String add) {System.out.println("我在" add "睡覺");}public String introduce() {return "我的名字是&q…

地下隧道管廊結構健康監測系統 測點的布設及設備選型

隧道監測背景 隧道所處地下環境復雜&#xff0c;在施工過程中會面臨圍堰變形、拱頂沉降、凈空收斂、初襯應力變化、土體塌方等多種危險情況。在隧道營運過程中&#xff0c;也會受到材料退化、地震、人為破壞等因素影響&#xff0c;引發隧道主體結構的劣化和損壞&#xff0c;若不…