1. 程式人生 > 其它 >HM2022ssm-mp1【MyBatisPlus簡介與入門案例】

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 模式
    :支援 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 操作智慧分析阻斷,也可自定義攔截規則,預防誤操作

開發方式

  • 基於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就可以不寫。

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介面即可。