MyBatis-Plus 基本概念

MyBatis-Plus 基本概念详解

MyBatis-Plus 是基于 MyBatis 的增强工具,是一个简化开发、提升效率的 ORM 框架。它在 MyBatis 的基础上进行了很多功能扩展,如自动生成 CRUD 操作、代码生成器、通用查询条件构造器等,同时保持了 MyBatis 的灵活性和 SQL 可控性。MyBatis-Plus 的目标是减少开发者手动编写 SQL 的工作量,提升开发效率,同时提供更好的扩展和插件支持。

一、MyBatis-Plus 的特点

  1. 无侵入性:MyBatis-Plus 不会对现有的 MyBatis 项目产生任何侵入,它是在 MyBatis 之上提供了更多的功能。如果不需要某些功能,也可以选择不使用。
  2. 开箱即用:MyBatis-Plus 提供了大量的默认配置和功能,开发者可以通过少量配置快速启动并使用 CRUD、分页、查询构造器等功能。
  3. 自动化 CRUD:提供了通用的 CRUD 操作,减少手动编写 SQL 的工作。
  4. 支持 Lambda 表达式:MyBatis-Plus 支持使用 Java 8 的 Lambda 表达式来构建查询条件,使代码更加简洁优雅。
  5. 插件支持:提供丰富的插件支持,包括分页插件、性能分析插件、SQL 日志插件等。
  6. 代码生成器:通过代码生成器可以快速生成 Mapper、Service、Controller 等层的代码,大幅减少重复的代码编写。

二、MyBatis-Plus 基础配置

MyBatis-Plus 的配置非常简单,通常基于 Spring Boot 项目。MyBatis-Plus 提供了对 Spring Boot 的完美支持,集成方式与 MyBatis 类似。

1. 引入依赖

在 Spring Boot 项目中,首先需要引入 MyBatis-Plus 的 Maven 依赖:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version>
</dependency>
2. 配置文件

application.yml 中配置数据源和 MyBatis-Plus 相关信息:

spring:datasource:url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8username: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:mapper-locations: classpath:/mapper/*.xmltype-aliases-package: com.example.entity
3. Mapper 接口

MyBatis-Plus 提供了一个基础的 BaseMapper 接口,继承该接口可以获得 MyBatis-Plus 提供的通用 CRUD 功能。所有的实体映射接口都可以继承 BaseMapper,并通过泛型指定实体类。

public interface UserMapper extends BaseMapper<User> {
}

三、MyBatis-Plus 的核心功能

1. 自动化 CRUD 操作

MyBatis-Plus 提供了通用的 CRUD 接口,只需要继承 BaseMapper,即可使用丰富的 CRUD 方法,无需再手动编写 SQL 语句。

  • 查询:根据主键查询一条记录。

java   User user = userMapper.selectById(1);  

  • 插入:插入一条记录。

java   User user = new User();   user.setName("Alice");   user.setAge(25);   int result = userMapper.insert(user);  

  • 更新:根据主键更新一条记录。

java   user.setAge(26);   int result = userMapper.updateById(user);  

  • 删除:根据主键删除一条记录。

java   int result = userMapper.deleteById(1);  

  • 批量查询:根据 ID 列表批量查询。

java   List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));  

  • 条件查询:使用 QueryWrapper 构建动态查询条件。

java   QueryWrapper<User> queryWrapper = new QueryWrapper<>();   queryWrapper.eq("name", "Alice").gt("age", 20);   List<User> users = userMapper.selectList(queryWrapper);  

2. Lambda 表达式查询

为了避免硬编码字段名,MyBatis-Plus 提供了 LambdaQueryWrapper,可以通过 Lambda 表达式来构建查询条件,保证字段名与实体类字段一致。

LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getName, "Alice").gt(User::getAge, 20);
List<User> users = userMapper.selectList(queryWrapper);
3. 分页查询

MyBatis-Plus 提供了分页插件,能够轻松实现分页功能。首先需要在配置中启用分页插件:

@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

然后在业务代码中直接使用分页功能:

Page<User> page = new Page<>(1, 10);  // 第1页,每页10条记录
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.gt(User::getAge, 20);
Page<User> userPage = userMapper.selectPage(page, queryWrapper);

selectPage 方法会返回 Page 对象,包含分页的详细信息,如总记录数、总页数等。

4. 逻辑删除

MyBatis-Plus 支持逻辑删除,意味着数据并不会真正从数据库中删除,而是通过标记字段来标识记录是否删除。首先在实体类中为逻辑删除字段添加 @TableLogic 注解:

@TableLogic
private Integer deleted;

然后,在全局配置中启用逻辑删除功能:

mybatis-plus:global-config:db-config:logic-delete-field: deleted

之后,调用 deleteById 方法时,MyBatis-Plus 会自动更新逻辑删除字段,而不是物理删除数据。

5. 自动填充字段

MyBatis-Plus 支持对创建时间、更新时间等字段的自动填充。可以通过实现 MetaObjectHandler 接口自定义填充逻辑:

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());}
}

然后在实体类中使用 @TableField 注解设置自动填充属性:

@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
6. 代码生成器

MyBatis-Plus 提供了强大的代码生成器,能够根据数据库表结构自动生成实体类、Mapper 接口、Service 层和 Controller 层代码,极大地减少了开发者的重复劳动。

生成器的配置通常包括数据源配置、包名配置和表名配置,以下是一个简单的代码生成器配置示例:

public class CodeGenerator {public static void main(String[] args) {FastAutoGenerator.create("jdbc:mysql://localhost:3306/mydb", "root", "password").globalConfig(builder -> {builder.author("author") // 设置作者.outputDir(System.getProperty("user.dir") + "/src/main/java"); // 设置输出路径}).packageConfig(builder -> {builder.parent("com.example") // 设置父包名.moduleName("module"); // 设置模块名}).strategyConfig(builder -> {builder.addInclude("user"); // 设置需要生成的表}).execute();}
}

运行该代码后,MyBatis-Plus 会根据数据库表结构生成对应的实体类、Mapper 接口、Service 和 Controller 层的代码。

四、MyBatis-Plus 插件支持

MyBatis-Plus 提供了多个常用的插件,开发者可以根据需求选择使用:

  • 分页插件:用于实现分页查询功能。
  • 性能分析插件:用于分析 SQL 执行的性能,帮助开发者优化 SQL 语句。
  • SQL 日志插件:用于输出 SQL 执行日志,便于开发和调试。
  • 数据权限插件:用于在 SQL 查询中自动添加数据权限过滤条件。

五、MyBatis-Plus 与 MyBatis 的对比

| 特性                         | MyBatis                          | MyBatis-Plus

|
|------------------------------|-----------------------------------|-------------------------------------------------|
| SQL 编写                      | 手写 SQL,灵活控制                | 提供了自动 CRUD,减少手写 SQL                   |
| 配置复杂度                    | 需要较多 XML 配置和手动管理       | 配置简单,支持开箱即用                         |
| 分页支持                      | 需要手动编写分页逻辑              | 提供分页插件,自动生成分页 SQL                  |
| Lambda 表达式支持             | 不支持                           | 支持 Lambda 表达式,查询更加优雅                |
| 逻辑删除                      | 需要手动实现                     | 提供逻辑删除功能,自动控制逻辑删除              |
| 自动填充字段                  | 不支持                           | 支持字段自动填充,如创建时间、更新时间等        |
| 代码生成器                    | 无                               | 提供代码生成器,快速生成代码                   |
| 扩展性                        | 高,但需要较多配置和手动操作       | 高,且提供多种插件和扩展机制                   |

六、总结

MyBatis-Plus 作为 MyBatis 的增强工具,通过自动化的 CRUD 操作、分页插件、Lambda 表达式支持、逻辑删除等功能,大幅提高了开发效率,并减少了手动编写 SQL 的工作量。它在保持 MyBatis 原有灵活性的同时,提供了更高层次的抽象和便利,特别适合中大型项目的开发。

MyBatis-Plus 的无侵入性设计和丰富的插件支持,使其可以轻松地集成到现有的 MyBatis 项目中,并且不会影响已有的业务逻辑。因此,对于追求快速开发和高效管理数据库操作的项目,MyBatis-Plus 是一个非常值得推荐的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/150299.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

geodatatool(地图资源下载工具)3.8更新

geodatatool&#xff08;地图资源下载工具&#xff09;3.8&#xff08;新&#xff09;修复更新&#xff0c;修复更新包括&#xff1a; 1.选中下载数据时显示选中个数。 其它一些BUG修复。 如您有其它问题及需求&#xff0c;也可以联系我们&#xff0c;我们将持续维护更新该工…

刷题日记_DAY1

前言 这里记录每日随机刷的错题 两个数组的交集&#xff08;模拟&#xff09; 题目描述 题目解析 题目要求返回指定的两个字符串之间的距离&#xff0c;容易想到的一种解法就是暴力遍历&#xff0c;来个双循环&#xff0c;但时间复杂度就为N^2&#xff0c;不符合题意 for(…

【最新华为OD机试E卷-支持在线评测】绘图机器(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

ESXI主机加入VCENTER现有集群提示出现常规性错误

背景&#xff1a;由于忘记了这台主机的root密码&#xff0c;所以在迁移完虚拟机后给这台主机重新安装了操作系统&#xff0c;装完操作系统加集群提示如下报错&#xff1a; 查阅了一些资料后发现主机的CPU是一样的&#xff0c;不需要开EVC&#xff1b; 也有一些说需要改这个配置…

【专题】2024年中国白酒行业数字化转型研究报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37755 消费人群趋于年轻化&#xff0c;消费需求迈向健康化&#xff0c;消费场景与渠道走向多元化&#xff0c;这些因素共同驱动企业凭借数据能力来适应市场的变化。从消费市场来看&#xff0c;消费群体、需求、场景及渠道皆展现出与…

图文组合商标部分驳回后优化后初审通过!

这几天以前有个企业的商标初审下来了&#xff0c;以前是加了图形个别部分没有通过初审&#xff0c;后面是把图形去掉重新用文字申请下来初审。 图形与文字同时申请&#xff0c;会分别审查有一个元素过不了&#xff0c;整体就会过不了&#xff0c;所以平常就会建议分开申请注册商…

【Linux实践】实验三:LINUX系统的文件操作命令

【Linux实践】实验三&#xff1a;LINUX系统的文件操作命令 实验目的实验内容实验步骤及结果1. 切换和查看目录2. 显示目录下的文件3. 创建和删除目录① mkdir② rm③ rmdir 4. 输出和重定向① 输出② 重定向 > 和 >> 5. 查看文件内容① cat② head 6. 权限7. 复制8. 排…

【微服务即时通讯系统】——etcd一致性键值存储系统,etcd的介绍,etcd的安装,etcd使用和功能测试

文章目录 etcd1. etcd的介绍1.1 etcd的概念 2. etcd的安装2.1 安装etcd2.2 安装etcd客户端C/C开发库 3. etcd使用3.1 etcd接口介绍 4. etcd使用测试4.1 原生接口使用测试4.2 封装etcd使用测试 etcd 1. etcd的介绍 1.1 etcd的概念 Etcd 是一个基于GO实现的 分布式、高可用、一致…

UE学习篇ContentExample解读------Blueprint_Communication-上

文章目录 总览描述批次阅览1.1 Basic communication with a target blueprint1.2 Basic communication via actor casting1.3 Blueprint communication via actor casting to child Blueprint1.4 Communicating with all actors of a specific class 概念总结致谢&#xff1a; …

vite分目录打包以及去掉默认的.gz 文件

1.vite打包情况介绍&#xff1a; 1.1vite在不进行任何配置的情况下&#xff0c;会将除开public的所有引用到资源打包编译添加哈希值至assets文件夹中&#xff08;非引用文件以及行内样式图片未被打包编译资源会被treeSharp直接忽略不打包&#xff09;&#xff0c;     1.2w…

SpringBoot框架之KOB项目 - 配置Mysql与注册登录模块(中)

修改Spring Security 登录验证模式 传统的验证登录模式 公开页面&#xff1a;输入url就可以直接访问授权页面&#xff1a;登录之后才可以访问 Jwt验证模式 容易实现跨域不需要在服务器端存储 对比于传统模式将所有的sessionId换成jwt token access token refresh token 过…

neo4j小白入门

1.建立几个学校的节点 1.1创建一个节点的Cypher命令 create (Variable:Lable {Key1:Value,Key2,Value2}) return Variable 1.2创建一个学校的节点 create (n:School{name:清华大学,code: 10003,establishmentDate:date ("1911-04-29")})return n 1.3一次创建几个…

在Markdown中实现内部查询

markdown实现内部查询 在想要跳转到的位置添加 <a idxxx></a> 标签&#xff0c;如下图&#xff1a; 然后按如下格式添加目录 [跳转文字](#id)&#xff1a; 如上操作即可实现markdown内部查询。 具体实现效果如下&#xff1a;

通过service访问Pod

假设Pod中的容器可能因为各种原因发生故障而死掉&#xff0c;Deployment等controller会通过动态创建和销毁Pod来保证应用整体的健壮性&#xff0c;换句话说&#xff0c;Pod是脆弱的&#xff0c;但应用是健壮的 每个Pod都有自己的Ip&#xff0c;当controller用新的Pod替代发生故…

seL4 Mapping(三)

官网链接: Mapping Mapping 这节课程主要是介绍seL4的虚存管理。 虚存 Virtual memory 除了用于操作硬件分页结构的内核原语之外&#xff0c;seL4不提供虚拟内存管理。用户必须为创建中间级分页结构&#xff0c;映射页面以及取消映射页面提供服务。 用户可以随意的定义他们…

6种常见位运算符+异或运算符的使用(加密、解密)

一、位运算符 位运算符进行的是整数与整数之间的运算 1、右移运算符&#xff1a;>> &#xff08;1&#xff09;相当于对整数除以2 &#xff08;2&#xff09;举例&#xff1a; int num 2; System.out.println(num >> 1); 2、左移运算符&#xff1a;<< …

opencv-python学习笔记10-图像形态学处理

目录 一、基本概念&#xff1a; &#xff08;1&#xff09;结构元素&#xff08;Structuring Element&#xff09;&#xff1a; &#xff08;2&#xff09;膨胀&#xff08;Dilation&#xff09;&#xff1a; &#xff08;3&#xff09;腐蚀&#xff08;Erosion&#xff0…

巧用解压软件:高效处理云盘文件

百度网盘支持多种文件格式&#xff0c;包括文本文件格式如.txt、.doc、.docx 等&#xff1b;图片文件格式如.jpg、.png 等&#xff1b;音频文件格式如.mp3、.wav 等&#xff1b;视频文件格式如.avi、.mp4 等&#xff1b;压缩文件格式如.zip、.rar、.7z 等&#xff1b;可执行文件…

进度条QProgressBar

进度条控价&#xff0c;用来只是任务的完成情况 值 包括当前值、最大值、最小值 // 获取和设置当前值 int value() const; void setValue(int);// 获取和设置最大值 int maximum() const; void setMaximum(int);// 获取和设置最小值 int minimum() const; void setMinimum(i…

http增删改查四种请求方式操纵数据库

注意&#xff1a;在manage.py项目入口文件中的路由配置里&#xff0c;返回响应的 return语句后面的代码不会执行&#xff0c;所以路由配置中每个模块代码要想都执行&#xff0c;不能出现return 激活虚拟环境&#xff1a;venv(我的虚拟环境名称&#xff09;\Scripts\activate …