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 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 曼亿点 原创 👨💻 收录于专栏:…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...

高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...