目錄
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
JDK:JDK1.8
構建工具:??maven?3.6.0
MySQL版本: ?MySQL?5.6? ?(mysql常用版本:5.6? 5.7? 8.0)
Spring?Boot:2.7.4
MyBatis-Plus:3.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注解,就明確告訴它,用的是框架提供的實現類。