MybatisPlus详细使用

文章目录

一、Mybatis Plus的使用步骤

1、引入MybatisPlus的起步依赖

MyBatisPlus官方提供了starter,其中集成了Mybatis和MybatisPlus的所有功能,并且实现了自动装配效果。因此我们可以用MybatisPlus的starter代替Mybatis的starter:

【SpringBoot3集成Mybatis-plus】启动报错问题解决https://blog.csdn.net/m0_71469568/article/details/135427094

xml 复制代码
        <!--    mybatis-plus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3</version>
        </dependency>

2、定义Mapper

自定义的Mapper继承MybatisPlus提供的BaseMapper接口

xml 复制代码
public interface UserMapper extends BaseMapper<User> {

}

二、常见注解

MyBatisPlus通过扫描实体类,通过反射获取实体类的属性作为信息表的信息

常见注解

csharp 复制代码
@TableName:用来指定表名
@TbaleId:用来指定主键字段信息
@TableField:用来指定表中普通字段名

@TableField常见场景
成员变量名与数据库字段名不一致
成员变量名以is开头,且是布尔值
成员变量名与数据库关键字冲突
成员变量不是数据库字段
csharp 复制代码
idType类型:
ATUO:数据库自增
INPUT:通过set方法输入
ASSIGN_ID:分配 ID,接pldentifierGenerator的方法nextld来生成id,默认实现类为DefaultldentifierGenerator雪花算法

三、常见配置

MyBatisPlus的配置项继承了MyBatis的原生配置和一些自己的配置

四、核心功能

4.1、条件构造器

Mybatis Plus支持各种复杂的增删改查语句,可以满足日常的开发要求

QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的wliere条件部分

①查询出名字中带o的,存款大于等于1000元的人的id、username、info、balance字段

csharp 复制代码
select id,username,info,balance from user where username like ? and balance >= ?

构造器,构造语句

csharp 复制代码
// 1 构建查询条件
QueryWrapper<User> querywrapper = new QueryWrapper<>()
	.select("id","username","info","balance")
	.like("username","o")
	.ge("balance",1000)

// 2 查询
List<User> users = userMapper.selectList(wrapper)

②更新用户名为jack的用户余额为2000

csharp 复制代码
update user set balance=2000 where username="jack"
csharp 复制代码
// 1 更新数据
User user = new User()
user.setBalance(2000)
// 2 更新的条件
QueryWrapper<User> querywrapper = new QueryWrapper<>()
	.eq("username","jack")
// 3 查询
userMapper.update(user,wrapper)

UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用

①更新id为1,2,4的用户的余额,扣200

csharp 复制代码
update set balance=balance-200 where id in (1,2,4)
csharp 复制代码
List<long> ids = List.of(1L,2L,4L)
UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
	.setSql("balance=balance-200")
	.in("id",ids);
userMapper.update(null,wrapper)

尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬编码

csharp 复制代码
// 1 构建查询条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>()
	.select(User::getId,User::getUsername,User::getInfo,User::getBalance)
	.like(User::getUsername,"o")
	.ge(User::getBalance,1000)

// 2 查询
List<User> users = userMapper.selectList(wrapper)

4.2、自定义sql

我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。

需求:将id在指定范围的用户(例如1、2、4)的余额扣减指定值

①基于wrapper构建where条件

csharp 复制代码
// 更新条件
List<long> ids = List.of(1L,2L,4L)
int amount = 200
// 构建条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId,ids);
// 自定义sql方法调用
userMapper.updateBalanceByIds(wrapper,amount)

②在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew

csharp 复制代码
void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper,@Param("amount") int amount)

③自定义SQL,并使用wrapper条件

csharp 复制代码
<update id="updateBalanceByIds">
	update user  set balance = balance - #{amount} ${ew.customSqlSegment}
</update>

4.3、Service接口

Service接口

五、LambdaQueryWrapper常用方法详解

  1. eq() --- 等于条件

    eq() 用于查询字段的值等于某个指定值。

    java 复制代码
    lambdaQueryWrapper.eq(User::getName, "John");

    解释:查询 name 字段等于 "John" 的记录。

    参数:

    第一个参数是实体类的字段(通过 Lambda 表达式传入)。

    第二个参数是与该字段进行比较的值。

  2. ne() --- 不等于条件

    ne() 用于查询字段的值不等于某个指定值。

    java 复制代码
    lambdaQueryWrapper.ne(User::getAge, 25);

    解释:查询 age 字段不等于 25 的记录。

  3. gt() --- 大于条件

    gt() 用于查询字段的值大于某个指定值。

    java 复制代码
    lambdaQueryWrapper.gt(User::getAge, 18);

    解释:查询 age 字段大于 18 的记录。

  4. lt() --- 小于条件

    lt() 用于查询字段的值小于某个指定值。

    java 复制代码
    lambdaQueryWrapper.lt(User::getAge, 30);

    解释:查询 age 字段小于 30 的记录。

  5. ge() --- 大于等于条件

    ge() 用于查询字段的值大于等于某个指定值。

    java 复制代码
    lambdaQueryWrapper.ge(User::getAge, 18);

    解释:查询 age 字段大于等于 18 的记录。

  6. le() --- 小于等于条件

    le() 用于查询字段的值小于等于某个指定值。

    java 复制代码
    lambdaQueryWrapper.le(User::getAge, 30);

    解释:查询 age 字段小于等于 30 的记录。

  7. like() --- 模糊查询

    like() 用于查询字段的值模糊匹配某个指定字符串。

    java 复制代码
    lambdaQueryWrapper.like(User::getName, "Jo");

    解释:查询 name 字段包含 "Jo" 的记录。

  8. likeLeft() --- 左模糊查询

    likeLeft() 用于查询字段的值左边模糊匹配某个指定字符串。

    java 复制代码
    lambdaQueryWrapper.likeLeft(User::getName, "Jo");

    解释:查询 name 字段以 "Jo" 开头的记录。

  9. likeRight() --- 右模糊查询

    likeRight() 用于查询字段的值右边模糊匹配某个指定字符串。

    java 复制代码
    lambdaQueryWrapper.likeRight(User::getName, "Jo");

    解释:查询 name 字段以 "Jo" 结尾的记录。

  10. in() --- in 查询

    in() 用于查询字段的值在指定集合中的记录。

    java 复制代码
    lambdaQueryWrapper.in(User::getAge, 20, 25, 30);

    解释:查询 age 字段的值在 [20, 25, 30] 中的记录。

  11. notIn() --- not in 查询

    notIn() 用于查询字段的值不在指定集合中的记录。

    java 复制代码
    lambdaQueryWrapper.notIn(User::getAge, 20, 25, 30);

    解释:查询 age 字段的值不在 [20, 25, 30] 中的记录。

  12. between() --- 范围查询

    between() 用于查询字段的值在某个范围内的记录。

    java 复制代码
    lambdaQueryWrapper.between(User::getAge, 18, 30);

    解释:查询 age 字段的值在 18 到 30 之间的记录。

  13. notBetween() --- 不在某个范围内查询

    notBetween() 用于查询字段的值不在某个范围内的记录。

    java 复制代码
    lambdaQueryWrapper.notBetween(User::getAge, 18, 30);

    解释:查询 age 字段的值不在 18 到 30 之间的记录。

  14. isNull() --- 判断字段为 null

    isNull() 用于查询字段的值为 null 的记录。

    java 复制代码
    lambdaQueryWrapper.isNull(User::getEmail);

    解释:查询 email 字段为 null 的记录。

  15. isNotNull() --- 判断字段不为 null

    isNotNull() 用于查询字段的值不为 null 的记录。

    java 复制代码
    lambdaQueryWrapper.isNotNull(User::getEmail);

    解释:查询 email 字段不为 null 的记录。

  16. orderByAsc() --- 按字段升序排序

    orderByAsc() 用于根据指定字段升序排序。

    java 复制代码
    lambdaQueryWrapper.orderByAsc(User::getAge);

    解释:根据 age 字段升序排序。

  17. orderByDesc() --- 按字段降序排序

    orderByDesc() 用于根据指定字段降序排序。

    java 复制代码
    lambdaQueryWrapper.orderByDesc(User::getAge);

    解释:根据 age 字段降序排序。

  18. last() --- 追加 SQL 片段

    last() 用于在 SQL 的最后追加自定义的 SQL 片段。

    java 复制代码
    lambdaQueryWrapper.last("LIMIT 10");

    解释:会在最终生成的 SQL 中追加 LIMIT 10,限制查询返回的记录数为 10。

  19. select() --- 指定查询字段

    select() 用于指定查询的字段。

    java 复制代码
    lambdaQueryWrapper.select(User::getName, User::getAge);

    解释:查询 name 和 age 字段。

  20. or() --- 或条件

    or() 用于构建 OR 条件查询。

    java 复制代码
    lambdaQueryWrapper.eq(User::getName, "John").or().eq(User::getAge, 30);

    解释:查询 name 等于 "John" 或者 age 等于 30 的记录。

  21. groupBy() --- 分组查询

    groupBy() 用于 SQL 的 GROUP BY 子句。

    java 复制代码
    lambdaQueryWrapper.groupBy(User::getAge);

    解释:按 age 字段进行分组。

  22. having() --- 分组查询条件

    having() 用于设置分组后的条件。

    java 复制代码
    lambdaQueryWrapper.groupBy(User::getAge).having("COUNT(*) > 1");

    解释:对 age 字段分组后,筛选出人数大于 1 的分组。

  23. nested() --- 嵌套条件查询

    nested() 用于嵌套一组查询条件,生成括号条件。

    java 复制代码
    lambdaQueryWrapper.nested(w -> w.lt(User::getAge, 30).or().eq(User::getName, "John"));

    解释:构建 ((age < 30) OR (name = "John")) 的查询条件。

  24. lambda() --- 用于链式调用中的 Lambda 表达式

    在某些复杂的查询条件中,可以使用 lambda() 来清晰地组织多个条件。

    java 复制代码
    lambdaQueryWrapper.lambda()
                      .eq(User::getName, "John")
                      .lt(User::getAge, 30);

    解释:同 eq 和 lt,但使用 lambda() 方法可以增强代码的可读性。

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛6 天前
计算机系统概论——校验码
学习
babe小鑫6 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms6 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下6 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。6 天前
2026.2.25监控学习
学习
im_AMBER6 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J6 天前
从“Hello World“ 开始 C++
c语言·c++·学习