MyBatis-Plus高级用法:最优化持久层开发

MyBatis-Plus 是 MyBatis 的增强工具,旨在简化开发、提高效率并保持 MyBatis 的灵活性。本文将详细介绍 MyBatis-Plus 的高级用法,帮助开发者最优化持久层开发。

一、MyBatis-Plus 简介

MyBatis-Plus 是一个 ORM 框架,提供了 CRUD 接口、条件构造器、代码生成器等功能,简化了常见的持久层开发工作。

核心功能

  • CRUD 接口:简单的增删改查操作。
  • 条件构造器:动态生成 SQL 查询条件。
  • 分页插件:简化分页查询操作。
  • 逻辑删除:轻松实现软删除功能。
  • 代码生成器:自动生成实体类、Mapper 接口等代码。

二、快速入门

1. 添加依赖

pom.xml 中添加 MyBatis-Plus 依赖:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3.4</version>
</dependency>
​

2. 配置数据源

application.yml 中配置数据源:

spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
​

3. 创建实体类

创建一个实体类 User

@Data
@TableName("user")
public class User {private Long id;private String name;private Integer age;private String email;
}
​

4. 创建 Mapper 接口

创建 Mapper 接口并继承 BaseMapper

public interface UserMapper extends BaseMapper<User> {
}
​

5. 编写服务类

编写服务类使用 UserMapper

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public List<User> getAllUsers() {return userMapper.selectList(null);}
}
​

6. 编写控制器

编写控制器调用服务类:

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/list")public List<User> list() {return userService.getAllUsers();}
}
​

三、高级用法

1. 条件构造器

MyBatis-Plus 提供了 QueryWrapperUpdateWrapper 用于动态构造查询和更新条件。

1.1 QueryWrapper

QueryWrapper 用于构建查询条件:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John");
List<User> users = userMapper.selectList(queryWrapper);
​
1.2 UpdateWrapper

UpdateWrapper 用于构建更新条件:

UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("name", "John").set("age", 30);
userMapper.update(null, updateWrapper);
​

2. 分页插件

分页插件简化了分页查询:

@Autowired
private UserMapper userMapper;public IPage<User> getUsersByPage(int pageNum, int pageSize) {Page<User> page = new Page<>(pageNum, pageSize);return userMapper.selectPage(page, null);
}
​

3. 逻辑删除

逻辑删除不删除数据,只是标记为已删除。首先在实体类中配置逻辑删除字段:

@TableLogic
private Integer deleted;
​

application.yml 中启用逻辑删除:

mybatis-plus:global-config:db-config:logic-delete-value: 1logic-not-delete-value: 0
​

使用时直接调用 deleteById 方法即可:

userMapper.deleteById(1L);
​

4. 代码生成器

代码生成器自动生成实体类、Mapper 接口、Service 类和 Controller 类。以下是代码生成器的简单示例:

@Data
public class CodeGenerator {public static void main(String[] args) {AutoGenerator autoGenerator = new AutoGenerator();// 数据源配置DataSourceConfig dataSourceConfig = new DataSourceConfig();dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mydb");dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");dataSourceConfig.setUsername("root");dataSourceConfig.setPassword("root");autoGenerator.setDataSource(dataSourceConfig);// 包名配置PackageConfig packageConfig = new PackageConfig();packageConfig.setParent("com.example.demo");autoGenerator.setPackageInfo(packageConfig);// 策略配置StrategyConfig strategyConfig = new StrategyConfig();strategyConfig.setInclude("user"); // 表名strategyConfig.setNaming(NamingStrategy.underline_to_camel);strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);strategyConfig.setEntityLombokModel(true);autoGenerator.setStrategy(strategyConfig);autoGenerator.execute();}
}
​

5. 自定义 SQL 注入器

可以自定义 SQL 注入器,实现个性化需求。例如,添加一个批量插入的方法:

@Component
public class MySqlInjector extends AbstractSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass) {List<AbstractMethod> methodList = super.getMethodList(mapperClass);methodList.add(new InsertBatchSomeColumn());return methodList;}
}
​

四、最佳实践

1. 分层架构

建议遵循分层架构,将控制器、服务、数据访问层分开,提高代码的可维护性。

2. 统一异常处理

使用 @ControllerAdvice 统一处理异常,提升系统的健壮性。

3. 使用事务管理

在服务层使用 @Transactional 注解管理事务,确保数据一致性:

@Transactional
public void updateUser(User user) {userMapper.updateById(user);
}
​

4. 性能优化

  • 使用批量操作:对于大批量数据操作,使用 MyBatis-Plus 提供的批量操作接口,提高性能。
  • 索引优化:确保数据库中相关表和字段有适当的索引,提升查询性能。

五、总结

MyBatis-Plus 通过简化常见的持久层开发任务,提高了开发效率和代码的可维护性。通过合理使用条件构造器、分页插件、逻辑删除和代码生成器等高级功能,可以进一步优化持久层开发,提升系统性能和稳定性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++/Linux】TinyWebServer前置知识之IP协议详解

目录 IPv4地址 分类 IP数据报分片 IP 协议在传输数据报时&#xff0c;将数据报分为若干分片&#xff08;小数据报&#xff09;后进行传输&#xff0c;并在目的系统中进行重组&#xff0c;这一过程称为分片&#xff08;Fragmentation&#xff09;。 IP模块工作流程​编辑 I…

【办公类-22-05】20250601Python模拟点击鼠标上传CSDN12篇

、 背景需求: 每周为了获取流量券,每天上传2篇,获得1500流量券,每周共上传12篇,才能获得3000和500的券。之前我用UIBOT模拟上传12篇。 【办公类-22-04】20240418 UIBOT模拟上传每天两篇,获取流量券,并删除内容_csdn 每日任务流量券-CSDN博客文章浏览阅读863次,点赞18…

由浅入深一文详解同余原理

由浅入深一文详解同余原理 一、同余原理的基本概念1.1 同余的定义1.2 剩余类与完全剩余系 二、同余原理的基本性质2.1 自反性2.2 对称性2.3 传递性2.4 加减性2.5 乘性2.6 幂性 三、同余原理的运算与应用3.1 同余运算在计算中的应用3.2 密码学中的应用3.3 日期与周期问题 四、案…

ArcGIS Pro 创建渔网格网过大,只有几个格网的解决方案

之前用ArcGIS Pro创建渔网的时候&#xff0c;发现创建出来格网过大&#xff0c;只有几个格网。 后来查阅资料&#xff0c;发现是坐标不对&#xff0c;导致设置格网大小时单位为度&#xff0c;而不是米&#xff0c;因此需要进行坐标系转换&#xff0c;网上有很多资料讲了ArcGIS …

【MFC】初识MFC

目录 01 模态和非模态对话框 02 静态文本 static text 01 模态和非模态对话框 首先我们需要知道模态对话框和非模态对话框的区别&#xff1a; 模态对话框是一种阻塞时对话框&#xff0c;它会阻止用户与应用程序的其他部分进行交互&#xff0c;直到用户与该对话框进行交互并关…

【HW系列】—安全设备介绍(开源蜜罐的安装以及使用指南)

文章目录 蜜罐1. 什么是蜜罐&#xff1f;2. 开源蜜罐搭建与使用3. HFish 开源蜜罐详解安装步骤使用指南关闭方法 总结 蜜罐 1. 什么是蜜罐&#xff1f; 蜜罐&#xff08;Honeypot&#xff09;是一种主动防御技术&#xff0c;通过模拟存在漏洞的系统或服务&#xff08;如数据库…

TI硬件笔试面试题型解析上

本专栏预计更新60期左右。当前第14期. 这个系列通过在国内外网上搜索大厂公开的笔试和面试题目,然后构造相关的知识点矩阵,让大家对核心的知识点有更深的认识,这个过程虽然耗时费力,但大厂的很多题目(包括模拟题)确实非常巧妙,很有代表性。由于官方没有发布过这样的题库…

Python打卡训练营Day43

DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 数据集地址&#xff1a;Lung Nodule Malignancy 肺结核良恶性判断 进阶&#xff1a;并拆分成多个文件 import os import pandas as pd import numpy as np from…

悲观锁与乐观锁:并发编程中的两种核心控制策略详解

在并发编程中&#xff0c;悲观锁和乐观锁是两种不同的并发控制策略&#xff0c;用于解决多个线程或进程对共享资源的并发访问问题。下面将详细介绍它们的概念、实现方式以及优缺点。 悲观锁 概念 悲观锁认为在并发环境下&#xff0c;多个线程或进程对共享资源的访问大概率会发…

python 如何写4或5的表达式

python写4或5的表达式的方法&#xff1a; python中和是用“and”语句&#xff0c;或是用“or”语句。那么4或5的表达式为“4 or 5” 具体示例如下&#xff1a; 执行结果&#xff1a;

麻省理工新突破:家庭场景下机器人实现精准控制,real-to-sim-to-real学习助力

麻省理工学院电气工程与计算机科学系Pulkit Agrawal教授&#xff0c;介绍了一种新方法&#xff0c;可以让机器人在扫描的家庭环境模拟中接受训练&#xff0c;为任何人都可以实现定制的家庭自动化铺平了道路。 本文将探讨通过Franka机器人在虚拟环境中训练的特点&#xff0c;研…

Linux程序管理练习题

Linux程序管理100题 一、Linux程序与进程&#xff08;1-15&#xff09; 程序、进程、线程的本质区别是什么&#xff1f; 答案&#xff1a;程序是静态指令集&#xff0c;进程是运行中的程序实例&#xff0c;线程是进程内的执行单元 进程的并发性和交往性体现在哪些方面&#xf…

虚幻基础:模型

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 资源模型&#xff1a;骨架/骨骼模型动画&#xff1a;一系列姿势补帧&#xff1a;只需设定关键姿势&#xff0c;则系统在关键帧姿势之间自动生成动画。姿势的变换&#xff1a;即骨骼的变换 动画蓝图&#xff1a;执行…

《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡

《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡 第一节 从康盛创想到腾讯收购&#xff1a;PC时代的辉煌 1.1 Discuz! 的诞生&#xff1a;康盛创想的开源梦想 2001年&#xff0c;中国互联网正处于萌芽阶段&#xff0c;个人网站和论坛开始兴起。…

如何打包conda环境从一台电脑到另外一台电脑

在 Ubuntu 系统下&#xff0c;使用的是 VSCode 和 Conda 环境开发项目&#xff0c;想要将整个 Conda 环境从一台电脑迁移到另一台电脑&#xff0c;可以通过以下步骤来实现打包和导入&#xff1a; ✅ 一、在原电脑上导出 Conda 环境 1. 激活你要导出的环境 conda activate you…

2025GDCPC广东省赛游记(附赛时代码)

我觉得算是给swan的自证之旅画上一个句号吧...说实话HDU给我带来的不止是排位上的压力&#xff0c;更多的是对自己能力的怀疑&#xff0c;特别是pluto不明说但是我很清楚的看不起&#xff08;没有责备本人的意思&#xff09;&#xff0c;evil和jxj之类的总感觉看到我就是看小丑…

MySQL 修改数据的全链路流程

MySQL 修改数据的全链路流程&#xff08;InnoDB&#xff09; 全链路流程图关键步骤详解1. 建立连接阶段2.SQL解析与优化3. InnoDB内存操作4. 日志记录过程5. 二阶段提交&#xff08;2PC&#xff09; 磁盘同步机制1. Redo Log刷盘策略&#xff08;innodb_flush_log_at_trx_commi…

兰亭妙微十六年高水准交互设计公司

北京兰亭妙微&#xff08;蓝蓝设计&#xff09;成立于 2008 年&#xff08;前身为设计工作室&#xff0c;2011 年正式注册&#xff09;&#xff0c;由清华团队主创&#xff0c;专注软件和互联网 UI/UE 设计开发 16 年。我们提供从需求调研、界面设计到开发落地的全流程服务&…

【脚本 完全参数化的通用 APT 源配置方案-Debian/Ubuntu】

通过脚本在 Debian/Ubuntu 系统上一键切换 APT 源 如Dockerfile中 使用某个源&#xff08;比如 aliyun&#xff09; 假设你的目录结构是&#xff1a; . ├── Dockerfile └── switch-apt-source.shFROM ubuntu:22.04# 把脚本拷贝到镜像中 COPY switch-apt-source.sh /us…

学习日记-day20-6.1

完成目标&#xff1a; 知识点&#xff1a; 1.集合_Collections集合工具类 方法:static <T> boolean addAll(Collection<? super T> c, T... elements)->批量添加元素 static void shuffle(List<?> list) ->将集合中的元素顺序打乱static <T>…