Spring Boot + MyBatis-Plus 的現代開發模式

之前的Maven項目和本次需要的環境配置并不一樣

之前使用的是:

  • 傳統的 MyBatis 框架(非 Spring Boot 環境)

  • 手動管理 SqlSession

  • 使用了 .xml 的 Mapper 映射文件

  • 沒有 Spring 容器管理(沒有 @Service / @RestController 等)

  • 沒有看到分頁插件配置,也沒有 REST 接口入口

項目結構對比你現在的項目實驗要求的項目
框架風格手動搭建的原生 MyBatisSpring Boot 自動化集成
Mapper 類型接口 + XML接口繼承 BaseMapper(少量或無 XML)
SqlSession手動獲取和關閉Spring 管理,自動注入 Mapper
事務控制手動 commit使用 Spring 的 @Transactional 管理
分頁插件沒有集成插件要集成 MyBatis-Plus 分頁插件
接口風格控制臺輸出使用 @RestController 提供 REST API
調試方式控制臺 + main 方法測試使用 Postman 測試 API 接口

添加 依賴項

依賴名稱作用
Spring Web用來寫 REST API 接口,也就是你要用 Postman 調的接口
MyBatis Plus是 MyBatis 的增強版,提供了分頁插件、條件構造器、簡化 DAO 寫法
MySQL Driver數據庫驅動,讓 Java 項目能連接你本地的 MySQL 數據庫
Lombok簡化實體類寫法,比如 @Data 自動生成 getter/setter,不用手寫

MyBatis Plus會發現并沒有找到

可能用的是 國內 Spring Initializr 鏡像站(start.spring.io 國內版),它沒集成 MyBatis-Plus 官方模塊。這時我們用手動方式加上去就行:

? 添加 MyBatis-Plus 的方式

完成創建項目后,在 pom.xml 中手動添加以下依賴:

<!-- MyBatis-Plus 核心依賴 -->
<dependency>
? ? <groupId>com.baomidou</groupId>
? ? <artifactId>mybatis-plus-boot-starter</artifactId>
? ? <version>3.5.3.1</version>
</dependency>
添加后點擊 IDEA 右上角的 Maven 小象圖標 → Reimport,讓它下載依賴。

先MySQL中建立數據庫

CREATE DATABASE product_db DEFAULT CHARACTER SET utf8mb4;USE product_db;CREATE TABLE product (id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL,category_level1 VARCHAR(50),category_level2 VARCHAR(50),category_level3 VARCHAR(50),brand VARCHAR(50),price DECIMAL(10, 2)
);

配置 application.properties

spring.application.name=product-service
#這個是 Spring Boot 給你的服務起個名字,比如后續你如果集成了日志系統、監控平臺、微服務等,它就能顯示“是誰”在運行。
#? 這個對本地調試沒影響,可以留著,也可以刪,不影響實驗內容。

設置端口號

server.port=8080
表示你的服務啟動后監聽 http://localhost:8080,是 Postman 訪問接口的基礎。

數據庫連接配置

spring.datasource.url=jdbc:mysql://localhost:3306/product_db?useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

MyBatis-Plus 設置

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
讓你在控制臺中看到執行的 SQL,非常適合調試查詢條件對不對。

spring.application.name=product-serviceserver.port=8080spring.datasource.url=jdbc:mysql://localhost:3306/product_db?useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Drivermybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

最后點擊運行ProductServiceApplication.java----自動結束,運行失敗

這個問題需要先處理一下------

-----------------------------------------------------------------------------------------全局搜索是Ctrl+Shift+N--

原因是mybatis的版本問題,換到3.5.5就不會出現這個bean的問題了

Started ProductServiceApplication in 1.199 seconds (process running for 1.539)Application availability state ReadinessState changed to ACCEPTING_TRAFFIC

🧩 接下來要做的事(建議順序)

🔧 第 1 步:實體類

  • Product.java → 映射數據庫表字段

(便于 MyBatis-Plus 自動匹配)

  • 保持 Java 字段名和數據庫字段名一致

  • 如果不一致就用 @TableField@TableId 明確指定

package org.example.productservice.entity;import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;import java.math.BigDecimal;@Data
@TableName("product")
public class Product {@TableId("id")private Long id;@TableField("name")private String name;@TableField("category_level1")private String categoryLevel1;@TableField("category_level2")private String categoryLevel2;@TableField("category_level3")private String categoryLevel3;@TableField("brand")private String brand;@TableField("price")private BigDecimal price;
}

配套說明:

  • @TableName("product"):綁定對應的表名

  • @TableField("xxx"):將 Java 命名風格(駝峰)映射到數據庫的下劃線字段

  • @TableId("id"):指定主鍵列

  • BigDecimal:更適合處理 DECIMAL(10, 2) 類型,避免精度丟失

🔧 第 2 步:Mapper 接口

  • ProductMapper.java → 使用 BaseMapper<Product>

package org.example.productservice.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.example.productservice.entity.Product;@Mapper
public interface ProductMapper extends BaseMapper<Product> {
}
  • extends BaseMapper<Product>
    → 讓你繼承了 MyBatis-Plus 提供的所有基礎增刪改查方法(包括分頁、條件構造器)

  • @Mapper
    → 是 MyBatis 要求的注解,告訴 Spring 它是一個 Mapper 接口

  • 不需要自己寫 XML 映射文件了,MyBatis-Plus 自動幫你做了映射!

🔧 第 3 步:Service 層

  • IProductService.java(接口)

package org.example.productservice.service;import com.baomidou.mybatisplus.extension.service.IService;
import org.example.productservice.entity.Product;public interface IProductService extends IService<Product> {
}
  • ProductServiceImpl.java(實現)

package org.example.productservice.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.example.productservice.entity.Product;
import org.example.productservice.mapper.ProductMapper;
import org.example.productservice.service.IProductService;
import org.springframework.stereotype.Service;@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements IProductService {
}

原理說明:

  • IService<Product> 接口:

    提供了更高層級的封裝,比如 getByIdsaveremoveById 等,默認自帶 CRUD

  • ServiceImpl<Mapper, Entity> 實現類:

    自動幫你實現這些方法,不用自己寫 SQL

-----------------

后端結構已經扎實完整,馬上就能提供接口服務了。

🔧 第 4 步:Controller 層

📁 路徑:org.example.productservice.controller

package org.example.productservice.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.example.productservice.entity.Product;
import org.example.productservice.service.IProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api/products")
public class ProductController {@Autowiredprivate IProductService productService;@GetMapping("/page")public Page<Product> getProductPage(@RequestParam(defaultValue = "1") int page,@RequestParam(defaultValue = "10") int size,@RequestParam(required = false) String name) {QueryWrapper<Product> queryWrapper = new QueryWrapper<>();if (name != null && !name.isEmpty()) {queryWrapper.like("name", name);}return productService.page(new Page<>(page, size), queryWrapper);}
}

🔧 第 5 步:分頁插件配置

📁 創建一個配置類:MyBatisPlusConfig.java
路徑:org.example.productservice.config

package org.example.productservice.config;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 MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor paginationInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}

----

此時先暫時嘗試運行項目在idea中

現在雖然邏輯沒寫很多,但只靠你目前寫的代碼:

你已經擁有了分頁、條件查詢、自動封裝結果、返回 JSON 的完整功能

運行后報錯

Spring Boot 升級 3.2 報錯 Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String_invalid value type for attribute 'factorybeanobjec-CSDN博客

需要注意下?Maven?的坐標標識 是mybatis-plus-spring-boot3-starter,這點和SpringBoot 2 的依賴坐標mybatis-plus-boot-starter有所區別。

對于

創建商品處理的業務接口實現類 ProductServiceImpl,完成按商品名稱、多級類別、品牌查詢商品

MyBatis-Plus 自帶的是“基礎查詢”,但你要做復雜查詢邏輯(多條件),就得:

  • 自己在 Controller 里組合 QueryWrapper

  • 或者把邏輯抽出來寫在 ServiceImpl 中(推薦,邏輯更清晰)

總結你現在做的是:

  • ? REST 風格接口設計

  • ? SpringBoot + MyBatisPlus 的現代開發方式

  • ? 使用分層架構(Controller + ServiceImpl + Mapper + Entity)

所以你這叫遵循 REST 風格的分層 Web API 實現,并且是目前企業開發里非常標準的一種寫法。

先暫時用游覽器的url直接訪問

postman暫時還是不方便

records 數組中是空對象 {},說明實體類字段沒被序列化。

接口邏輯是對的,返回結構也有 total 等字段,說明查詢成功。但 records 是空對象 {}

? 最可能原因:

你的 Product 實體類字段沒有加上 getter/setterLombok 注解 @Data,導致無法被 Jackson 序列化為 JSON。

期望結果
{"records": [{"id": 1,"name": "小米電視 4C","categoryLevel1": "家電","categoryLevel2": "電視","categoryLevel3": "智能電視","brand": "小米","price": 2299.00},{"id": 2,"name": "海信電視 H55","categoryLevel1": "家電","categoryLevel2": "電視","categoryLevel3": "液晶電視","brand": "海信","price": 2699.00}],"total": 2,"size": 10,"current": 1,"pages": 1
}

total, size, current, pages 是分頁系統生成的,是 Page<Product> 本身的結構。

🔄 IService 提供的是分頁機制

Page<Product> page = productService.page(new Page<>(page, size), queryWrapper);

的確是lombok的問題,全部手動設置構造函數就解決了

“按商品名稱、多級類別、品牌查詢商品”的業務邏輯

需要修改的類是:ProductServiceImplProductController

QueryWrapper<Product> 是 MyBatis-Plus 提供的條件構造器,用來拼接 SQL 查詢語句。

wrapper.like("name", name) 是模糊查詢(SQL 中的 LIKE '%關鍵詞%')。

wrapper.eq(...) 是精確匹配(SQL 中的 = 值)。

this.page(...) 調用 MyBatis-Plus 提供的分頁查詢方法(自動生成 limit offset 分頁語句)。

👉 為什么寫在 ProductServiceImpl

因為 Service 是 業務邏輯層,用于組織和處理“多個條件組合”的查詢。控制器不直接處理數據拼接,而是委托給 Service 層。

? 二、IProductService:定義接口的契約

目的:明確 ProductService 應該提供哪些方法。

  • 在 Java 中,通過接口來隔離調用者(Controller)與實現者(Impl)。

  • 當 Controller 調用 searchProducts(...),它并不關心方法的具體實現是誰,只要接口定義存在即可。

👉 為什么要定義這個接口?

是為了松耦合:如果將來想換一個查詢邏輯,只需更換 Impl 實現,不必改調用方(Controller)。

? 三、ProductController:暴露查詢接口(給前端或 Postman 測試)

目的:將你定義的查詢功能開放為一個 HTTP 請求入口。

  • @GetMapping("/search") 表示它是一個 GET 請求,路徑為 /api/products/search

  • @RequestParam 是接收 URL 參數的注解,比如 ?name=電視

  • 調用的是 productService.searchProducts(...),把參數傳入,調用你剛實現的業務邏輯。

👉 為什么寫在 Controller?

控制器是Web 層的入口,處理請求參數、調用服務、返回數據。它不直接寫業務細節,而是只負責“調度”。

Alt + Enter 自動導入

使用你在 ProductServiceImpl 里自定義的 searchProducts 方法對商品進行 條件查詢,不用默認的分頁方法名 getProductPage

-----------

完成

postman查詢(游覽器也可以,只不過也是這個更專業一點吧,,目前其實游覽器直接輸入都可以了)

類名作用
Product實體類,對應數據庫字段
ProductMapperMapper接口,繼承自 BaseMapper
IProductService服務接口,繼承 IService,并聲明 searchProducts 方法
ProductServiceImpl服務實現,繼承 ServiceImpl,實現自定義搜索邏輯
ProductController控制器,定義 /page/search 兩個查詢接口

重點接口功能

/api/products/page
  • 基礎分頁查詢,支持按 name 模糊搜索(如:?name=小米

/api/products/search
  • 高級組合條件查詢:支持傳入 namecategory_level1category_level2category_level3brand

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

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

相關文章

【Quest開發】極簡版!透視環境下摳出身體并能遮擋身體上的服裝

前兩天發了一個很復雜的版本&#xff0c;又鼓搗了一下發現完全沒有必要。我之前的理解有點偏&#xff08;不是錯誤的但用法錯了&#xff09;&#xff0c;但是有一些小伙伴收藏了&#xff0c;害怕里面的某些東西對誰有用&#xff0c;所以寫了一篇新的&#xff0c;前兩步配置環境…

vue 常見ui庫對比(element、ant、antV等)

Element UI 1. 簡介 Element UI 是一個基于 Vue 2 和 Vue 3 的企業級 UI 組件庫&#xff0c;提供了豐富的組件和主題定制功能。官方網站&#xff1a;Element UI 2. 主要特點 豐富的組件&#xff1a;包括表單、表格、布局、導航、彈窗等多種組件。主題定制&#xff1a;支持主…

MATLAB畫一把傘

% 傘的參數num_ribs 5; % 傘骨數量修改為5R 1; % 傘的半徑height 0.5; % 傘的高度handle_length 2; % 傘柄長度semicircle_radius 0.26; % 傘柄末端半圓的半徑% 生成傘葉網格theta linspace(0, 2*pi, 100);phi linspace(0, pi/2, 50);[Theta, Phi] meshgrid(theta, phi…

如何在 Go 中實現各種類型的鏈表?

鏈表是動態內存分配中最常見的數據結構之一。它由一組有限的元素組成&#xff0c;每個元素&#xff08;節點&#xff09;至少占用兩塊內存&#xff1a;一塊用于存放數據&#xff0c;另一塊用于存放指向下一個節點的指針。本文教程將說明在 Go 語言中如何借助指針和結構體類型來…

新一代機載相控陣雷達的發展

相控陣雷達以其優越的性能在軍事領域中有著廣闊的應用前景&#xff0c;但由于復雜的技術、昂貴的造價使其應用范圍還存在一定的局限性。然而&#xff0c;國內外對相控陣技術的研究非常重視&#xff0c;并取得了豐碩的成果。 軍用相控陣雷達主要分為陸基、海基和空基幾種類型。 …

多數元素題解(LC:169)

169. 多數元素 核心思想&#xff08;Boyer-Moore 投票算法&#xff09;&#xff1a; 解題思路&#xff1a;可以使用 Boyer-Moore 投票算法、該算法的核心思想是&#xff1a; 維護一個候選元素和計數器、初始時計數器為 0。 遍歷數組&#xff1a; 當計數器為 0 時、設置當前元…

數據庫 AI 助手測評:Chat2DB、SQLFlow 等工具如何提升開發效率?

一、引言:數據庫開發的 “效率革命” 正在發生 在某互聯網金融公司的凌晨故障現場,資深 DBA 正滿頭大汗地排查一條執行超時的 SQL—— 該語句涉及 7 張核心業務表的復雜關聯,因索引缺失導致全表掃描,最終引發交易系統阻塞。這類場景在傳統數據庫開發中屢見不鮮:據 Gartne…

【中間件】bthread效率為什么高?

bthread效率為什么更高&#xff1f; 1 基本概念 bthread是brpc中的用戶態線程&#xff08;也可稱為M:N線程庫&#xff09;&#xff0c;目的是&#xff1a;提高程序的并發度&#xff0c;同時降低編碼難度&#xff0c;在多核cpu上提供更好的scalability和cache locality。其采用…

DeepSeek V2:引入MLA機制與指令對齊

長上下文革命:Multi-Head Latent Attention(MLA)機制 傳統 Transformer 的多頭注意力需要緩存所有輸入token的 Key 和 Value,這對長文本推理時的內存開銷極為龐大。DeepSeek V2 針對這一難題提出了“Multi-Head Latent Attention”(MLA)機制。MLA 的核心思想是對多頭注意…

Druid監控sql導致的內存溢出--內存分析工具MemoryAnalyzer(mat)

問題 druid監控sql在網頁端顯示&#xff0c;我的服務插入sql比較大&#xff0c;druid把執行過的sql保存在DruidDataSource類的成員變量JdbcDataSourceStat dataSourceStat&#xff1b; JdbcDataSourceStat類中的LinkedHashMap<String, JdbcSqlStat> sqlStatMap中&#…

《Python實戰進階》No45:性能分析工具 cProfile 與 line_profiler

Python實戰進階 No45&#xff1a;性能分析工具 cProfile 與 line_profiler 摘要 在AI模型開發中&#xff0c;代碼性能直接影響訓練效率和資源消耗。本節通過cProfile和line_profiler工具&#xff0c;實戰演示如何定位Python代碼中的性能瓶頸&#xff0c;并結合NumPy向量化操作…

計算機操作系統知識集合

主要來自小林coding 硬件結構 cpu位寬 如果用 32 位 CPU 去加和兩個 64 位大小的數字&#xff0c;就需要把這 2 個 64 位的數字分成 2 個低位 32 位數字和 2 個高位 32 位數字來計算&#xff0c;先加個兩個低位的 32 位數字&#xff0c;算出進位&#xff0c;然后加和兩個高位…

電機常用易混淆概念說明(伺服、舵機、多輪)

1. 概述 基礎動力需求 &#xff1a;普通電機&#xff08;如水泵、風扇&#xff09;。 高精度控制 &#xff1a;優先伺服系統或伺服電機&#xff08;如數控機床&#xff09;。 微型化場景 &#xff1a;舵機&#xff08;如遙控模型&#xff09;。 移動底盤 &#xff1a;單舵輪成…

進程與線程:04 內核線程

內核級線程概述 上一講我們學習了用戶級線程&#xff0c;了解了其切換和創建方式。用戶級線程切換核心在于從一個棧變為兩個棧&#xff0c;每個線程有自己的棧和線程控制塊&#xff08;tcb&#xff09;&#xff0c;切換時先切換tcb再切換棧&#xff0c;創建時將切換的pc指針放…

信息系統項目管理師-軟考高級(軟考高項)???????????2025最新(六)

個人筆記整理---僅供參考 第六章項目管理概論 6.1PMBOK的發展 6.2項目基本要素 組織過程資產指的是項目上的&#xff0c;國產數據庫的使用----安保和安全指的是環境因素 6.3項目經理的角色 6.4價值驅動的項目管理知識體系

[藍橋杯 2023 國 Python B] 劃分 Java

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int[] arr new int[41];int sum 0;for (int i 1; i < 40; i) {arr[i] sc.nextInt();sum arr[i];}sc.close();int target sum / 2; // 最接近的兩…

Redis05-進階-主從

零、文章目錄 Redis05-進階-主從 1、搭建主從架構 &#xff08;1&#xff09;概述 單節點Redis的并發能力是有上限的&#xff0c;要進一步提高Redis的并發能力&#xff0c;就需要搭建主從集群&#xff0c;實現讀寫分離。 &#xff08;2&#xff09;集群概況 我們搭建的主從…

小結:ipsec-ike

IPSec 手動配置與自動配置&#xff08;IKE動態協商&#xff09; 手動配置IPSec 邏輯圖 #mermaid-svg-eNMnNEwnoTjF8fkV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-eNMnNEwnoTjF8fkV .error-icon{fill:#552222;}…

瀟灑郎: 100% 成功搭建Docker私有鏡像倉庫并管理、刪除鏡像

1、Registry Web管理界面 2、拉取Registry-Web鏡像 創建配置文件 tee /opt/zwx-registry/web-config.yml <<-EOF registry:url: http://172.28.73.90:8010/v2name: registryreadonly: falseauth:enabled: false EOF 拉取docker-registry-web鏡像并綁定Registry倉庫 …

《機器學習中的過擬合與模型復雜性:理解與應對策略》

《機器學習中的過擬合與模型復雜性&#xff1a;理解與應對策略》 摘要 在機器學習中&#xff0c;過擬合是模型在訓練數據上表現良好但在新數據上泛化能力差的現象。本文深入探討了過擬合與模型復雜性之間的關系&#xff0c;分析了復雜模型導致過擬合的原因&#xff0c;并介紹…