MybatisPlus的使用与详细讲解

今天我们来讲解一下Mybatis的升级版,就是MybatisPlus.

MybatisPlus是如何获取实现CRUD的数据库表信息的? 默认以类名驼峰转下划线作为表名 默认把名为id的字段作为主键 默认把变量名驼峰转下划线作为表的字段名

1.MybatisPlus中比较常见的注解

@TableName:指定表名

@TableId:用来指定主键字段信息

@TableField:用来指定普通字段

使用@TableField的常见场景:

  • 成员变量与数据库段名不一样
  • 成员变量以is开头,并且是布尔值
  • 成员变量名与数据库的关键字冲突
  • 成员变量不是数据库字段

IdType枚举:

Auto:数据库自增

INPUT:通过set方法录入

ASSING_ID:分配接口为IdentifierGenerator的方法的nextId来生成id,默认实现类为DefaultIdentifierGenerator雪花算法

2.MyBatisPlus使用的基本流程

引入起步依赖

自定义Mapper基础BaseMapper

在实体类上添加注解声明表的信息

在application.yml中根据需要添加依赖

3.基于QueryWrapper的查询

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

select id,username,info,balance From user where username LIKE '%o%' AND balance >= 1000

java 复制代码
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("usesrname","o")
            .ge("balance",1000);
List<User> users = userMapper.selectList(queryWrapper); 

2.更新用户名为jack的用户的余额为2000

UPDATE user SET balance 2000 where username = "jack"

java 复制代码
QueryWrapper<User> updateWrapper = new UpdateWarpper<>();
updateWrapper.set("balance",2000)
            .eq("username","jack");
userMapper.update(null,updateWrapper)

4.基于UpdateWrapper的更新

需求:更新id为

1,2,4的用户的余额,扣200

UPDATE user SET balance = balance - 200 WHERE id in (1,2,4)

java 复制代码
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(User::getId,Arrays.asList(1,2,4))
             .setSql("balance = balance - 200");
userMapper.update(null,updateWrapper);

条件构造器的用法:

  • QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分
  • UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用
  • 尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬编码

5.自定义SQL

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

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

基于Wrapper构建where条件

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

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

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

自定义SQL,并使用Wrapper条件

sql 复制代码
<update id="updateBalanceByIds">
 UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update>

6.MP的Service接口使用流程是怎样的

自定义Service接口继承IService接口

sql 复制代码
public interface IUserService extends IService<User> {}

自定义Service实现类,实现自定义接口并继承ServiceImpl类

java 复制代码
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService{
}

IService的Lambda更新

需求:改造根据id修改用户余额的接口,要求如下 完成对用户状态校验 完成对用户余额校验 如果扣减后余额为0,则将用户status修改为冻结状态

(2)IService批量新增

需求:批量插入10万条用户数据,并作出对比:

  • 普通for循环插入
java 复制代码
for (int i = 0; i < 100000; i++) {
    User user = new User();
    user.setUsername("user" + i);
    user.setBalance(1000);
    userMapper.insert(user); // 每次插入一条数据
}
  • IService的批量插入
java 复制代码
List<User> userList = new ArrayList<>();
for(int i = 0;i < 100000 ; i++){
    User user = new User();
    user.setUsername("user" + i);
    user.setBalance(1000);
    userList.add(user);
}
userService.saveBatch(userList); //批量删除
  • 开启rewriteBatchedStatements=true参数
  • 在使用 JDBC 时,可以通过在连接 URL 中添加 rewriteBatchedStatements=true 参数来优化批量插入的性能。以下是一个示例:
bash 复制代码
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?rewriteBatchedStatements=true

7.逻辑删除

逻辑删除就是基于代码逻辑模拟删除效果,但并不会真正删除数据。思路如下:

  • 在表中添加一个字段标记数据是否被删除
  • 当删除数据时把标记置为1
  • 查询时只查询标记为0的数据

例如逻辑删除字段为deleted:

删除操作:

查询操作:

MybatisPlus提供了逻辑删除功能,无需改变方法调用的方式,而是在底层帮我们自动修改CRUD的语句。我们要做的就是在application.yaml文件中配置逻辑删除的字段名称和值即可

java 复制代码
mybatis-plus:
 global-config: 
   db-config:     
      logic-delete-field: flag   # 全局逻辑删除的实体字段名,字段类型可以是boolean、integer                                                 
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

逻辑删除本身也有自己的问题,比如: 会导致数据库表垃圾数据越来越多,影响查询效率 SQL中全都需要对逻辑删除字段做判断,影响查询效率 因此,我不太推荐采用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法。

8.枚举处理器

  • 定义枚举类型:创建表示常量的枚举。
  • 在实体类中使用枚举:将枚举类型作为实体类的字段。
  • 创建枚举处理器:实现自定义的 TypeHandler 来处理枚举的存储和读取。
  • 在 MyBatis 配置中注册处理器:将自定义的处理器注册到 MyBatis 中。
  • 使用枚举:在进行数据库操作时,MyBatis 会自动处理枚举的转换。

通用枚举

在application.yml中配置全局枚举处理器:

java 复制代码
mybatis-plus:
  configuration:
    default-enum-type-handler:com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

1. @EnumValue

@EnumValue 注解通常用于 MyBatis-Plus 框架,目的是将枚举值映射到数据库字段。使用 @EnumValue 注解可以指定在数据库中存储的枚举值。

2. @JsonValue

@JsonValue 注解来自 Jackson 库,主要用于将枚举序列化为 JSON 时指定的值。使用 @JsonValue 可以控制在将枚举转换为 JSON 时使用哪个字段。

  • @EnumValue:用于 MyBatis-Plus,将枚举值映射到数据库字段。
  • @JsonValue:用于 Jackson,将枚举序列化为 JSON 时指定的值。
相关推荐
流星白龙7 小时前
【MySQL】6.MySQL基本查询(1)
数据库·windows·mysql
夕除7 小时前
Mysql--11
数据库·mysql
❀͜͡傀儡师7 小时前
docker部署WhoDB开源轻量级数据库管理工具
数据库·docker·开源
皙然7 小时前
Redis八大核心数据类型详解:从底层实现到实战落地
数据库·redis·bootstrap
时光追逐者7 小时前
一款免费、简单、高效的在线数据库设计工具
数据库·mysql·oracle·sql server
another heaven7 小时前
【软考 2026 最新版 NoSQL 数据库全分类】
数据库·nosql
满天星83035778 小时前
【MySQL】表的操作
linux·服务器·数据库·mysql
yashuk8 小时前
Ubuntu 系统下安装 Nginx
数据库·nginx·ubuntu
F1FJJ8 小时前
VS Code 里管理 PostgreSQL,有哪些选择?主流扩展横向对比
网络·数据库·postgresql·容器
Bdygsl8 小时前
MySQL(8)—— 事务
数据库·mysql