MyBatis-Plus(SpringBoot版)學習第一講:簡介入門案例

目錄

1. MyBatis-Plus簡介

1.1 簡介

1.2 特性

1.3 支持的數據庫

?1.4 框架結構

1.5 代碼及文檔地址

2. 入門案例

2.1 開發環境

2.2 創建數據庫及表

?1. 創建表

2. 添加數據

2.3?創建SpringBoot工程

1.?初始化工程

?2. 引入依賴

?3. IDEA中安裝lombok插件

?編輯

2.4?編寫代碼?

1. 配置application.yml

2. 啟動類

3. 添加實體

4. 添加mapper

5. 測試

6. 添加日志

2.5 MapperScan和repository的區別


1. MyBatis-Plus簡介

1.1 簡介

????????MyBatis-Plus?(簡稱?MP)是一個 MyBatis的增強工具,在?MyBatis?的基礎上只做增強不做改變,為?簡化開發、提高效率而生Mybatis-Plus提供了通用的Mapper和Service,可以在不編寫任何SQL語句的前提下,快速的實現單表的增刪改查(CURD),批量,邏輯刪除,分頁等操作。只要把MyBatis-Plus的特性到優秀插件,以及多數據源的配置進行詳細講解。

愿景

????????我們的愿景是成為 MyBatis 最好的搭檔,就像?魂斗羅?中的 1P、2P,基友搭配,效率翻倍。

1.2 特性

  • 無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑
  • 損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向對象操作
  • 強大的 CRUD 操作:內置通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求
  • 支持 Lambda 形式調用:通過 Lambda 表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯
  • 支持主鍵自動生成:支持多達 4 種主鍵策略(內含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式調用,實體類只需繼承 Model 類即可進行強大的 CRUD 操作
  • 支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 內置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用
  • 內置分頁插件:基于 MyBatis 物理分頁,開發者無需關心具體操作,配置好插件之后,寫分頁等同于普通 List 查詢
  • 分頁插件支持多種數據庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種數據庫
  • 內置性能分析插件:可輸出 SQL 語句以及其執行時間,建議開發測試時啟用該功能,能快速揪出慢查詢
  • 內置全局攔截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規則,預防誤操作

1.3 支持的數據庫

任何能使用MyBatis進行 CRUD, 并且支持標準 SQL?的數據庫,具體支持情況如下

?1.4 框架結構

1.5 代碼及文檔地址

官方地址: http://mp.baomidou.com

代碼發布地址:

Github: GitHub - baomidou/mybatis-plus: An powerful enhanced toolkit of MyBatis for simplify development

Gitee: mybatis-plus: mybatis 增強工具包,簡化 CRUD 操作。 文檔 http://baomidou.com低代碼組件庫 http://aizuda.com

文檔發布地址: https://baomidou.com/pages/24112f


2. 入門案例

2.1 開發環境

IDE?idea?2017

JDKJDK1.8

構建工具:??maven?3.6.0

MySQL版本: ?MySQL?5.6? ?(mysql常用版本:5.6? 5.7? 8.0)

Spring?Boot2.7.4

MyBatis-Plus3.5.1

2.2 創建數據庫及表

?1. 創建表

CREATE DATABASE `mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use `mybatis_plus`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主鍵ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名 ',
`age` int(11) DEFAULT NULL COMMENT '年齡 ',
`email` varchar(50) DEFAULT NULL COMMENT '郵箱 ',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. 添加數據

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');


2.3?創建SpringBoot工程

1.?初始化工程

?使用 Spring?Initializr?快速初始化一個 Spring?Boot?工程

?

?2. 引入依賴

        <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>

?3. IDEA中安裝lombok插件

?


2.4?編寫代碼?

1. 配置application.yml

spring:# 配置數據源信息datasource:# 配置數據源類型type: com.zaxxer.hikari.HikariDataSource# 配置連接數據庫信息driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=falseusername: rootpassword: 2020

?相關解釋? :

?????? ?數據庫連接池

????????Spring Boot 1.x 版本默認的數據庫連接池是?org.apache.tomcat.jdbc.pool.DataSource。在 Spring Boot 2.x 版本及以后,默認的數據庫連接池是?com.zaxxer.hikari.HikariDataSource

? ? ? ? 驅動類

????????在 MySQL 5.x 版本中,推薦使用的 JDBC 驅動類是?com.mysql.jdbc.Driver。不過從 MySQL Connector/J 5.1.47 版本開始,官方更推薦使用?com.mysql.cj.jdbc.Driver?這個新的驅動類。

????????而到了 MySQL 8.0 版本,com.mysql.jdbc.Driver?被標記為已過時,官方只支持使用?

com.mysql.cj.jdbc.Driver。

注意!!

1、驅動類driver-class-name

spring?boot?2.0(內置jdbc5驅動),驅動類使用:? ? ??

driver-class-name:?com.mysql.jdbc.Driver

spring?boot?2.1及以上(內置jdbc8驅動),驅動類使用:

driver-class-name:?com.mysql.cj.jdbc.Driver

???否則運行測試用例的時候會有 WARN?信息

?2、連接地址url?

MySQL5.7版本的url

jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false

MySQL8.0版本的url

jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false

否則運行測試用例報告如下錯誤:

java.sql.SQLException: The?server time zone value'?D1ú±ê×?ê±??'?is?unrecognized?or represents?more

2. 啟動類

??在Spring?Boot啟動類中添加@MapperScan注解,掃描mapper包。

????????用途是掃描指定包路徑下的 Mapper 接口,并且將這些接口自動注冊為 Spring Bean。如此一來,你就能在服務層里直接注入這些 Mapper 接口,進而使用它們來操作數據庫。

? ? ? ? 接口的代理實現類是由框架來提供的,所以我們需要配置一個單獨掃描mapper的掃描器。

@SpringBootApplication
@MapperScan("com.qcby.mybatisplus.mapper")
public class MybatisPlusApplication {public static void main(String[] args) {SpringApplication.run(MybatisPlusApplication.class, args);}}

3. 添加實體

@Data  //lombok注解
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class User {private Long id;private String name;private Integer age;private String email;
}

快捷鍵: ctrl+F12?查看類結構。

只有@Data注解時,沒有含參的構造器。

?

@AllArgsConstructor?注解可以自動為類生成一個包含所有成員變量的構造函數。

????????但是如果只加?@AllArgsConstructor?就沒有無參的構造器了,需要再加一個@NoArgsConstructor,構造無參構造器。

@Getter注解,顯然是構造訪問器。

@Setter注解,構造更改器。

4. 添加mapper

????????BaseMapper是MyBatis-Plus提供的模板mapper,其中包含了基本的CRUD方法,泛型為操作的?實體類型

public interface UserMapper extends BaseMapper<User> {
}
package com.baomidou.mybatisplus.core.mapper;public interface BaseMapper<T> extends Mapper<T> {/*** 插入一條記錄* @param entity 實體對象 */int insert(T entity);/*** 根據 ID 刪除* @param id 主鍵ID */int deleteById(Serializable id);/*** 根據實體(ID)刪除* @param entity 實體對象* @since 3.4.4 */int deleteById(T entity);/*** 根據 columnMap 條件,刪除記錄* @param columnMap 表字段 map 對象 */int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);/*** 根據 entity 條件,刪除記錄* @param queryWrapper 實體對象封裝操作類(可以為 null,里面的 entity 用于生成 where語句)*/int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 刪除(根據ID 批量刪除)* @param idList 主鍵ID列表(不能為 null 以及 empty) */int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);/*** 根據 ID 修改* @param entity 實體對象 */int updateById(@Param(Constants.ENTITY) T entity);/*** 根據 whereEntity 條件,更新記錄* @param entity        實體對象 (set 條件值 ,可以為 null)* @param updateWrapper 實體對象封裝操作類(可以為 null,里面的 entity 用于生成where 語句)*/int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);/*** 根據 ID 查詢* @param id 主鍵ID */T selectById(Serializable id);/*** 查詢(根據ID 批量查詢)* @param idList 主鍵ID列表(不能為 null 以及 empty) */List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);/*** 查詢(根據 columnMap 條件)* @param columnMap 表字段 map 對象 */List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);/*** 根據 entity 條件,查詢一條記錄* <p>查詢一條記錄,例如 qw.last("limit 1") 限制取一條記錄 , 注意:多條數據會報異常 </p>* @param queryWrapper 實體對象封裝操作類(可以為 null)*/default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) { List<T> ts = this.selectList(queryWrapper);if (CollectionUtils.isNotEmpty(ts)) {if (ts.size() != 1) {throw ExceptionUtils.mpe("One record is expected, but the query result is multiple records");}return ts.get(0);}return null;}/*** 根據 Wrapper 條件,查詢總記錄數* @param queryWrapper 實體對象封裝操作類(可以為 null) */Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根據 entity 條件,查詢全部記錄* @param queryWrapper 實體對象封裝操作類(可以為 null) */List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根據 Wrapper 條件,查詢全部記錄* @param queryWrapper 實體對象封裝操作類(可以為 null) */List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根據 Wrapper 條件,查詢全部記錄* <p>注意: 只返回第一個字段的值</p>* @param queryWrapper 實體對象封裝操作類(可以為 null) */List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根據 entity 條件,查詢全部記錄(并翻頁)* @param page         分頁查詢條件(可以為 RowBounds.DEFAULT)* @param queryWrapper 實體對象封裝操作類(可以為 null) */<P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根據 Wrapper 條件,查詢全部記錄(并翻頁)* @param page         分頁查詢條件* @param queryWrapper 實體對象封裝操作類 */<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}

5. 測試

@SpringBootTest
class MybatisPlusApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void testSelectList(){//selectList()根據MP內置的條件構造器查詢一個list集合,null表示沒有條件,即查詢所有userMapper.selectList(null).forEach(System.out::println);}

jdk1.8的輸出格式?

userMapper.selectList(null).forEach(System.out::println);

可以直接注入接口的原因是:

????????在測試類里注入 Mapper 接口時,實際上注入的是 MyBatis-Plus 為該接口生成的代理對象。MyBatis-Plus 會為掃描到的 Mapper 接口創建代理對象。這些代理對象實現了 Mapper 接口的方法,并且在方法調用時會和數據庫進行交互。?

結果

?注意:

????????IDEA在 userMapper?處報錯,因為找不到注入的對象,因為類是動態創建的,但是程序可以正確?的執行。

為了避免報錯,可以在mapper接口上添加 @Repository?注解


@Repository
public interface UserMapper extends BaseMapper<User> {
}

?原因:

????????在 Spring 框架里,@Repository?是一個重要的注解,它主要用于將一個類標記為數據訪問層(DAO,Data Access Object)的組件。

????????@Repository?注解用于告訴 Spring 容器,被注解的類是一個數據訪問對象,負責與數據庫、文件系統等數據源進行交互。Spring 會自動將這個類注冊為一個 Bean,這樣你就可以在其他組件中通過依賴注入的方式使用它。

6. 添加日志

application.yml中配置日志輸出

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

可以看到執行的sql語句。

2.5 MapperScan和repository的區別

??接口的代理實現類是由框架來提供的,所以我們需要配置一個單獨掃描mapper的掃描器。

@MapperScan是 MyBatis-Spring 框架里的注解。MyBatis 是一個優秀的持久層框架,而 MyBatis-Spring 則讓 MyBatis 能更好地集成到 Spring 框架中。

????????作用:它的作用是掃描指定包下的所有接口,并把這些接口自動注冊為 MyBatis 的 Mapper Bean。這樣一來,我們就無需在每個 Mapper 接口上單獨添加@Mapper注解了。

@Repository是 Spring 框架自帶的注解。

? ? ? ? 將類(這個接口的代理類)交給Spring去管理,而這個代理類是由mybatisPlus(MyBatis的增強,還是MyBatis)實現的。管理著它的實現類,要是沒有這個注解,就需要userMapperImpl,但是mybatisPlus框架都給提供了。

? ? ? ? 如果不加,他會報波浪線,但是不出錯。

????????如果這個接口有很多實現類,加了@Repository注解,就明確告訴它,用的是框架提供的實現類。

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

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

相關文章

k8s高可用集群安裝

一、安裝負載均衡器 k8s負載均衡器 官方指南 1、準備三臺機器 節點名稱IPmaster-1192.168.1.11master-2192.168.1.12master-3192.168.1.13 2、在這三臺機器分別安裝haproxy和keepalived作為負載均衡器 # 安裝haproxy sudo dnf install haproxy -y# 安裝Keepalived sudo yum …

【PPO】小白的強化學習算法筆記

參考視頻 零基礎學習強化學習算法&#xff1a;ppo 基礎概念 environment環境agent&#xff1a;智能體&#xff0c;玩游戲的你state&#xff1a;當前狀態&#xff0c;observation看到的部分&#xff0c;有的游戲只能看見state的一部分action&#xff1a;agent做出的動作reward…

Flink介紹與安裝

Apache Flink是一個在有界數據流和無界數據流上進行有狀態計算分布式處理引擎和框架。Flink 設計旨在所有常見的集群環境中運行&#xff0c;以任意規模和內存級速度執行計算。 一、主要特點和功能 1. 實時流處理: 低延遲: Flink 能夠以亞秒級的延遲處理數據流&#xff0c;非常…

深入解析 JVM 內存區域及核心概念

深入解析 JVM 內存區域及核心概念 Java 虛擬機&#xff08;JVM&#xff09;內部劃分了多個內存區域&#xff0c;每個區域存儲不同類型的數據并承擔不同的職責。本文將詳細介紹以下內容&#xff1a; 程序計數器&#xff1a;記錄當前線程正在執行的字節碼指令及其“行號”信息&a…

Java操作RabbitMQ

文章目錄 Spring集成RabbitMQ1. AMQP&SpringAMQP2. SpringBoot集成RabbitMQ3. 模型work模型 4.交換機Fanout交換機Direct交換機Topic交換機 5.聲明式隊列和交換機基于API聲明基于注解聲明 6.消息轉換器 Spring集成RabbitMQ 1. AMQP&SpringAMQP AMQP&#xff08;高級消…

Kotlin泛型: 協變|逆變|不變

引言 無論java 通配符上限還是下限&#xff0c;都多少存在缺陷&#xff0c;要么存不安全&#xff0c;要么取不安全。而kotlin就解決這個問題。讓out 純輸出&#xff0c; 讓in純輸入。 java這塊知識&#xff1a; java泛型的協變、逆變和不變-CSDN博客 協變 生產者out T 協變…

【Excel使用技巧】某列保留固定字段或內容

目錄 ? 方法一&#xff1a;使用 Excel 公式提取 body 部分 &#x1f50d; 解釋&#xff1a; ? 方法二&#xff1a;批量處理整列數據 &#x1f6a8; 注意事項 &#x1f6a8; 處理效果 我想保留Excel某一列的固定內容&#xff0c;比如原內容是&#xff1a; thread entry i…

C# System.Text.Encoding 使用詳解

總目錄 前言 在C#編程中&#xff0c;處理字符串和字節數組之間的轉換是一個常見的任務。System.Text.Encoding類及其派生類提供了豐富的功能&#xff0c;幫助開發者實現不同字符編碼之間的轉換。本文將詳細講解System.Text.Encoding類的使用方法&#xff0c;包括常用編碼的介紹…

Pre-flash和Main flash

在相機拍照過程中&#xff0c;Pre-flash&#xff08;預閃光&#xff09; 和 Main flash&#xff08;主閃光&#xff09; 是常見的兩種閃光燈使用模式&#xff0c;通常用于提高低光環境下的拍攝質量&#xff0c;尤其在自動曝光&#xff08;AE&#xff09;和自動對焦&#xff08;…

Kafka 4.0 發布:KRaft 替代 Zookeeper、新一代重平衡協議、點對點消息模型、移除舊協議 API

KRaft 全面替代 ZooKeeper Apache Kafka 4.0 是一個重要的里程碑&#xff0c;標志著第一個完全無需 Apache ZooKeeper 運行的主要版本。 通過默認運行在 KRaft 模式下&#xff0c;Kafka 簡化了部署和管理&#xff0c;消除了維護單獨 ZooKeeper 集群的復雜性。 這一變化顯著降…

SFT實驗報告

大模型微調實驗報告* 實驗目標 梳理大模型微調方法&#xff0c;評估各種基座和微調方法的實驗效果。 基礎模型 \1.Llama \2.Qwen \3.Chatglm4 \4. 微調策略 LoRA系列 低秩適配&#xff08;LoRA&#xff09;的核心思想是凍結原始參數&#xff0c;通過低秩分解引入可訓…

LLM - R1 強化學習 DRPO 策略優化 DAPO 與 Dr. GRPO 算法 教程

歡迎關注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/146533892 在強化學習算法中&#xff0c;DAPO (Decoupled Clip and Dynamic Sampling Policy Optimization)&#xff0c;通過解耦裁剪和動態采樣策…

美攝科技智能汽車視頻延遲攝影解決方案,開啟智能出行新視界

在智能汽車時代&#xff0c;車載影像技術正以前所未有的速度發展&#xff0c;成為提升駕乘體驗和滿足用戶多樣化需求的關鍵因素。美攝科技憑借其卓越的技術實力和創新精神&#xff0c;推出了智能汽車視頻延遲攝影解決方案&#xff0c;為智能汽車行業帶來了一場視覺盛宴。 一、…

[250325] Claude AI 現已支持網絡搜索功能!| ReactOS 0.4.15 發布!

目錄 Claude AI 現已支持網絡搜索功能&#xff01;ReactOS 0.4.15 發布&#xff01; Claude AI 現已支持網絡搜索功能&#xff01; 近日&#xff0c;Anthropic 公司宣布&#xff0c;其 AI 助手 Claude 現在可以進行網絡搜索&#xff0c;為用戶提供更及時、更相關的回復。這項新…

代碼規范之Variable Names變量名

代碼規范之Variable Names變量名 golang中 官方文檔&#xff1a;https://go.dev/wiki/CodeReviewComments#variable-names Variable names in Go should be short rather than long. This is especially true for local variables with limited scope. Prefer c to lineCoun…

Mybatis_plus

前言 Mybatis_plus 是在 mybatis 的基礎上進行了增強&#xff0c;在 MyBatis 的基礎上只做增強不做改變&#xff0c;為簡化開發、提高效率而生。本文章只做簡單的使用介紹&#xff0c;更加詳細的內容大家可以參考官網。 下面是mybatis_plus 官網地址&#xff1a; mybatis_plu…

深圳問頂安全科技有限公司asktopsec是做什么的?

深圳問頂安全科技有限公司&#xff0c;是一家專業的AI與應用安全公司。 全球領先的AI、Android、IOS應用安全解決方案提供商&#xff0c;官網&#xff1a;https://asktopsec.com 問頂安全主要為企業提供AI和應用安全服務 移動應用安全檢測、移動應用安全加固、AI智能體安全、AI…

鴻蒙OS 5 架構設計探秘:從分層設計到多端部署

文章目錄 鴻蒙OS架構設計探秘&#xff1a;從分層設計到多端部署一、鴻蒙的分層架構設計二、模塊化設計的精髓三、智慧分發設計&#xff1a;資源的動態調度四、一次開發&#xff0c;多端部署的實踐總結與思考 鴻蒙OS架構設計探秘&#xff1a;從分層設計到多端部署 最近兩年來&a…

idea 沒有 add framework support(添加框架支持)選項

在 IntelliJ IDEA 2023 中&#xff0c;若需通過設置手動添加 “添加框架支持” 菜單項&#xff0c;可按照以下步驟操作&#xff1a; 手動添加 “添加框架支持” 菜單項 打開設置 點擊頂部菜單欄的 File&#xff08;文件&#xff09; -> Settings&#xff08;設置&#xff09…

計算機網絡--傳輸層(2)

傳輸層核心機制深度解析 一、可靠傳輸實現機制 1. 校驗和機制 技術原理&#xff1a; 使用16位二進制反碼求和算法&#xff0c;計算范圍包括TCP偽首部&#xff08;12字節&#xff09;、TCP首部&#xff08;20字節&#xff09;和數據部分接收端重新計算校驗和&#xff0c;若與…