MyBatis-Plus:快速入门
1. 概念
MyBatis-Plus(简称 MP)是一个MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。其突出的特性如下:
* **无侵入**:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
* **强大的 CRUD 操作**:内置通用 Mapper、通用 Service,提供了大量的通用的CRUD方法,因此可以省去大量手写sql的语句的工作。
* **条件构造器**:提供了强大的条件构造器,可以构造各种复杂的查询条件,以应对各种复杂查询。
* **内置分页插件**:配置好插件之后,写分页等同于普通 List 查询,无需关注分页逻辑。
2. 与springboot集成
导入依赖
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.2</version>
</dependency>
3. 创建实体类
@Data
@TableName("user")
public class User {@TableId(value = "id", type = IdType.AUTO)private Long id;@TableField("name")private String name;@TableField("age")private Integer age;@TableField("email")private String email;
}
* @TableName`:表名注解,用于标识实体类所对应的表
* `value`:用于声明表名
* `@TableId`:主键注解,用于标识主键字段
* `value`:用于声明主键的字段名
* `type`:用于声明主键的生成策略,常用的策略有`AUTO`、`ASSIGN_UUID`、`INPUT`等等
* `@TableField`:普通字段注解,用于标识属性所对应的表字段
* `value`:用于声明普通字段的字段名
4. 通用Mapper
1. 创建Mapper接口,并继承由Mybatis-plus提供的BaseMapper<T>接口
@Mapper
public interface UserMapper extends BaseMapper<User> {IPage<User> selectUserPage(IPage<User> page);
}
若Mapper接口过多,可不用逐一配置`@Mapper`注解,而使用`@MapperScan`注解指定包扫描路径进行统一管理,例如
@SpringBootApplication
@MapperScan("com.itgyl.mapper")
public class HelloMpApplication {public static void main(String[] args) {SpringApplication.run(HelloMpApplication.class, args);}}
2. 测试Mapper
@SpringBootTest
class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testpublic void testSelectUser() {List<User> users = userMapper.selectList(null);users.forEach(System.out::println);Long count = userMapper.selectCount(null);System.out.println("count=" + count);}
}
5. 通用Service
通用Service进一步封装了通用Mapper的CRUD方法,并提供了例如`saveOrUpdate`、`saveBatch`等高级方法。
1.定义service接口
//定义业务接口,需要继承IService类
public interface UserService extends IService<User> {
}
2.创建service实体类
//服务层
@Service
//mybatis-plus:业务实现类需继承ServiceImpl类,并将Mapper接口类和pojo类传入
//底层是将Mapper类进一步封装而来使得业务层直接调用
//并且实现业务接口类,即使得控制层调用业务方法也形成规范
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {}
测试
@SpringBootTest
class UserServiceImplTest {@Autowiredprivate UserServiceImpl userService;@Testpublic void testUserService() {Optional<User> optById = userService.getOptById(1);System.out.println(optById);}
}
6. 条件构造器
@SpringBootTest
public class WrapperTest {@AutowiredUserService userService;@Autowiredprivate ServiceImpl service;//QueryWrapper条件构造器,通过该构造器构造查询的过滤条件@Testpublic void testQueryWrapper() {//wrapper会将过滤条件添加到sql语句中//1.查询name=Tom的数据QueryWrapper<User> queryWrapper1 = new QueryWrapper<>();queryWrapper1.eq("name", "Tom");//2.模糊匹配QueryWrapper<User> queryWrapper2 = new QueryWrapper<>();queryWrapper2.like("email", ".com");//3.根据年龄降序排序并将结果打印QueryWrapper<User> queryWrapper3 = new QueryWrapper<>();queryWrapper3.orderByDesc("age");//4.查询年龄大于等于20小于等于30QueryWrapper<User> queryWrapper4 = new QueryWrapper<>();queryWrapper4.ge("age", 20).le("age", 30);//5.查询年龄小于20或者大于30的用户数据QueryWrapper<User> queryWrapper5 = new QueryWrapper<>();queryWrapper5.le("age", 20).or().ge("age", 30);//6.查询以.com结尾 and (age < 20 or age > 30)//and里面传递参数为要过滤的条件QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like("email", ".com").and(QueryWrapper -> QueryWrapper.le("age", 20).or().ge("age", 30));List list = service.list(queryWrapper);list.forEach(System.out::println);}//UpdateWrapper更新删除的条件构造器@Testpublic void testUpdateWrapper() {UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();updateWrapper.eq("name", "Tom").set("name", "ESon");boolean update = service.update(updateWrapper);System.out.println("update=" + update);}//LambdaQueryWrapper构造器,里面通过方法引用传递参数//优点:减少手敲字段带来不必要的错误,提高开发效率@Testpublic void testLambdaQueryWrapper() {LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.eq(User :: getName, "ESon");List<User> list = userService.list(lambdaQueryWrapper);list.forEach(System.out :: println);}//LambdaUpdateWrapper构造器@Testpublic void testLambdaUpdateWrapper() {LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();lambdaUpdateWrapper.eq(User :: getName, "ESon").set(User :: getName, "Tom");boolean update = userService.update(lambdaUpdateWrapper);System.out.println("update=" + update);}
}
7. 分页插件
1.配置分页插件
@Configuration
public class MPConfiguration {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}
核心
| 属性名 | 类型 | 默认值 | 描述 |
| ------- | ---- | --------- | ---------------------- |
| records | List | emptyList | 查询数据列表 |
| total | Long | 0 | 查询列表总记录数 |
| size | Long | 10 | 每页显示条数,默认`10` |
| current | Long | 1 | 当前页 |分页对象既作为分页查询的参数,也作为分页查询的返回结果,当作为查询参数时,通常只需提供`current`和`size`属性,如下
```java
IPage<T> page = new Page<>(current, size);
```注:`IPage`为分页接口,`Page`为`IPage`接口的一个实现类。
自定义分页查询
在Mapper接口中定义分页查询方法
@Mapper
public interface UserMapper extends BaseMapper<User> {IPage<User> selectUserPage(IPage<User> page);
}
创建`resources/mapper/UserMapper.xml`文件,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itgyl.mapper.UserMapper"><select id="selectUserPage" resultType="com.itgyl.entity.User">select *from user</select>
</mapper>
**注意**:Mybatis-Plus中`Mapper.xml`文件路径默认为:`classpath*:/mapper/**/*.xml`,可在`application.yml`中配置以下参数进行修改
mybatis-plus:mapper-locations: classpath*:/mapper/**/*.xml
2.测试
@SpringBootTest public class PageTest {@Autowiredprivate UserMapper userMapper;@Autowiredprivate UserService userService;@Testpublic void testPageService() {//创建分页对象,将按照传递的参数进行分页,此时展示第二页的两条数据(current:展示第几页 size:每页多少条数据)Page<User> userPage = new Page<>(2, 2);//调用通用service层方法进行分页查询,最终将分页结果返回Page<User> result = userService.page(userPage);result.getRecords().forEach(System.out::println);}@Testpublic void testPageMapper() {Page<User> userPage = new Page<>(2, 2);Page<User> result = userMapper.selectPage(userPage, null);result.getRecords().forEach(System.out::println);}//自定义分页查询,可用于处理复杂业务@Testpublic void testSelectPage() {Page<User> userPage = new Page<>(2,2);IPage<User> result = userMapper.selectUserPage(userPage);result.getRecords().forEach(System.out::println);} }
相关文章:
MyBatis-Plus:快速入门
1. 概念 MyBatis-Plus(简称 MP)是一个MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。其突出的特性如下: * **无侵入**:只做增强不做改变,引入它不会对现有…...
【高级篇】第9章 Elasticsearch 监控与故障排查
9.1 引言 在现代数据驱动的应用架构中,Elasticsearch不仅是海量数据索引和搜索的核心,其稳定性和性能直接影响到整个业务链路的健康度。因此,建立有效的监控体系和掌握故障排查技能是每一位Elasticsearch高级专家的必备能力。 9.2 监控工具:洞察与优化的利器 在Elastics…...
【前端】上传和下载zip文件,有进度条(el-progess)
文章目录 上传下载进度条 场景:要上传一个zip,调用接口,然后下载一个zip。调用接口的接口响应要显示在进度条中。 上传 上传用的是input原生控件,在页面中隐藏。accept"application/zip"限制只能上传zip。 点击button…...
2024年软件测试面试题,精选100+,附答案+文档
🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 Part1 1、你的测试职业发展是什么? 测试经验越多,测试能力越高。所以我…...
在vue项目的.gitignore文件忽略不想要提交到git仓库的文件
在Vue项目中,使用.gitignore文件来忽略不需要提交到Git仓库的文件是一个常见的做法。.gitignore文件包含了一系列的规则,这些规则告诉Git哪些文件或目录应该被忽略。以下是一些Vue项目中常用的.gitignore文件示例和具体规则说明: 示例 .gitig…...
时序(流式)图谱数据仓库AbutionGraph功能介绍-Streaming Graph OLAM Database
AbutionGraph是一款端到端的流式数据实时分析的图谱数据库,实时(流式写入实时、高QPS决策分析实时、流式预处理实时)表现在: 构建实时查询QPS响应时长与历史数据量无关的图模型;接入流式数据并实时更新图计算指标&…...
windows实现Grafana+Loki+loki4j轻量级日志系统,告别沉重的ELK
文章目录 Loki下载Loki下载安装Loki添加Loki数据源springboot日志推送 Loki下载 下载地址:https://github.com/grafana/loki/releases/ 找到loki-windows-amd64.exe.zip点击开始下载,我这里下载的2.9.9版本 Loki下载 下载地址:https://gr…...
跟《经济学人》学英文:2024年06月01日这期 The side-effects of the TikTok tussle
The side-effects of the TikTok tussle tussle:美 [ˈtəsəl] 激烈扭打;争夺 注意发音 side-effects:副作用;(side-effect的复数) As the app’s future hangs in the balance, the ramifications of …...
Ubuntu安装PostgreSQL
Ubuntu(在线版) 更新软件源 sudo apt-get update 添加PostgreSQL官方数字签名 wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - 将地址添加到系统的软件包源列表中 echo "deb http://apt.postgresql.org/pub/repos/a…...
【HarmonyOS NEXT】鸿蒙如何让List组件不满一屏时,还要能滑动和回弹
当List组件不满一屏时,还要能滑动和回弹,就向系统设置 - 移动网络 页面一样 List设置如下属性: .edgeEffect(EdgeEffect.Spring, {alwaysEnabled: true}) edgeEffect edgeEffect(value: EdgeEffect, options?: EdgeEffectOptions) 设置边缘滑动效果。…...
JDK-SPI-服务提供者接口
归档 GitHub: JDK-SPI-服务提供者接口 SPI 源码说明 java.util.ServiceLoader /*** 服务加载器:给定接口,查找实现类。实现可迭代接口 */ public final class ServiceLoader<S> implements Iterable<S> {/*** 返回 ServiceLoader 实例 *…...
【docker】容器内配置环境变量
背景: 我要把下面的环境变量写到bash脚本里,起名叫environment_start.sh。 目的: 用于每次进入容器dev_into.sh的时候,让系统获取到环境变量。 操作步骤: 先在容器外找个合适的位置写环境变量bash脚本,…...
Java 乐观锁与悲观锁
1. 前言 本节内容主要是对 Java 乐观锁与悲观锁进行更加深入的讲解,本节内容更加偏重于对乐观锁的讲解,因为 synchronized 悲观锁对于大部分学习者并不陌生,本节主要内容如下: 乐观锁与悲观锁的概念,之前有所讲解,这里用很小的篇幅进行知识的回顾,巩固;乐观锁与悲观锁…...
python学习2-数据结构与算法-链表
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指…...
项目一 nfs 共享服务器 Haproxy 代理 Keepalive 高可用集群
深入理解程序的数据存储 配置NFS服务器 配置ansible环境...
TCP粘包解决方法
一. 产生原因及解决方法 产生原因:TCP是面向连接、基于字节流的协议,其无边界标记。当服务端处理速度比不其接收速度时,就很容易产生粘包现象。 解决方法:目前主要有两种解决方法,一个是在内容中添加分割标识…...
高职人工智能专业实训课之“生成对抗网络(GAN)”
一、前言 生成对抗网络(GAN)作为人工智能领域的一项重要技术,已经在图像生成、风格迁移、数据增强等多个领域展现出巨大的潜力和应用价值。为了满足高职院校对GAN专业实训课程的需求,唯众人工智能教学实训凭借其前沿的教育技术平…...
【MySQL系列】隐式转换
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
亿发:信息化建设or面子工程?究竟什么才是真正的信息化解决方案
在现代企业的竞争中,信息化建设扮演着越来越重要的角色。信息化技术不仅是企业提升管理效率、优化运营模式的利器,更是企业在市场竞争中脱颖而出的关键。然而,许多企业在推进信息化的过程中,往往容易陷入“面子工程”的误区。那么…...
【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(1)
👨💻个人主页:开发者-曼亿点 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 曼亿点 原创 👨💻 收录于专栏:…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
