mybatis-plus使用
目录
1. 快速开始
1. 创建user表
2. 插入几条数据
3. 创建一个新的springboot项目
4. 导入mybatis-plus依赖
5. 在配置文件中进行配置
6. 编写实体类
7. 编写Mapper 接口类
8. 添加 @MapperScan 注解
9. 测试
编辑2. CRUD
1. 插入一条语句
2. 根据主键id删除一条记录
3. 根据条件构造器wrapper进行删除
4. 根据主键id进行查找
5. 根据主键id进行批量查找
6. 根据map中指定的列名和列值进行等值匹配查找
7. 根据 wrapper 条件查询
8. 根据主键id进行更新
9. 根据条件构造器wrapper进行更新
编辑3. 分页
0. 配置分页插件
1. 通过selectPage方法分页
2. 通过selectMapsPage方法分页
4. 自增列的值(generated key)
5. 联接查询
1. 创建一个新表(order表)并插入数据
2. 创建Order实体类
3. 联合查询
4. 测试
1. 快速开始
1. 创建user表
DROP TABLE IF EXISTS `user`;
CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,password VARCHAR(50) NOT NULL
);
2. 插入几条数据
INSERT INTO user (username, password) VALUES ('alice', 'password123');
INSERT INTO user (username, password) VALUES ('bob', 'securepass');
INSERT INTO user (username, password) VALUES ('charlie', 'mypassword');
3. 创建一个新的springboot项目

4. 导入mybatis-plus依赖
<!-- springboot3 导入以下依赖 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.7</version></dependency><!-- springboot2 导入以下依赖 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version></dependency>
导入mysql依赖
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency>
导入lombok依赖
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
5. 在配置文件中进行配置
application.properties
# 数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?serverTimezone=GMT%2B8
spring.datasource.username=账号
spring.datasource.password=密码# MyBatis-Plus 配置
# 指定MyBatis-Plus使用StdOutImpl作为日志实现,这意味着SQL日志将输出到标准输出(通常是控制台)。
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
或 application.yml
# 数据库配置
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/数据库名?serverTimezone=GMT%2B8username: 账号password: 密码# MyBatis-Plus 配置
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
6. 编写实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {private Integer id;private String username;private String password;
}
7. 编写Mapper 接口类
public interface UserMapper extends BaseMapper<User> {
}
8. 添加 @MapperScan 注解
在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹
@SpringBootApplication
@MapperScan("com.huan.mybatis_plus_learn.mappers")//Mapper所在的类路径
public class MybatisPlusLearnApplication {public static void main(String[] args) {SpringApplication.run(MybatisPlusLearnApplication.class, args);}}
9. 测试
@SpringBootTest
class MybatisPlusLearnApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void testSelect() {System.out.println(("----- selectAll method test ------"));List<User> userList = userMapper.selectList(null);Assert.isTrue(3 == userList.size(), "");for (User user : userList){System.out.println(user);}}
}
控制台输出:

2. CRUD
以下的方法都是BaseMapper接口中默认有的,直接使用即可。
1. 插入一条语句
直接使用BaseMapper接口中的insert(T entity)方法。
@Testpublic void testInsert(){User user = new User();user.setUsername("huan");user.setPassword("123456");int insert = userMapper.insert(user);System.out.println(insert);}
但测试发现,插入的字段的id为负数。

要使id字段正常自增,需要给实体类的id字段添加@TableId(value = "id", type = IdType.AUTO)注释,用于标识数据库表的主键字段,IdType.AUTO 表示主键值由数据库自动生成,通常用于自增主键。
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName
@ToString
public class User {//添加注释@TableId(value = "id", type = IdType.AUTO)private Integer id;private String username;private String password;
}
2. 根据主键id删除一条记录
@Testpublic void testDeleteById(){int delete = userMapper.deleteById(1);System.out.println(delete);}
控制台输出。

数据库内容。

3. 根据条件构造器wrapper进行删除
@Testpublic void testDelete(){// 创建条件构造器QueryWrapper<User> queryWrapper = new QueryWrapper<>();// 添加条件:用户名为 "huan"queryWrapper.eq("username", "huan");// 执行删除操作int deleteCount = userMapper.delete(queryWrapper);System.out.println("删除了 " + deleteCount + " 条记录");}
控制台输出。

4. 根据主键id进行查找
@Testpublic void testSelectById(){User user = userMapper.selectById(2);System.out.println(user);Assert.notNull(user, "User must not be null");}
控制台输出。

5. 根据主键id进行批量查找
@Testpublic void testSelectBatchIds(){List<User> users = userMapper.selectBatchIds(List.of(5, 2, 3));users.forEach(user -> System.out.println(user));}
控制台输出。

6. 根据map中指定的列名和列值进行等值匹配查找
@Testpublic void testSelectByMap(){List<User> users = userMapper.selectByMap(Map.of("username", "huan", "password", "123456"));users.forEach(user -> System.out.println(user));}
控制台输出。

7. 根据 wrapper 条件查询
@Testpublic void testSelectList(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();//指定查询字段为id,usernamequeryWrapper.select("id", "username");List<User> users = userMapper.selectList(queryWrapper);users.forEach(user -> System.out.println(user));}
控制台输出。

8. 根据主键id进行更新
@Testpublic void testUpdateById(){User user = new User();user.setId(5);user.setUsername("huan");user.setPassword("huan");int update = userMapper.updateById(user);User user1 = userMapper.selectById(5);System.out.println(user1);}
控制台输出。

9. 根据条件构造器wrapper进行更新
@Testpublic void testUpdate(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();// 指定查询条件 username="huan"queryWrapper.eq("username", "huan");queryWrapper.select("id", "username");User user = new User();user.setUsername("huan1");userMapper.update(user, queryWrapper);//这里查询不到,因为huan改为了huan1userMapper.selectList(queryWrapper).forEach(u -> System.out.println(user));}
控制台输出。

3. 分页
0. 配置分页插件
@Configuration
@ComponentScan
public class MybatisPlusConfig {/*** 添加分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypereturn interceptor;}
}
1. 通过selectPage方法分页
@Testpublic void testSelectPage(){// 创建分页对象 当前页,每页数据数Page<User> page = new Page<>(2,2);// 执行分页查询IPage<User> userPage = userMapper.selectPage(page, null);// 获取查询结果List<User> users = userPage.getRecords();long total = userPage.getTotal();long pages = userPage.getPages();// 输出查询结果System.out.println("总记录数:" + total);System.out.println("总页数:" + pages);users.forEach(user -> System.out.println(user));}
控制台输出。

2. 通过selectMapsPage方法分页
该方法与selectPage的区别在于,selectMapsPage方法会将查询结果封装为一个Map<String,Object>。
@Testpublic void testSelectMapsPage(){// 创建分页对象Page<Map<String, Object>> page = new Page<>(2, 2);// 执行分页查询IPage<Map<String, Object>> userPage = userMapper.selectMapsPage(page, null);// 获取查询结果List<Map<String, Object>> users = userPage.getRecords();long total = userPage.getTotal();long pages = userPage.getPages();// 输出查询结果System.out.println("总记录数:" + total);System.out.println("总页数:" + pages);users.forEach(user -> System.out.println(user));}
控制台输出。

4. 自增列的值(generated key)
在 MyBatis-Plus 中,insert 方法可以直接获取自增列的值(generated key)。当你在实体类中使用 @TableId 注解并设置 type 为 IdType.AUTO 时,MyBatis-Plus 会自动处理自增主键的生成和赋值。
也就是说,MyBatis-Plus 会自动将主键的值赋值给实体类的对应字段,我们可以通过get方法直接取到主键的值。
@Testpublic void testInsert(){User user = new User();user.setUsername("huan");user.setPassword("123456");int insert = userMapper.insert(user);System.out.println("插入后的用户ID:" + user.getId());}
控制台输出。

5. 联接查询
1. 创建一个新表(order表)并插入数据
CREATE TABLE `order` (id BIGINT AUTO_INCREMENT PRIMARY KEY,user_id BIGINT NOT NULL,goods_name VARCHAR(255) NOT NULL,goods_price DECIMAL(10, 2) NOT NULL
);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (2, 'Laptop', 999.99);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (2, 'Smartphone', 499.99);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (3, 'Headphones', 199.99);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (5, 'Monitor', 299.99);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (2, 'Keyboard', 49.99);
2. 创建Order实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Order {@TableId(value = "id", type = IdType.AUTO)private Integer id;private Integer userId;private String goodsName;private Double goodsPrice;
}
3. 联合查询
在Mapper中添加联合查询的方法,通过自定义 SQL 语句和@Select注解来实现。
public interface UserMapper extends BaseMapper<User> {//联合查询//查询user表和order表中user表中id和order表中id相等的数据//u.* 表示user表的所有字段@Select("SELECT u.*, o.goods_name, o.goods_price FROM user u INNER JOIN `order` o ON u.id = o.user_id WHERE u.id = #{userId}")List<Map<String, Object>> selectUserWithOrders(@Param("userId") Integer userId);
}
4. 测试
@Testpublic void testSelectUserWithOrders(){List<Map<String, Object>> userWithOrders = userMapper.selectUserWithOrders(2);userWithOrders.forEach(user -> System.out.println(user));}
控制台输出。

干饭去....

参考链接:
1. mybatis-plus官网
2. https://juejin.cn/post/6961721367846715428
相关文章:
mybatis-plus使用
目录 1. 快速开始 1. 创建user表 2. 插入几条数据 3. 创建一个新的springboot项目 4. 导入mybatis-plus依赖 5. 在配置文件中进行配置 6. 编写实体类 7. 编写Mapper 接口类 8. 添加 MapperScan 注解 9. 测试 编辑2. CRUD 1. 插入一条语句 2. 根据主键id删除一条记录 3. 根据…...
ant-design-vue快速上手指南及排坑攻略
前言 ant-design-vue是Ant Design的Vue实现,旨在为Vue用户提供一套企业级的UI设计语言。本文将带你快速上手ant-design-vue,并在实践中分享一些常见的坑及解决方法。遵循本文档,让你轻松搭建优雅的Vue应用。 一、环境准备 在开始之前&…...
【GitLab】使用 Docker 安装 3:gitlab-ce:17.3.0-ce.0 配置
参考阿里云的教程docker的重启 sudo systemctl daemon-reload sudo systemctl restart docker配置 –publish 8443:443 --publish 8084:80 --publish 22:22 sudo docker ps -a 當容器狀態為healthy時,說明GitLab容器已經正常啟動。 root@k8s-master-pfsrv:~...
多线程(4)——单例模式、阻塞队列、线程池、定时器
1. 多线程案例 1.1 单例模式 单例模式能保证某个类在程序中只存在唯一一份实例,不会创建出多个实例(这一点在很多场景上都需要,比如 JDBC 中的 DataSource 实例就只需要一个 tip:设计模式就是编写代码过程中的 “软性约束”&am…...
告别电量焦虑,高性能65W PD快充芯片HUSB380A打造梦中情【头】
市面上的充电器越来越卷,让人眼花缭乱。压力同样也给到了快充芯片行业,要在激烈的市场竞争中脱颖而出,快充芯片必须集高功率、高性价比与广泛的兼容性等于一身。 基于此,慧能泰推出了新一代高性能PD Source产品——HUSB380A。 图…...
vulnhub靶场 — NARAK
下载地址:https://download.vulnhub.com/ha/narak.ova Description:Narak is the Hindu equivalent of Hell. You are in the pit with the Lord of Hell himself. Can you use your hacking skills to get out of the Narak? Burning walls and demons are around every cor…...
RabbitMQ如何保证消息不丢失
RabbitMQ消息丢失的三种情况 第一种:生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。 第二种:RabbitMQ 弄丢了数据。MQ还没有持久化自己挂了。 第三种…...
(亲测有效)SpringBoot项目集成腾讯云COS对象存储(1)
目录 一、腾讯云对象存储使用 1、创建Bucket 2、使用web控制台上传和浏览文件 3、创建API秘钥 二、代码对接腾讯云COS(以Java为例) 1、初始化客户端 2、填写配置文件 3、通用能力类 文件上传 测试 一、腾讯云对象存储使用 1、创建Bucket &am…...
无人机之故障排除篇
一、识别故障 掌握基本的无人机系统知识,遵循“先易后难、先外后内、先软件后硬件”的原则进行故障识别。一旦发现故障,立即停止飞行,避免进一步损坏。 二、机械部件维修 对于机身裂痕、螺旋桨损坏等情况,根据损坏程度更换相应部…...
深入理解Python常见数据类型处理
目录 概述数字类型 整数(int)浮点数(float)复数(complex) 字符串(str) 字符串基本操作字符串方法 列表(list) 列表基本操作列表方法列表推导式 元组…...
最佳实践:CI/CD交付模式下的运维展望丨IDCF
李洪锋 启迪万众数字技术(广州)有限公司 ,产品研发中心-系统运维部、研发效能(DevOps)工程师(中级)课程学员 一、DevOps现状 据云计算产业联盟《中国DevOps现状调查报告2023》显示,国内DevOps 落地成熟度…...
Flat Ads:开发者如何应对全球手游市场的洗牌与转型
2023年下半年至2024年上半年,中国手游的海外市场表现经历了显著变化,开发者要如何应对全球手游市场的洗牌与转型?本篇文章我们将结合相关行业白皮书的最新数据对中国手游出海表现进行分析与洞察。 一、中国手游海外市场表现 根据Sensor Tower《2024年海外手游市场洞察》最新…...
ai取名软件上哪找?一文揭秘5大ai取名生成器
在这个世界上,每一个新生命的到来都是一份奇迹,无论是一个新生儿的第一声啼哭,还是一只宠物的第一次摇尾巴,都充满了无限的希望和喜悦。 然而,给这个小生命起一个响亮、独特且富有意义的名字,往往让人煞费…...
ppt转换成pdf文件,这5个方法一键搞定!小白也能上手~
不管是工作上还是学习上,我们都会遇到转换文档格式的问题。比如常见的pdf转word,ppt转pdf,图片转pdf等。 很多软件都有自带的转换功能可以实现,但是需要保证转换后不乱码,且清晰度足够的方法还是少见的。本文整理了几个…...
中国每个软件创业者都是这个时代的“黑悟空”
作者 | 白鲸开源CEO 郭炜 我作为一个具有30游龄而20年都不碰游戏的游戏玩家,最近为了《黑神话:悟空》(简称,黑悟空),不但花重金更新了显卡,还第一次下载了Steam并绑定了支付,为的就是支持这个第…...
解决Qt多线程中fromRawData函数生成的QByteArray数据不一致问题
解决Qt多线程中fromRawData函数生成的QByteArray数据不一致问题 目录 🔔 问题背景📄 问题代码❓ 问题描述🩺 问题分析✔ 解决方案 🔔 问题背景 在开发一个使用Qt框架的多线程应用程序时,我们遇到了一个棘手的问题&…...
datax关于postsql数据增量迁移的问题
看官方文档是不支持的 数据源及同步方案_大数据开发治理平台 DataWorks(DataWorks)-阿里云帮助中心 (aliyun.com) 看了下源码有个postsqlwriter 看了下也就拼接sql 将 PostgresqlWriter中的不允许更新先注释了 让他过去先 然后看到 WriterUtil中的对应方法 getWriteTemplat…...
【Go】实现字符切片零拷贝开销转为字符串
package mainimport ("fmt""unsafe" )func main() {bytes : []byte("hello world")s : *(*string)(unsafe.Pointer(&bytes))fmt.Println(s)bytes[0] Hfmt.Println(s) }slice的底层结构是底层数组、len字段、cap字段。string的底层结构是底层…...
[sqlserver][sql]sqlserver查询执行过的历史sql
SQL是一个针对SQL Server数据库的查询执行过的历史 select * from (SELECT *FROM sys.dm_exec_query_stats QS CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) ST ) a where a.creation_time >2018-07-18 17:00:00 and charindex(delete from ckcdlist ,text)>0 an…...
python中n次方怎么表示
Python中的n次方用pow()方法来表示,pow()方法返回 xy(x的y次方)的值。 语法 以下是 math 模块 pow() 方法的语法: import math math.pow( x, y ) 内置的 pow() 方法 pow(x, y[, z]) 函数是计算x的y次方,如果z在存在&…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
