【MyBatis-Plus】一、快速入門

這里寫自定義目錄標題

  • MyBatis-Plus 概述
  • 快速入門
    • 入門案例
    • 常用注解
    • 常見配置

MyBatis-Plus 概述

MyBatis-Plus 簡介

MyBatis-Plus 是在 MyBatis 基礎上開發的一個 增強工具包,它簡化了 MyBatis 的開發,減少了大量重復代碼。它保持了 MyBatis 原有的特性(如靈活的 SQL),同時提供了很多開箱即用的功能。

官網定位是:
👉 只做增強,不做改變

MyBatis-Plus 的優勢:

  1. 無侵入:只需少量配置,幾乎不改變原有項目結構。
  2. CRUD 自動化:內置了大量單表操作方法,幾乎不用寫 Mapper XML。
  3. 條件構造器:通過鏈式調用快速構造 SQL 條件。
  4. 分頁插件:提供強大的分頁功能。
  5. 代碼生成器:自動生成 Entity、Mapper、Service、Controller 等代碼。
  6. 多種內置功能:邏輯刪除、自動填充、樂觀鎖、防全表更新與刪除等。

核心功能:

  1. 通用 CRUD

    只要繼承 BaseMapper<T>,就能使用大量內置方法:

    // 插入
    int insert(T entity);
    // 根據 ID 刪除
    int deleteById(Serializable id);
    // 更新
    int updateById(T entity);
    // 查詢
    T selectById(Serializable id);
    List<T> selectList(Wrapper<T> queryWrapper);
    

    例如:

    @Autowired
    private UserMapper userMapper;@Test
    public void testInsert() {User user = new User();user.setName("Tom");user.setAge(20);userMapper.insert(user); // 自動生成 SQL
    }
    
  2. 條件構造器

    MyBatis-Plus 提供了 QueryWrapperLambdaQueryWrapper 等,簡化條件拼接。

    // 傳統寫法
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.eq("age", 20).like("name", "Tom");
    List<User> list = userMapper.selectList(wrapper);// Lambda 寫法(更安全,避免硬編碼字段名)
    LambdaQueryWrapper<User> lambda = new LambdaQueryWrapper<>();
    lambda.eq(User::getAge, 20).like(User::getName, "Tom");
    List<User> list2 = userMapper.selectList(lambda);
    
  3. 分頁插件

    MyBatis-Plus 內置分頁插件,只需簡單配置:

    IPage<User> page = new Page<>(1, 10); // 第1頁,每頁10條
    IPage<User> result = userMapper.selectPage(page, null);
    
  4. 代碼生成器

    自動生成 實體類、Mapper、Service、Controller,極大提高開發效率。

  5. 常用擴展

    • 邏輯刪除:配置邏輯刪除字段,刪除操作會變成 UPDATE

    • 自動填充:創建時間、更新時間自動填充。

    • 樂觀鎖:防止并發修改數據沖突。

    • 防全表更新刪除:避免誤操作導致數據丟失。


典型使用場景

  • 快速開發業務系統(如管理后臺、信息系統),減少重復寫 SQL。
  • 單表操作頻繁的場景(批量增刪改查)。
  • 結合 Spring Boot 使用,可以做到極簡配置。

和 MyBatis 的區別

特性MyBatisMyBatis-Plus
SQL需要手寫提供大量內置方法,少寫 SQL
插件需要額外集成內置分頁、邏輯刪除、樂觀鎖
代碼生成提供代碼生成器
學習成本靈活但需要大量 SQL兼容 MyBatis,學習成本低

快速入門

入門案例

首先引入 MyBatis-Plus 依賴:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version>
</dependency>

數據庫表結構:

CREATE TABLE `emp` (`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`username` varchar(20) NOT NULL COMMENT '用戶名',`password` varchar(32) DEFAULT '123456' COMMENT '密碼',`name` varchar(10) NOT NULL COMMENT '姓名',`gender` tinyint unsigned NOT NULL COMMENT '性別, 說明: 1 男, 2 女',`job` tinyint unsigned DEFAULT NULL COMMENT '職位, 說明: 1 班主任,2 講師, 3 學工主管, 4 教研主管, 5 咨詢師',`entrydate` date DEFAULT NULL COMMENT '入職時間',`dept_id` int unsigned DEFAULT NULL COMMENT '部門ID',`create_time` datetime NOT NULL COMMENT '創建時間',`update_time` datetime NOT NULL COMMENT '修改時間',PRIMARY KEY (`id`),UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=1983983618 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='員工表'

實體類 Emp:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDate;
import java.time.LocalDateTime;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {private Integer id;private String username;private String password;private String name;private Short gender;private Short job;private LocalDate entrydate;private Integer deptId;private LocalDateTime createTime;private LocalDateTime updateTime;
}

EmpController:

import com.scarletkite.demo2.pojo.Emp;
import com.scarletkite.demo2.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class EmpController {@Autowiredprivate EmpService empService;@PostMapping("/emp")public void addEmp(@RequestBody Emp emp) {empService.addEmp(emp);}
}

EmpService 接口和 EmpServiceImpl 實現類:

// EmpService 接口
import com.scarletkite.demo2.pojo.Emp;public interface EmpService {void addEmp(Emp emp);
}// EmpServiceImpl 實現類
import com.scarletkite.demo2.mapper.EmpMapper;
import com.scarletkite.demo2.pojo.Emp;
import com.scarletkite.demo2.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDate;
import java.time.LocalDateTime;@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic void addEmp(Emp emp) {emp.setEntrydate(LocalDate.now());emp.setUpdateTime(LocalDateTime.now());emp.setCreateTime(LocalDateTime.now());empMapper.insert(emp);}
}

EmpMapper:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.scarletkite.demo2.pojo.Emp;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface EmpMapper extends BaseMapper<Emp> {}

讓自己的 mapper 接口繼承 MyBatis-Plus 提供的 BaseMapper,并指定泛型為對應實體類類型,BaseMapper 中已定義大量增刪改查方法。

這樣就能實現增刪改查的操作,并且原來的 MyBatis 方法仍然生效。

常用注解

MyBatis-Plus 獲取數據庫信息的原理:MyBatis-Plus 通過掃描實體類,基于反射獲取實體類信息作為數據庫表信息,遵循 “約定大于配置” 原則。

MyBatis-Plus 的約定規則:

  • 類名駝峰轉下劃線作為表名;
  • 名為 id 的字段作為主鍵;
  • 變量名駝峰轉下劃線作為表的字段名。

MyBatis-Plus 常用注解包括:

  • @TableName(指定表名稱)
  • @TableId(指定表的主鍵)
  • @TableField(標記表的普通字段信息)

@TableName 注解的使用:當實體類名與表名不一致時,需用 @TableName 的 value 屬性指定真實表名,例如實體類為 Emp,表名為 tb_emp 時,需添加 @TableName (“tb_emp”)

@TableName ("tb_emp")
public class Emp {// ...
}

@TableId 注解的使用及主鍵策略:當主鍵名與 id 不一致或主鍵不叫 id 時,需用 @TableId 的 value 屬性指定主鍵字段名;主鍵策略 IdType 有 AUTO(數據庫自增長)、INPUT(程序員自己輸入)、ASSIGN_ID(MyBatis-Plus 基于雪花算法生成,為 long 型整數,長度 20 位),通過 type 屬性設置(若沒有設置,默認 ASSIGN_ID)

@TableName ("tb_emp")
public class Emp {@TableId(value="id",type=IdType.AUTO)private Integer EmpId;
}

@TableField 注解的使用場景:成員變量名與數據庫字段名不一致時,用 value 屬性聲明真實字段名

@TableName ("tb_emp")
public class Emp {@TableId(value="id",type=IdType.AUTO)private Integer EmpId;@TableField("username")private String name;
}

@TableField 的特殊場景:

  • 以 is 開頭的布爾類型字段,需指定真實字段名;
  • 變量名與數據庫關鍵字沖突時,需加轉義字符;
  • 成員變量不是數據庫字段時,用 exist=false 標記。

常見配置

MyBatis-Plus 支持多種配置,包括繼承自 MyBatis 的原生配置和自身特有的配置:

mybatis-plus:type-aliases-package: com.itheima.mp.domain.pojo # 別名掃描包mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址, 默認值configuration:map-underscore-to-camel-case: true # 是否開啟下劃線和駝峰的映射cache-enabled: false # 是否開啟二級緩存global-config: # 全局配置db-config:id-type: assign_id # id為雪花算法生成update-strategy: not_null # 更新策略: 只更新非空字段
  • 類型別名掃描包配置(typeAliasesPackage):需指定 pojo 實體類的包,作用是在定義 mapper XML 語句時,定義實體類類型可直接用類的簡化名,無需全路徑名
  • mapper XML 文件地址配置(mapperLocation):用于指定 mapper XML 文件的地址,使其中的 SQL 語句生效。MyBatis-Plus 擅長單表增刪改查,復雜或多表查詢仍需手寫 SQL,因此需指定該地址
  • 下劃線轉駝峰映射配置(mapUnderscoreToCamelCase):開啟后可實現成員變量駝峰形式與數據庫下劃線形式的自動轉換,通常需開啟
  • 二級緩存配置(cacheEnabled):用于設置是否開啟二級緩存,一般不開啟,默認值為 false。
  • MyBatis 原生配置與 MyBatis-Plus 的關系:上述配置是 MyBatis 的原生配置,MyBatis-Plus 繼承了這些配置,使用時配置前綴改為 mybatis-plus,降低學習成本。
  • MP 特有的全局配置(globalConfig):包括數據庫配置(dbConfig)等,其中 id type 用于設置 id 的類型,如雪花算法(ASSIGN_ID),全局配置優先級低于注解配置。
  • 更新策略配置(updateStrategy):默認值為 not null,即只更新非空字段,較為智能。

注意:全局配置的優先級沒有注解優先級高

配置的默認值與查詢方式:大部分配置有默認值,除類型別名掃描包需自行指定外,其他配置除非有自定義需求,否則無需修改。可通過查閱官網或利用 IDEA 自動提示來了解和配置。

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

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

相關文章

PostgreSQL導入mimic4

一、PostgreSQL連接驗證 正確連接命令 使用psql工具連接目標數據庫&#xff0c;格式為&#xff1a;psql -h 127.0.0.1 -U 用戶名 -d 數據庫名 --password 示例&#xff08;用戶名Shinelon&#xff0c;數據庫mimic&#xff09;&#xff1a;psql -h 127.0.0.1 -U Shinelon -d mi…

css中 hsl() 的用法

好的 &#x1f44d; 我來詳細介紹一下 CSS hsl() 的用法。1. 基本語法 color: hsl(hue, saturation, lightness);hue&#xff08;色相&#xff09; 取值范圍&#xff1a;0 ~ 360&#xff08;角度值&#xff0c;代表色環的角度&#xff09;0 或 360 → 紅色120 → 綠色240 → 藍…

企業級Spring事務管理:從單體應用到微服務分布式事務完整方案

企業級Spring事務管理&#xff1a;從單體應用到微服務分布式事務完整方案 &#x1f31f; 你好&#xff0c;我是 勵志成為糕手 &#xff01; &#x1f30c; 在代碼的宇宙中&#xff0c;我是那個追逐優雅與性能的星際旅人。 ? 每一行代碼都是我種下的星光&#xff0c;在邏輯的土…

繼續記錄面試題

坐在工位&#xff0c;沒事干心慌的不行&#xff0c;可能也是房貸壓的。一閑下來就開始胡思亂想&#xff0c;無法沉下心去背那些八股文。這才剛剛接到離職通知第三天啊。而且、我還在坐班呢&#xff01;&#xff01;&#xff01; 哎、怪不得有句老話說的&#xff0c;人窮志短&a…

從零開始學習:深度學習(基礎入門版)(第2天)

&#xff08;一&#xff09;在pycharm軟件中&#xff0c;用python語言&#xff0c;opencv庫實現以下功能(1.1)圖片的邊界填充核心流程&#xff1a;讀取原始圖像使用 cv2.imread() 加載名為 yueshan.png 的圖像文件統一邊界參數設定四周留白尺寸均為 50px&#xff08;上下左右各…

HTTP協議-3-HTTP/2是如何維持長連接的?

先說結論&#xff1a;HTTP/2的“長連接” 一個TCP連接 多路復用 二進制幀 流控制 持久會話管理 它不只是“連接不斷”&#xff0c;更關鍵的是&#xff1a;在這個長連接上&#xff0c;可以同時并發傳輸成百上千個請求和響應&#xff0c;互不阻塞&#xff01; 1、HTTP/2的“…

圖解希爾排序C語言實現

1 希爾排序 希爾排序&#xff08;Shell Sort&#xff09;是D.L.Shell于1959年提出來的一種排序算法&#xff0c;在這之前排序算法的時間復雜度基本都是O(n)&#xff0c;希爾排序算法是突破這個時間復雜度的第一批算法之一。 1.1 基本概念與原理 希爾排序通過將原始列表分割成若…

網絡協議——HTTPS協議

目錄 一、HTTPS是什么 加密是什么 二、HTTPS的工作過程 &#xff08;一&#xff09;對稱加密 &#xff08;二&#xff09;非對稱加密 &#xff08;三&#xff09;在非對稱加密的基礎上&#xff0c;引入證書校驗 證書是什么 證書的內容 用證書解決中間人攻擊 三、總結 …

React 基礎實戰:從組件到案例全解析

React 基礎實戰專欄:從組件到案例全解析 本專欄圍繞 React 核心概念(組件、Props、State、生命周期)展開,通過 6個實戰案例+核心知識點拆解,幫你掌握 React 基礎開發邏輯,每篇聚焦1個實戰場景,搭配完整代碼與原理講解,適合 React 入門者鞏固基礎。 專欄目錄 【組件傳…

ARM芯片架構之CoreSight Channel Interface 介紹

CoreSight Channel Interface&#xff08;通道接口&#xff09;詳解1. 概述 Channel Interface 是 ARM CoreSight 架構中用于在不同組件之間傳遞觸發事件的專用接口。它是 Event Interface 的增強版本&#xff0c;支持多通道、雙向通信&#xff0c;以及同步與異步兩種時鐘域連接…

Blender模擬結構光3D Scanner(二)投影儀內參數匹配

關于投影儀外參的設置可參見前一篇文章 Blender模擬結構光3D Scanner&#xff08;一&#xff09;外參數匹配-CSDN博客 使用Projectors插件模擬投影儀 Step 1 在Github下載插件&#xff08;https://github.com/Ocupe/Projectors&#xff09;。下載zip壓縮包即可&#xff0c;無…

synchronized的作用

目錄 一、核心作用 二、實現原理&#xff1a;基于"對象鎖" 三、使用方式 四、鎖的優化 五、優缺點 六、總結 synchronized 是 Java 中用于解決多線程并發安全問題的核心關鍵字&#xff0c;它的主要作用是實現線程間的同步&#xff0c;確保多個線程在訪問共享資…

機試備考筆記 14/31

2025年8月14日 小結&#xff1a;&#xff08;17號整理14號的筆記&#xff0c;這輩子真是有了w(&#xff9f;Д&#xff9f;)w&#xff09;昨天摔了跤大的&#xff0c;今天好媽媽在家&#xff0c;松弛。省流&#xff1a;6道中等&#xff0c;明天只學了10分鐘嘻嘻 目錄LeetCode22…

dolphinscheduler中任務輸出變量的問題出現ArrayIndexOutOfBoundsException

一段腳本任務如下&#xff1a;ret/data/dolphinscheduler/loadOraTable.sh "yonbip/yonbip10.16.10.69:1521/orcl" "select t.bondcontractno,t.olcunissuemny from yonbip.bond_contract t " "/dmp/biz" "bip" "2025-08-13"…

OpenCv(二)——邊界填充、閾值處理

目錄 一、邊界填充&#xff08;Border Padding&#xff09; 1. 常見填充類型及效果 2.代碼示例 &#xff08;1&#xff09;constant邊界填充&#xff0c;填充指定寬度的像素 &#xff08;2&#xff09;REFLECT鏡像邊界填充 &#xff08;3&#xff09;REFLECT_101鏡像邊界…

Leetcode 15 java

今天復習一下翻轉二叉樹 226. 翻轉二叉樹 給你一棵二叉樹的根節點 root &#xff0c;翻轉這棵二叉樹&#xff0c;并返回其根節點。 示例 1&#xff1a; 輸入&#xff1a;root [4,2,7,1,3,6,9] 輸出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 輸入&#xff1a;root [2…

嵌入式學習的第四十九天-時鐘+EPIT+GPT定時器

一、時鐘1.時鐘系統基本概念&#xff08;1&#xff09;PLL (鎖相環, Phase-Locked Loop)作用&#xff1a;PLL是一種反饋控制電路&#xff0c;用于生成穩定的高頻時鐘信號。它通過將輸出時鐘與參考時鐘進行比較和調整&#xff0c;可以產生比輸入參考時鐘頻率高得多的輸出時鐘。倍…

Python Sqlalchemy數據庫連接

Python Sqlalchemy數據庫連接一、連接數據二、模型三、ORM操作一、連接數據 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker# 1. 連接數據庫 dbHost postgres://用戶名:密碼主機:端口/數據庫名 engine create_engine(dbHost) # create_engi…

【Node.js】ECMAScript標準 以及 npm安裝

目錄 一、 ECMAScript標準 - 默認導出和導入 二、ECMAScript標準 - 命名導出和導入 三、包的概念 五、 npm - 安裝所有依賴 六、 npm - 全局軟件包 Node.js總結 總結不易~ 本章節對我有很大的收獲&#xff0c; 希望對你也是&#xff01;&#xff01;&#xff01; 本節素材…

NPM 、 NPX

NPM vs. NPX 簡單來說&#xff0c;npm 是一個 node 包管理器&#xff0c;npx 是一個 Node 包執行器。 NPX 是一個 Node 包執行器&#xff0c;該 Node 包可以是本地也可以是遠程的。允許開發者在無需安裝的情況下執行任意 Node 包。npm 在安裝nodejs 就自動帶了 npm install -g …