MybatisPlus的使用与详细讲解
创始人
2024-11-26 07:04:26
0

今天我们来讲解一下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

QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.like("usesrname","o")             .ge("balance",1000); List users = userMapper.selectList(queryWrapper); 

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

UPDATE user SET balance 2000 where username = "jack"

QueryWrapper 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)

 

LambdaUpdateWrapper 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条件

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

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

void updateBalanceByIds(@Param("ew") LambdaQueryWrapper wrapper, @Param("amount") int amount); 

自定义SQL,并使用Wrapper条件

  UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}  

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

自定义Service接口继承IService接口

public interface IUserService extends IService {}

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

public class UserServiceImpl extends ServiceImpl implements IUserService{ }

IService的Lambda更新

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

(2)IService批量新增

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

  • 普通for循环插入
for (int i = 0; i < 100000; i++) {     User user = new User();     user.setUsername("user" + i);     user.setBalance(1000);     userMapper.insert(user); // 每次插入一条数据 }
  • IService的批量插入
List 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 参数来优化批量插入的性能。以下是一个示例:
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?rewriteBatchedStatements=true

7.逻辑删除

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

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

    例如逻辑删除字段为deleted:

删除操作:

查询操作:

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

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中配置全局枚举处理器:

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 时指定的值。

相关内容

热门资讯

透视黑科技!wepoker私人... 透视黑科技!wepoker私人局可以玩(透视)底牌透视挂辅助方法(可靠开挂辅助专业教程)-哔哩哔哩;...
两分钟了解!赣湘互娱辅助(辅助... 两分钟了解!赣湘互娱辅助(辅助挂)详细透视开挂辅助细节方法(好像是有挂)-哔哩哔哩;1、点击下载安装...
八分钟了解!中至九江麻将有挂的... 八分钟了解!中至九江麻将有挂的(辅助挂)好像真的是有挂(专业辅助细节方法)-哔哩哔哩;八分钟了解!中...
玩家实测"德扑之星软... 玩家实测"德扑之星软件透明功能真实体验"详细外挂透明挂辅助神器-都是是有挂(哔哩哔哩);德扑之星软件...
透视攻略!pokeplus脚本... 您好:pokeplus脚本这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户...
两分钟了解!亲友棋牌app有挂... 两分钟了解!亲友棋牌app有挂(辅助挂)本然真的是有挂(专业辅助wepoke教程)-哔哩哔哩;亲友棋...
第6分钟了解!同城游辅助(辅助... 第6分钟了解!同城游辅助(辅助挂)详细透视开挂辅助科技教程(好像是有挂)-哔哩哔哩,同城游辅助是用手...
一分钟了解!"约局吧... 一分钟了解!"约局吧发牌逻辑"详细外挂透明挂辅助插件-切实存在有挂(哔哩哔哩)是一款可以让一直输的玩...
透视好友!wepoker手机助... 透视好友!wepoker手机助手(透视)底牌透视挂辅助插件(可靠开挂辅助第三方教程)-哔哩哔哩;一、...
九分钟了解!越乡游义乌麻将有挂... 您好,越乡游义乌麻将有挂么这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩...