持久层框架MyBatisPlus

简介: MyBatisPlus是MyBatis的增强工具,简化单表CRUD操作,无需编写XML即可实现增删改查。通过继承BaseMapper、使用@TableName等注解及条件构造器QueryWrapper、UpdateWrapper,轻松完成数据库操作。支持自定义SQL与Service层封装,提升开发效率,是Spring Boot项目中常用的数据访问解决方案。

前面我们学习过的ORM[Object Relational Mapping(对象关系映射)]持久层框架MyBatis,它可以帮助我们完成单表、多表、动态SQL的业务逻辑处理,与之平级的还有Hibernate,和这节我们要学习的MyBatisPlus了。
1.快速入门
1.1 入门案例
mp.sql
(6 KB)
mp-demo.zip
(52 KB)
首先我们根据提供的资料导入一下工程案例,一起看下实现下列功能的代码逻辑:
新增用户功能
根据id查询用户
根据id批量查询用户
根据id更新用户
根据id删除用户
代码执行流程如下:
当我们打开:UserMapper_20231023_150307.xml 文件后,可以看到熟悉的代码
但是我们不禁要思考一个问题,简单的单表的增删改查,他的SQL语句基本固定,这种是否可以优化呢?当然是可以的,这就是这一小节MP要做的事情。而要引入MP框架并应用起来,遵循下面的步骤即可。
1-引入MybatisPlus的起步依赖
MyBatisPlus官方提供了starter,其中集成了Mybatis和MybatisPlus的所有功能,并且实现了自动装配效果。因此我们可以用MybatisPlus的starter代替Mybatis的starter:
原来的mybatis依赖可以删除掉
2-继承BaseMapper
然后我们在自己的mapper接口中继承BaseMapper,并声明泛型对应的实体类就可以有常见的CRUD代码了。
接下来我们就用MP依次替代上述增删改查的原始代码
新增用户功能
根据id查询用户
根据id批量查询用户
根据id更新用户
根据id删除用户
整体改造完之后,我们就可以把之前:UserMapper_20231023_150307.xml 中的代码都删掉了,是不是很简洁
1.2 常见注解
通过上面的案例我们可以发现mp的使用很便捷,用户基本是无感知的,那他是如何做到表跟属性值的映射的呢?MyBatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息。
但是上述的都是正常情况,如果存在一些异常:如表名跟实体类不一样、实体类部分字段表中没有等,就可以通过一些常见注解来完成映射了,MybatisPlus中比较常用的几个注解如下:
@TableName:用来指定表名
@TableId:用来指定表中的主键字段信息
@TableField:用来指定表中的普通字段信息
假设表结构如下
则对应的实体类可以映射如下
其中
IdType枚举:
AUTO:数据库自增长
INPUT:通过set方法自行输入
ASSIGN_ID:分配 ID,接口IdentifierGenerator的方法nextId来生成id,默认实现类为DefaultIdentifierGenerator
雪花算法使用@TableField的常见场景:
成员变量名与数据库字段名不一致
成员变量名以is开头,且是布尔值
成员变量名与数据库关键字冲突
成员变量不是数据库字段
1.3 常见配置
MyBatisPlus的配置项继承了MyBatis原生配置和一些自己特有的配置。例如:
具体可参考官方文档:使用配置 | MyBatis-Plus (baomidou.com)
2.核心功能
2.1 条件构造器
理论分析
MyBatisPlus支持各种复杂的where条件,可以满足日常开发的所有需求。当我们继承BaseMapper之后,就具备了一些常见的接口方法
这里的Wrapper就是各种条件构造器,他的子类继承体系如下
在这个体系中,AbstractWrapper定义了各种查询的条件,如:eq、in、between、like、gt、lt等。也就是说借助于他可以完成单表各种场景的查询条件组装。那为什么他又有QueryWrapper、UpdateWrapper呢?这是因为我们一个完整的查询语句是:SELECT 字段 FROM 表名 WHERE 条件
QueryWrapper可以帮助我们声明要查询的具体字段,避免查询全部字段,导致IO开销过大,从而影响SQL性能的问题。同理UpdateWrapper一样,可以帮我们更新指定字段。
案例实操
接下来我们就通过几个案例,来实际体验一下吧
查询出名字中带o的,存款大于等于1000元的人的id、username、info、balance字段
上述案例的SQL大概如下
分析:因为是查询,且查询指定字段,所以这里考虑QueryWrapper
更新用户名为jack的用户的余额为2000
上述案例的SQL大概如下
分析:因为更新的where条件中带查询,所以可以用QueryWrapper
更新id为1,2,4的用户的余额,扣200
上述案例的SQL大概如下
分析:这个SQL更新条件不需要做额外的查询,所以UpdateWrapper可以直接搞定,并且这里是账户余额扣减200不是直接设置成两百,所以我们的更新参数第一个user给null就好
如果这里同时需要设置用户姓名拼接:*,就可以初始化一个User对象,然后做拼接,最后传递进去就可以
2.2 自定义SQL
这个我们在项目二会使用到
我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。
需求:将id在指定范围的用户(例如1、2、4 )的余额扣减指定值
正常我们的SQL语句如下
如果我们采用自定义的,就会将整个Where条件抽取,实现细节如下
①基于Wrapper构建where条件
②创建接口方法,在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew
③自定义SQL,并使用Wrapper条件,这里可以二选一
一、动态SQL
二、注解形式(直接在接口方法增加@Update注解)
2.3 Service接口
理论分析
前面我们的MP接口都是在mapper层编写的,MP也为我们提供了一些更高效的service层方法
比如上述的批量新增、批量更新、查询单个、批量删除、分页等都是非常实用的。而要去实现这个功能就不能像原来Mapper层一样直接继承BaseMapper了,因为接口是有实现类的,所以我们遵循下面这一套规范:
用户的接口继承:IService
Java
运行代码
复制代码
1
2
public interface UserService extends IService {
}
用户的接口实现类继承:ServiceImpl
Java
运行代码
复制代码
1
2
3
4
5
6
7
8
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl implements UserService {
}

相关文章
|
9月前
|
自然语言处理 算法
分词器详解
分词器将文本转为模型可处理的数字序列,主流算法包括BPE、WordPiece和SentencePiece。BPE高效但中文支持弱;WordPiece适合英文,用于BERT;SentencePiece语言无关,尤擅中文。实战中需结合语种与需求选择,并合理配置参数与特殊标记。
|
9月前
|
Java Maven 开发工具
2 IDEA环境配置
安装IDEA并配置编码、自动导包、忽略大小写提示及Java编译级别;安装Maven并配置本地仓库与阿里云镜像;在IDEA中设置Maven环境;安装Git并配置用户信息与IDEA集成;Fork并克隆黑马商城项目,创建数据库hmall并导入SQL;修改application-dev.yaml中的数据库连接信息;启动后端项目与Nginx前端服务,确保端口无冲突。
|
9月前
|
消息中间件 Java 数据安全/隐私保护
RabbitMQ集群部署
本文介绍RabbitMQ集群部署及高可用方案,涵盖普通集群搭建、镜像模式配置与仲裁队列使用。通过Docker部署三节点集群,配置Erlang Cookie与rabbitmq.conf实现节点通信;利用镜像模式实现数据冗余,支持主从切换;引入3.8版本后的仲裁队列,简化高可用配置,提升系统容错能力。
|
9月前
|
监控 Java 数据库
1.4. sentinel降级
本文介绍如何在微服务中使用Sentinel对A服务自身接口进行限流与降级。通过@SentinelResource注解定义资源,设置限流规则,并实现fallback和blockHandler方法处理异常与限流降级。同时对比Feign远程调用与非远程调用的降级方式,结合信号量隔离实现线程级防护,保障系统稳定性。
|
9月前
|
消息中间件 JSON Java
3.9.2 配置JSON转换器
为优化消息序列化,采用JSON格式替代JDK默认方式。在publisher和consumer中引入Jackson依赖(若已引入web starter则无需重复添加),并配置`Jackson2JsonMessageConverter`作为消息转换器,启用自动生成消息ID。通过MQ控制台验证消息结构,并在消费者端使用Map接收发送的Object消息,确保收发一致。
|
9月前
|
消息中间件 Java Nacos
SpringCloud概述
Spring Cloud应微服务需求而生,提供统一解决方案,具备约定大于配置、组件丰富、开箱即用等特点。通过地铁站命名版本,避免子项目冲突。Spring Cloud Alibaba融合阿里实践,推出Nacos、Sentinel、Seata等优秀组件,弥补Netflix停更短板,成为主流选择。本节概述其演进、生态及技术选型依据,为后续实战奠基。(238字)
|
9月前
|
缓存 Java Nacos
@RefreshScope热更新原理
@RefreshScope通过组合@Scope("refresh")实现配置热更新,其核心是利用动态代理与缓存机制。标注该注解的Bean会被放入自定义refresh scope缓存,配置变更时清空缓存,触发Spring重新创建Bean实例,从而重新注入最新配置值,实现毫秒级动态刷新。
|
9月前
|
自然语言处理
主流大模型结构
主流大模型架构分为四类:Encoder-Decoder(如T5)、Decoder-Only(如GPT、LLaMA)、Encoder-Only(如BERT)和Prefix-Decoder(如GLM),分别适用于生成、理解或兼顾任务。GPT系列从GPT-1到GPT-4,参数量跃升至约1.7万亿,支持多模态与长上下文;LLaMA系列持续优化开源模型;国产模型如Qwen、ChatGLM、Kimi、DeepSeek在中文场景表现突出,涵盖对话、数学推理等能力。
|
9月前
|
消息中间件 数据库 UED
1.1 同步调用与异步调用
本文介绍了微服务间的同步与异步调用。同步调用需等待结果返回,顺序执行,适合实时性高、操作简单的场景;异步调用发出请求后可继续执行其他任务,提升效率与资源利用率,适用于耗时操作。通过支付、点餐、挂号等生活实例对比,阐述了二者特点、适用场景及优缺点。
|
9月前
|
机器学习/深度学习
位置编码详解
位置编码为Transformer提供序列位置信息,弥补注意力机制无位置感知的缺陷。主要分绝对(如可学习、Sinusoidal)和相对(如RoPE、ALiBi)两类。RoPE通过旋转矩阵支持长序列,ALiBi以线性偏置增强外推能力。不同方法在长度外推、效率上各有优劣,广泛应用于LLaMA、BLOOM等大模型,是面试考察重点。