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() 方法可以增强代码的可读性。

相关推荐
DKPT5 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
好好研究7 小时前
学习栈和队列的插入和删除操作
数据结构·学习
新中地GIS开发老师8 小时前
新发布:26考研院校和专业大纲
学习·考研·arcgis·大学生·遥感·gis开发·地理信息科学
SH11HF9 小时前
小菜狗的云计算之旅,学习了解rsync+sersync实现数据实时同步(详细操作步骤)
学习·云计算
Frank学习路上9 小时前
【IOS】XCode创建firstapp并运行(成为IOS开发者)
开发语言·学习·ios·cocoa·xcode
Chef_Chen10 小时前
从0开始学习计算机视觉--Day07--神经网络
神经网络·学习·计算机视觉
X_StarX12 小时前
【Unity笔记02】订阅事件-自动开门
笔记·学习·unity·游戏引擎·游戏开发·大学生
MingYue_SSS12 小时前
开关电源抄板学习
经验分享·笔记·嵌入式硬件·学习
weixin_4373982113 小时前
转Go学习笔记(2)进阶
服务器·笔记·后端·学习·架构·golang
慕y27413 小时前
Java学习第十六部分——JUnit框架
java·开发语言·学习