MyBatis注解開發增刪改查基礎篇

????????本文是MyBatis注解開發的基礎篇,將通過實際場景,詳細介紹MyBatis注解式開發的使用,這是MyBatis很強大的一個特性,可以直接在接口方法上定義 SQL 語句,從而實現數據庫的增刪改查操作。

本文目錄

    • 一、環境依賴
    • 二、創建對應實體類
    • 三、映射接口
    • 四、復雜查詢與動態SQL

一、環境依賴

在開發之前,需要確保環境pom.xml中添加了MyBatis相關依賴。

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency>

同時,需要在 application.properties 中配置數據庫連接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/shop
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver



二、創建對應實體類

使用Mybatis操作數據庫,是要創建數據表對應的實體類的,這也是其優點之一。

package com.example.ecommerce.entity;public class Product {private Long id;private String name;private double price;private int stock;public Product() {}public Product(String name, double price, int stock) {this.name = name;this.price = price;this.stock = stock;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public int getStock() {return stock;}public void setStock(int stock) {this.stock = stock;}@Overridepublic String toString() {return "Product{" +"id=" + id +", name='" + name + '\'' +", price=" + price +", stock=" + stock +'}';}
}



三、映射接口

創建一個映射接口,使用MyBatis注解來定義對應的增刪改查操作的SQL語句即可,這樣可以避免我們還要寫對應xml文件,同時也可以避免出現文件掃描不到的問題。

需要使用到如下注解:

  • @Mapper:用于標記該接口為MyBatis的映射接口,讓Spring能夠自動掃描并注冊。

以下幾個注解,可以直接在接口方法上定義 SQL 語句,從而實現數據庫的增刪改查操作:

  • @Insert:用于定義插入操作的SQL語句。@Options 注解用于指定是否使用自動生成的主鍵,并指定主鍵屬性。
  • @Select:用于定義查詢操作的SQL語句。
  • @Results:用于手動指定結果集的映射關系。@Result 注解用于指定實體類屬性和數據庫表列的對應關系,定義之后,會將查詢字段賦值到對應的類字段上。
  • @Update:用于定義更新操作的 SQL 語句。
  • @Delete:用于定義刪除操作的 SQL 語句。
package com.example.ecommerce.mapper;import com.example.ecommerce.entity.Product;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface ProductMapper {// 新增商品@Insert("INSERT INTO product (name, price, stock) VALUES (#{name}, #{price}, #{stock})")@Options(useGeneratedKeys = true, keyProperty = "id")int insertProduct(Product product);// 根據ID查詢商品@Select("SELECT * FROM product WHERE id = #{id}")@Results({@Result(property = "id", column = "id"),@Result(property = "name", column = "name"),@Result(property = "price", column = "price"),@Result(property = "stock", column = "stock")})Product selectProductById(Long id);// 查詢所有商品@Select("SELECT * FROM product")@Results({@Result(property = "id", column = "id"),@Result(property = "name", column = "name"),@Result(property = "price", column = "price"),@Result(property = "stock", column = "stock")})List<Product> selectAllProducts();// 更新商品信息@Update("UPDATE product SET name = #{name}, price = #{price}, stock = #{stock} WHERE id = #{id}")int updateProduct(Product product);// 根據ID刪除商品@Delete("DELETE FROM product WHERE id = #{id}")int deleteProductById(Long id);
}

如上,定義完成之后,就可以直接在對應的Service中調用了。



四、復雜查詢與動態SQL

上面的是比較基礎的增刪改查,當我們有復雜的動態SQL可以使用如下幾個注解@SelectProvider、@InsertProvider、@UpdateProvider 和 @DeleteProvider 來動態生成SQL語句。

使用 @SelectProvider 進行動態查詢示例:

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import java.util.List;@Mapper
public interface ProductMapper {@SelectProvider(type = ProductSqlProvider.class, method = "selectProductsByCondition")@Results({@Result(property = "id", column = "id"),@Result(property = "name", column = "name"),@Result(property = "price", column = "price"),@Result(property = "stock", column = "stock")})List<Product> selectProductsByCondition(@Param("name") String name, @Param("minPrice") Double minPrice, @Param("maxPrice") Double maxPrice);
}class ProductSqlProvider {public String selectProductsByCondition(String name, Double minPrice, Double maxPrice) {StringBuilder sql = new StringBuilder("SELECT * FROM product WHERE 1 = 1");if (name != null && !name.isEmpty()) {sql.append(" AND name LIKE CONCAT('%', #{name}, '%')");}if (minPrice != null) {sql.append(" AND price >= #{minPrice}");}if (maxPrice != null) {sql.append(" AND price <= #{maxPrice}");}return sql.toString();}
}



← 上一篇 Java進階——常用類及常用方法詳解
記得點贊、關注、收藏哦!
下一篇 Java進階——數組超詳細整理 →

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

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

相關文章

周末總結(2024/04/05)

工作 人際關系核心實踐&#xff1a; 要學會隨時回應別人的善意&#xff0c;執行時間控制在5分鐘以內 堅持每天早會打招呼 遇到接不住的話題時拉低自己&#xff0c;抬高別人(無陰陽氣息) 朋友圈點贊控制在5min以內&#xff0c;職場社交不要放在5min以外 職場的人際關系在面對利…

【HTML】純前端網頁小游戲-戳破彩泡

分享一個簡單有趣的網頁小游戲 - 彩色泡泡爆破。玩家需要點擊屏幕上隨機出現的彩色泡泡來得分。 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…

如何實現單例模式?

一、模式定義與核心價值 單例模式&#xff08;Singleton Pattern&#xff09;是一種創建型設計模式&#xff0c;保證一個類僅有一個實例&#xff0c;并提供全局訪問點。其核心價值在于&#xff1a; ??資源控制??&#xff1a;避免重復創建消耗性資源&#xff08;如數據庫連…

Three.js 系列專題 1:入門與基礎

什么是 Three.js? Three.js 是一個基于 WebGL 的 JavaScript 庫,它簡化了 3D 圖形編程,讓開發者無需深入了解底層 WebGL API 就能創建復雜的 3D 場景。它廣泛應用于網頁游戲、可視化、虛擬現實等領域。 學習目標 理解 Three.js 的核心組件:場景(Scene)、相機(Camera)…

藍橋云客---藍橋速算

3.藍橋速算【算法賽】 - 藍橋云課 問題描述 藍橋杯大賽最近新增了一項娛樂比賽——口算大賽&#xff0c;目的是測試選手的口算能力。 比賽規則如下&#xff1a; 初始給定一個長度為 N 的數組 A&#xff0c;其中第 i 個數字為 Ai?。隨后數組會被隱藏&#xff0c;并進行 Q 次…

Oracle遷移達夢遇中斷?試試SQLark的斷點續遷功能!

在企業級數據遷移項目中&#xff0c;如果遷移單表數據量超過億行、占用空間超過100GB時&#xff0c;一旦遇到網絡中斷或遷移報錯&#xff0c;往往需要整表重新遷移&#xff0c;導致效率低下&#xff0c;嚴重影響項目進度。針對這一痛點&#xff0c;SQLark 支持對 Oracle→DM 的…

【C/C++算法】藍橋杯之遞歸算法(如何編寫想出遞歸寫法)

緒論&#xff1a;沖擊藍橋杯一起加油&#xff01;&#xff01; 每日激勵&#xff1a;“不設限和自我肯定的心態&#xff1a;I can do all things。 — Stephen Curry” 緒論?&#xff1a; ———————— 早關注不迷路&#xff0c;話不多說安全帶系好&#xff0c;發車啦&am…

[ctfshow web入門] web5

前置知識 引用博客&#xff1a;phps的利用 當服務器配置了 .phps 文件類型時&#xff0c;訪問 .phps 文件會以語法高亮的形式直接顯示 PHP 源代碼&#xff0c;而不是執行它。.phps被作為輔助開發者的一種功能&#xff0c;開發者可以通過網站上訪問xxx.phps直接獲取高亮源代碼 …

day 8 TIM定時器

一、STM32 定時器概述 1. 定時器的概述定時器的基本功能&#xff0c;但是 STM32 的定時器除了具有定時功能之外&#xff0c;也具有定時器中斷功能&#xff0c;還具有輸入捕獲&#xff08;檢測外部信號&#xff09;以及輸出比較功能&#xff08;輸出不同的脈沖&#xff09;&…

Spring Boot 中使用 Redis:從入門到實戰

&#x1f31f; 前言 歡迎來到我的技術小宇宙&#xff01;&#x1f30c; 這里不僅是我記錄技術點滴的后花園&#xff0c;也是我分享學習心得和項目經驗的樂園。&#x1f4da; 無論你是技術小白還是資深大牛&#xff0c;這里總有一些內容能觸動你的好奇心。&#x1f50d; &#x…

hi3516cv610通過menuconfig關閉的宏記錄

hi3516cv610通過menuconfig關閉的宏記錄 defconfig為 hi3516cv610_debug_defconfig或hi3516cv610_new_defconfig 1、 變為 2、 變為 3、 變為 4、 變為 5、 變為

WebSocket 詳解:構建一個復雜的實時聊天應用

文章目錄 一、前言二、WebSocket 基礎2.1 WebSocket 與 HTTP 的區別2.2 WebSocket 的優點 三、搭建 WebSocket 服務端3.1 安裝 ws 和 redis 庫3.2 創建 WebSocket 服務端3.3 創建用戶身份驗證 四、前端實現 WebSocket 客戶端4.1 創建 Vue 3 項目4.2 實現 WebSocket 連接和用戶注…

【JavaEE進階】Spring AOP入門

歡迎關注個人主頁&#xff1a;逸狼 創造不易&#xff0c;可以點點贊嗎 如有錯誤&#xff0c;歡迎指出~ AOP是Spring框架的第??核?(第??核?是 IoC) 什么是AOP&#xff1f; ? AspectOrientedProgramming&#xff08;?向切?編程&#xff09; 什么是?向切?編程呢? 切…

算法思想之雙指針(一)

歡迎拜訪&#xff1a;霧里看山-CSDN博客 本篇主題&#xff1a;算法思想之雙指針(一) 發布時間&#xff1a;2025.4.4 隸屬專欄&#xff1a;算法 目錄 雙指針算法介紹對撞指針&#xff1a;快慢指針&#xff1a; 例題移動零題目鏈接題目描述算法思路代碼實現 復寫零題目鏈接題目描…

【11408學習記錄】英語寫作黃金模板+語法全解:用FTC數據泄漏案掌握書信結構與長難句拆解(附思維導圖)

2025.04.04 英語寫作書信寫作第一段私人信件公務信函 語法總結——簡單句簡單句的核心&#xff1a;謂語動詞的變化詞性的拓展限定詞 形容詞與副詞介詞短語 成分的擴展同位語插入語 非謂語動詞 每日一句詞匯 第一步&#xff1a;辨別第二步&#xff1a;斷開第三步&#xff1a;簡化…

手機顯示5GA圖標的條件

最近有星友問在什么情況下才能顯示5G-A&#xff1f;雖然這個我也不知道&#xff0c;但是我有幾個運營商的5G終端白皮書&#xff0c;從上面就可以找到答案。 如上是幾個運營商顯示5G-A的條件&#xff0c;基本上考慮的都是3CC的情況&#xff0c;聯通還有考慮200M CA 2CC的場景&am…

網絡:華為數通HCIA學習:IP路由基礎

華為HCIA學習 IP路由基礎路由協議或路由種類以及對應路由的優先級按工作區域分類&#xff1a;按工作機制及算法分類&#xff1a;路由的優先級路由器選擇最優路由的順序是什么? 前言自治系統LAN和廣播域路由選路IP路由表路由度量建立路由表最長匹配原則路由器轉發數據包總結 IP…

Docker 鏡像相關的基本操作

一、Docker 鏡像基本操作 1. 查找鏡像 命令&#xff1a; docker search <鏡像名稱> 示例&#xff1a;查找 CentOS 鏡像&#xff1a; docker search centos 命令解釋&#xff1a; 默認從 Docker Hub 官方倉庫上搜索鏡像。搜索結果包含多個列&#xff1a; NAME&…

Linux文件特殊權限管理及進程和線程

acl 權限優先級 擁有者 > 特殊指定用戶 > 權限多的組 >權限少的組 > 其他 mask閾值 mask是能夠賦予指定用戶權限的最大閥值 當設定完畢文件的acl列表之后用chmod縮小了文件擁有組的權力 mask會發生變化 恢復&#xff1a; setfacl -m m: 權限 :rwx 文件/…

NVIDIA AgentIQ 詳細介紹

NVIDIA AgentIQ 詳細介紹 1. 引言 NVIDIA AgentIQ 是一個靈活的庫&#xff0c;旨在將企業代理&#xff08;無論使用何種框架&#xff09;與各種數據源和工具無縫集成。通過將代理、工具和代理工作流視為簡單的函數調用&#xff0c;AgentIQ 實現了真正的可組合性&#xff1a;一…