HM2022ssm-mp1【MyBatisPlus簡介與入門案例】
1. 簡介
MyBatisPlus(簡稱MP)是基於MyBatis框架基礎上開發的增強型工具,旨在簡化開發、提高效率
通過剛才的案例,相信大家能夠體會簡化開發和提高效率這兩個方面的優點。
MyBatisPlus的官網為:https://mp.baomidou.com/
從這張圖中我們可以看出MP旨在成為MyBatis的最好搭檔,而不是替換MyBatis,所以可以理解為MP是MyBatis的一套增強工具,它是在MyBatis的基礎上進行開發的,我們雖然使用MP但是底層依然是MyBatis的東西,也就是說我們也可以在MP中寫MyBatis的內容。
對於MP的學習,大家可以參考著官方文件來進行學習,裡面都有詳細的程式碼案例。
MP的特性:
- 無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑
- 損耗小:啟動即會自動注入基本 CURD,效能基本無損耗,直接面向物件操作
- 強大的 CRUD 操作:內建通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求
- 支援 Lambda 形式呼叫:通過 Lambda 表示式,方便的編寫各類查詢條件,無需再擔心欄位寫錯
- 支援主鍵自動生成:支援多達 4 種主鍵策略(內含分散式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
-
支援 ActiveRecord 模式
- 支援自定義全域性通用操作:支援全域性通用方法注入( Write once, use anywhere )
- 內建程式碼生成器:採用程式碼或者 Maven 外掛可快速生成 Mapper 、 Model 、 Service 、 Controller 層程式碼,支援模板引擎,更有超多自定義配置等您來使用
- 內建分頁外掛:基於 MyBatis 物理分頁,開發者無需關心具體操作,配置好外掛之後,寫分頁等同於普通 List 查詢
- 分頁外掛支援多種資料庫:支援 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種資料庫
- 內建效能分析外掛:可輸出 SQL 語句以及其執行時間,建議開發測試時啟用該功能,能快速揪出慢查詢
- 內建全域性攔截外掛:提供全表 delete 、 update 操作智慧分析阻斷,也可自定義攔截規則,預防誤操作
開發方式
- 基於MyBatis使用MyBatisPlus
- 基於Spring使用MyBatisPlus
- 基於SpringBoot使用MyBatisPlus
2. 回顧SB整合Mybatis過程
2.1 建立SpringBoot工程
2.2 勾選配置使用的技術,能夠實現自動新增起步依賴包
2.3 設定dataSource相關屬性(JDBC引數)
2.4 定義資料層介面對映配置
3. SB+MP入門案例
3.1 建立資料庫及表
create database if not exists mybatisplus_db character set utf8;
use mybatisplus_db;
CREATE TABLE user (
id bigint(20) primary key auto_increment,
name varchar(32) not null,
password varchar(32) not null,
age int(3) not null ,
tel varchar(32) not null
);
insert into user values(1,'Tom','tom',3,'18866668888');
insert into user values(2,'Jerry','jerry',4,'16688886666');
insert into user values(3,'Jock','123456',41,'18812345678');
insert into user values(4,'傳智播客','itcast',15,'4006184000');
3.2 建立SpringBoot工程
3.3 pom.xml補全依賴
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
說明:
- 由於MP並未被收錄到idea的系統內建配置,無法直接選擇加入,需要手動在pom.xml中配置新增
- druid資料來源可以加也可以不加,SpringBoot有內建的資料來源,可以配置成使用Druid資料來源
- 從MP的依賴關係可以看出,通過依賴傳遞已經將MyBatis與MyBatis整合Spring的jar包匯入,我們不需要額外在新增MyBatis的相關jar包
3.4 新增MP的相關配置資訊
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC
username: root
password: root
說明:
-
resources預設生成的是properties配置檔案,可以將其替換成yml檔案,並在檔案中配置資料庫連線的相關資訊:
application.yml
-
serverTimezone是用來設定時區,UTC是標準時區,和咱們的時間差8小時,所以可以將其修改為
Asia/Shanghai
3.5 根據資料庫表建立實體類
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
建立domain.User類:
package com.yppah.domain;
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
private String password;
private Integer age;
private String tel;
}
3.6 建立Dao介面
建立dao.UserDao介面:
package com.yppah.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yppah.domain.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserDao extends BaseMapper<User> {
}
3.7 配置掃包
編寫引導類:
package com.yppah;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
//@MapperScan("com.yppah.dao")
public class Mp01QuickstartApplication {
public static void main(String[] args) {
SpringApplication.run(Mp01QuickstartApplication.class, args);
}
}
說明:
Dao介面要想被容器掃描到,有兩種解決方案:
-
方案一:在Dao介面上新增
@Mapper
註解,並且確保Dao處在引導類所在包或其子包中- 該方案的缺點是需要在每一Dao介面中添加註解
- 方案二:在引導類上新增
@MapperScan
註解,其屬性為所要掃描的Dao所在包- 該方案的好處是隻需要寫一次,則指定包下的所有Dao介面都能被掃描到,
@Mapper
就可以不寫。
- 該方案的好處是隻需要寫一次,則指定包下的所有Dao介面都能被掃描到,
3.8 編寫測試類
package com.yppah;
import com.yppah.dao.UserDao;
import com.yppah.domain.User;
import org.junit.Test; // 手動匯入org.junit.Test,預設的org.junit.jupiter.api.Test會報錯
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class Mp01QuickstartApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testGetAll() {
List<User> userList = userDao.selectList(null);
System.out.println(userList);
}
}
說明:
userDao注入的時候下面有紅線提示的原因是什麼?
-
UserDao是一個介面,不能例項化物件
-
只有在伺服器啟動IOC容器初始化後,由框架建立DAO介面的代理物件來注入
-
現在伺服器並未啟動,所以代理物件也未建立,IDEA查詢不到對應的物件注入,所以提示報紅
-
一旦服務啟動,就能注入其代理物件,所以該錯誤提示不影響正常執行。
注意:
<SpringBoot測試junit遇到的坑及解決_java_指令碼之家 (jb51.net)>
<idea中springboot使用junit測試報錯的問題 - L丶銀甲閃閃 - 部落格園 (cnblogs.com)>
完整測試程式碼:
package com.yppah;
import com.yppah.dao.UserDao;
import com.yppah.domain.User;
import org.junit.Test;
//import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Mp01QuickstartApplication.class)
public class Mp01QuickstartApplicationTests {
@Autowired
private UserDao userDao;
@Test
public void testGetAll() {
List<User> userList = userDao.selectList(null);
for (User user : userList) {
System.out.println(user);
}
}
}
測試結果:
簡化:跟之前整合MyBatis相比,你會發現我們不需要在DAO介面中編寫方法和SQL語句了,只需要繼承
BaseMapper
介面即可。