這里寫自定義目錄標題
- MyBatis-Plus 概述
- 快速入門
- 入門案例
- 常用注解
- 常見配置
MyBatis-Plus 概述
MyBatis-Plus 簡介:
MyBatis-Plus 是在 MyBatis 基礎上開發的一個 增強工具包,它簡化了 MyBatis 的開發,減少了大量重復代碼。它保持了 MyBatis 原有的特性(如靈活的 SQL),同時提供了很多開箱即用的功能。
官網定位是:
👉 只做增強,不做改變。
MyBatis-Plus 的優勢:
- 無侵入:只需少量配置,幾乎不改變原有項目結構。
- CRUD 自動化:內置了大量單表操作方法,幾乎不用寫 Mapper XML。
- 條件構造器:通過鏈式調用快速構造 SQL 條件。
- 分頁插件:提供強大的分頁功能。
- 代碼生成器:自動生成 Entity、Mapper、Service、Controller 等代碼。
- 多種內置功能:邏輯刪除、自動填充、樂觀鎖、防全表更新與刪除等。
核心功能:
-
通用 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 }
-
條件構造器
MyBatis-Plus 提供了
QueryWrapper
、LambdaQueryWrapper
等,簡化條件拼接。// 傳統寫法 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);
-
分頁插件
MyBatis-Plus 內置分頁插件,只需簡單配置:
IPage<User> page = new Page<>(1, 10); // 第1頁,每頁10條 IPage<User> result = userMapper.selectPage(page, null);
-
代碼生成器
自動生成 實體類、Mapper、Service、Controller,極大提高開發效率。
-
常用擴展
-
邏輯刪除:配置邏輯刪除字段,刪除操作會變成
UPDATE
。 -
自動填充:創建時間、更新時間自動填充。
-
樂觀鎖:防止并發修改數據沖突。
-
防全表更新刪除:避免誤操作導致數據丟失。
-
典型使用場景:
- 快速開發業務系統(如管理后臺、信息系統),減少重復寫 SQL。
- 單表操作頻繁的場景(批量增刪改查)。
- 結合 Spring Boot 使用,可以做到極簡配置。
和 MyBatis 的區別:
特性 | MyBatis | MyBatis-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 自動提示來了解和配置。