目錄
- 一、快速使用
- 二、CRUD簡單使用
- 三、常見注解
- 3.1 @TableName
- 3.2 @TableFiled
- 3.3 @TableId
- 四、條件構造器
- 4.1 QueryWrapper
- 4.2 UpdateWrapper
- 4.3 LambdaQueryWrapper
- 4.4 LambdaUpdateWrapper
- 五、自定義SQL

一、快速使用
MyBatis Plus官方文檔:MyBatis Plus官方文檔
添加依賴:官方文檔都有。
Spring Boot 3的依賴:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.10.1</version>
</dependency>
配置文件:
mybatis-plus:configuration:# MyBatis 配置map-underscore-to-camel-case: trueglobal-config:# 全局配置db-config:# 數據庫配置id-type: auto
也要配置數據庫:
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: 1234driver-class-name: com.mysql.cj.jdbc.Driver
再寫實體類,
package com.example.mybatisplus.demo.model;import lombok.Data;import java.util.Date;
@Data
public class UserInfo {private Integer id;private String username;private String password;private Byte age;private Byte gender;private String phone;private Byte deleteFlag;private Date createTime;private Date updateTime;}
寫Mapper接口,要繼承BaseMapper,泛型指代要操作的實體類。
package com.example.mybatisplus.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatisplus.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}
打印日志配置:
mybatis-plus:configuration:# 配置打印 MyBatis?志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
二、CRUD簡單使用
直接調用對應方法即可,方法名十分清晰。
-
增:
-
刪
-
改
-
查:
三、常見注解
如果我們的數據庫設計是按照蛇形標準來設計數據庫名以及字段名的話,駝峰方式命名類屬性的話,MyBatis Plus會自動幫我們映射,但是如果有不和規范無法映射的話,就需要使用注解來幫我們映射。
3.1 @TableName
@TableName是類注解,用來表示當前類對應的數據庫表名。
通過錯誤日志可以看見mybatis-Plus是通過我們的類名去找表名的,當不符合規范就會找不到,但是加上@TableName注解講明表名,就可以找到。
3.2 @TableFiled
@TableFiled注解這個是屬性注解,跟@TableName作用一樣,是用來對應當不符合規范命名時,對應類屬性與數據庫表字段的。
@TableField("update_time")private Date updateTime;
3.3 @TableId
@TableId注解,是用來對應主鍵的。MyBatis - Plus默認主鍵是id,但是如果主鍵不是,就可以加上該注解表明這是主鍵對應的屬性。還可以用 @TableId注解的type屬性來設置當前是否是自增的。
@TableId(value = "id",type = IdType.AUTO)private Integer id;
四、條件構造器
前面介紹的都是簡單的CRUD,在實際的應?場景中,我們還需要使?更復雜的操作,MyBatisPlus也給我們提供了相應的?持。
MyBatis-Plus 提供了?套強?的條件構造器(Wrapper),?于構建復雜的數據庫查詢條件。Wrapper 類允許開發者以鏈式調?的?式構造查詢條件,?需編寫繁瑣的 SQL 語句, 從?提?開發效率并減少 SQL注?的?險。
以下是主要的 Wrapper 類及其功能:
- AbstractWrapper:這是?個抽象基類,提供了所有 Wrapper 類共有的?法和屬性。詳情看官網
- QueryWrapper:?于構造查詢條件,在AbstractWrapper的基礎上拓展了?個select?法,允許指定查詢字段。
- UpdateWrapper: ?于構造更新條件,可以在更新數據時指定條件。
- LambdaQueryWrapper:基于 Lambda 表達式的查詢條件構造器,它通過 Lambda 表達式來引?實體類的屬性,從?避免了硬編碼字段名。
- LambdaUpdateWrapper:基于 Lambda 表達式的更新條件構造器, 它允許你使? Lambda 表達式來指定更新字段和條件,同樣避免了硬編碼字段名的問題。
介紹一些簡寫過的方法:
- lt : “less than” 的縮寫,表??于.
- le : "less than or equal to"的縮寫, 表??于等于
- ge : “greater than or equal to” 的縮寫, 表??于等于.
- gt : “greater than” 的縮寫, 表??于.
- eq : “equals” 的縮寫, 表?等于.
- ne : “not equals” 的縮寫, 表?不等于.
4.1 QueryWrapper
QueryWrapper并不只?于查詢語句, ?論是修改, 刪除, 查詢,后面需要跟條件查詢的時候都可以使?QueryWrapper來構建查詢條件。
例如下面的sql語句:
select id,username, password, age, gender from `user_info` where age = 18 and username like "%s%"
結果如下:
當我們使用QueryMapper對應的代碼如下:
@Testpublic void selectByCondition() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.select(" id","username", "password", "age", "gender").eq("age",18).like("username","s");System.out.println(userInfoMapper.selectList(queryWrapper));}
結果:
默認情況下Mybatis-Plus會根據 @TableFiled ?成別名, 當指定了QueryWrapper的select屬性后就僅僅是屬性值?沒有了別名. 查詢出來的結果會對應不上
解決辦法:
- ??寫?定義SQL
- 實體類名和字段名保持?致
- 不指定QueryWrapper的select字段
- 使?LambdaQueryWrapper實現
4.2 UpdateWrapper
完成下面的sql語句:
update user_info set delete_flag = 1, age = age + 10 where id in(1,2,3)
運行前數據:
使用UpdateWrapper的代碼:
@Testpublic void updateByCondition() {UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.set("delete_flag",1).setSql("age = age + 10").in("id", List.of(1,2,3));userInfoMapper.update(updateWrapper);}
運行后結果:
4.3 LambdaQueryWrapper
LambdaQueryWrapper是基于Lambda表達式的條件構造器,它通過 Lambda 表達式來引?實體類的屬性,從?避免了硬編碼字段名。也提?了代碼的可讀性和可維護性。
查詢下面的sql
select id,username, password, age, gender from `user_info` where age = 28 and username like "%s%"
結果:
對應的使用LambdaQueryWrapper的代碼:
@Testpublic void selectByCondition2() {LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.select(UserInfo::getId, UserInfo::getUsername, UserInfo::getPassword,UserInfo::getAge,UserInfo::getGender, UserInfo::getDeleteFlag).eq(UserInfo::getAge,28).like(UserInfo::getUsername,"s");System.out.println(userInfoMapper.selectList(lambdaQueryWrapper));}
結果:
4.4 LambdaUpdateWrapper
update user_info set delete_flag = 1, age = age - 10 where id in(1,2,3)
運行前數據:
對應使用LambdaUpdateWrapper代碼:
@Testpublic void updateByCondition2() {LambdaUpdateWrapper<UserInfo> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();lambdaUpdateWrapper.set(UserInfo::getDeleteFlag, 1).setSql("age = age - 10").in(UserInfo::getId, List.of(1,2,3));userInfoMapper.update(lambdaUpdateWrapper);}
執行結果:
五、自定義SQL
官方文檔,MyBatis Plus官方文檔介紹自定義SQL如下:
示例一:
SQL語句:
select id,username, password, age from `user_info` where age = 18 or username like "%s%"
結果:
代碼:
@Select(" select id,username, password, age from user_info ${ew.customSqlSegment}")List<UserInfo> select (@Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper);
測試代碼:
@Testvoid testSelect() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("age",18).or().like("username","s");userInfoMapper.select(queryWrapper);}
結果:
示例二:
執行的SQL語句:
update user_info set delete_flag = 0, age = age + 10 where id in(1,2,3)
原始數據:
xml代碼:
<update id="update">update user_info set delete_flag = 0, age = age + #{age} ${ew.customSqlSegment}</update>
測試代碼:
@Testvoid testUpdate() {UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.in("id", List.of(1,2,3));userInfoMapper.update(10,updateWrapper);}
結果: