当前位置: 首页 > news >正文

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 注解并设置 typeIdType.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实现&#xff0c;旨在为Vue用户提供一套企业级的UI设计语言。本文将带你快速上手ant-design-vue&#xff0c;并在实践中分享一些常见的坑及解决方法。遵循本文档&#xff0c;让你轻松搭建优雅的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 单例模式 单例模式能保证某个类在程序中只存在唯一一份实例&#xff0c;不会创建出多个实例&#xff08;这一点在很多场景上都需要&#xff0c;比如 JDBC 中的 DataSource 实例就只需要一个 tip&#xff1a;设计模式就是编写代码过程中的 “软性约束”&am…...

告别电量焦虑,高性能65W PD快充芯片HUSB380A打造梦中情【头】

市面上的充电器越来越卷&#xff0c;让人眼花缭乱。压力同样也给到了快充芯片行业&#xff0c;要在激烈的市场竞争中脱颖而出&#xff0c;快充芯片必须集高功率、高性价比与广泛的兼容性等于一身。 基于此&#xff0c;慧能泰推出了新一代高性能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消息丢失的三种情况 第一种&#xff1a;生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候&#xff0c;可能数据就在半路给搞丢了&#xff0c;因为网络问题啥的&#xff0c;都有可能。 第二种&#xff1a;RabbitMQ 弄丢了数据。MQ还没有持久化自己挂了。 第三种…...

(亲测有效)SpringBoot项目集成腾讯云COS对象存储(1)

目录 一、腾讯云对象存储使用 1、创建Bucket 2、使用web控制台上传和浏览文件 3、创建API秘钥 二、代码对接腾讯云COS&#xff08;以Java为例&#xff09; 1、初始化客户端 2、填写配置文件 3、通用能力类 文件上传 测试 一、腾讯云对象存储使用 1、创建Bucket &am…...

无人机之故障排除篇

一、识别故障 掌握基本的无人机系统知识&#xff0c;遵循“先易后难、先外后内、先软件后硬件”的原则进行故障识别。一旦发现故障&#xff0c;立即停止飞行&#xff0c;避免进一步损坏。 二、机械部件维修 对于机身裂痕、螺旋桨损坏等情况&#xff0c;根据损坏程度更换相应部…...

深入理解Python常见数据类型处理

目录 概述数字类型 整数&#xff08;int&#xff09;浮点数&#xff08;float&#xff09;复数&#xff08;complex&#xff09; 字符串&#xff08;str&#xff09; 字符串基本操作字符串方法 列表&#xff08;list&#xff09; 列表基本操作列表方法列表推导式 元组&#xf…...

最佳实践:CI/CD交付模式下的运维展望丨IDCF

李洪锋 启迪万众数字技术(广州)有限公司 &#xff0c;产品研发中心-系统运维部、研发效能&#xff08;DevOps&#xff09;工程师&#xff08;中级&#xff09;课程学员 一、DevOps现状 据云计算产业联盟《中国DevOps现状调查报告2023》显示&#xff0c;国内DevOps 落地成熟度…...

Flat Ads:开发者如何应对全球手游市场的洗牌与转型

2023年下半年至2024年上半年,中国手游的海外市场表现经历了显著变化,开发者要如何应对全球手游市场的洗牌与转型?本篇文章我们将结合相关行业白皮书的最新数据对中国手游出海表现进行分析与洞察。 一、中国手游海外市场表现 根据Sensor Tower《2024年海外手游市场洞察》最新…...

ai取名软件上哪找?一文揭秘5大ai取名生成器

在这个世界上&#xff0c;每一个新生命的到来都是一份奇迹&#xff0c;无论是一个新生儿的第一声啼哭&#xff0c;还是一只宠物的第一次摇尾巴&#xff0c;都充满了无限的希望和喜悦。 然而&#xff0c;给这个小生命起一个响亮、独特且富有意义的名字&#xff0c;往往让人煞费…...

ppt转换成pdf文件,这5个方法一键搞定!小白也能上手~

不管是工作上还是学习上&#xff0c;我们都会遇到转换文档格式的问题。比如常见的pdf转word&#xff0c;ppt转pdf&#xff0c;图片转pdf等。 很多软件都有自带的转换功能可以实现&#xff0c;但是需要保证转换后不乱码&#xff0c;且清晰度足够的方法还是少见的。本文整理了几个…...

中国每个软件创业者都是这个时代的“黑悟空”

作者 | 白鲸开源CEO 郭炜 我作为一个具有30游龄而20年都不碰游戏的游戏玩家&#xff0c;最近为了《黑神话:悟空》&#xff08;简称&#xff0c;黑悟空&#xff09;&#xff0c;不但花重金更新了显卡&#xff0c;还第一次下载了Steam并绑定了支付&#xff0c;为的就是支持这个第…...

解决Qt多线程中fromRawData函数生成的QByteArray数据不一致问题

解决Qt多线程中fromRawData函数生成的QByteArray数据不一致问题 目录 &#x1f514; 问题背景&#x1f4c4; 问题代码❓ 问题描述&#x1fa7a; 问题分析✔ 解决方案 &#x1f514; 问题背景 在开发一个使用Qt框架的多线程应用程序时&#xff0c;我们遇到了一个棘手的问题&…...

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()方法来表示&#xff0c;pow()方法返回 xy&#xff08;x的y次方&#xff09;的值。 语法 以下是 math 模块 pow() 方法的语法&#xff1a; import math math.pow( x, y ) 内置的 pow() 方法 pow(x, y[, z]) 函数是计算x的y次方&#xff0c;如果z在存在&…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...