文章目录

  • 前言
  • 一、简单介绍MyBatis-Plus
    • 1.1 特性
    • 1.2 架构
  • 二、SpringBoot集成MyBatis-Plus
    • 2.1 项目搭建
    • 2.2 导入所需依赖
    • 2.3 配置application.yml
    • 2.4 创建实体类
    • 2.5 创建Mapper接口
    • 2.6 启动类配置
  • 三、DQL操作
    • 3.1 基础查询
    • 3.2 QueryWrapper查询
    • 3.3 LambdaQueryWrapper查询
    • 3.4 分页查询
  • 四、DML操作
    • 4.1 添加操作
    • 4.2 修改操作
    • 4.3 删除操作
  • 总结

前言

作为刚接触这款工具的小白,可以先到Mybatis-Plus官网,跟着文档熟悉具体的方法并手动跟着敲一遍,这样更容易理解掌握这项技术。
在这里插入图片描述

一、简单介绍MyBatis-Plus

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

1.1 特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence)
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

1.2 架构

在这里插入图片描述

MyBatis-Plus基于MyBatis进行开发,MyBatis-Plus启动注入了默认实现,对原生MyBatis的使用没有任何影响。

二、SpringBoot集成MyBatis-Plus

2.1 项目搭建

新建一个SpringBoot项目并选择用Maven来管理依赖:
在这里插入图片描述

2.2 导入所需依赖

新建好项目后,导入以下依赖:

	<dependencies><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.5</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.9</version></dependency></dependencies>

2.3 配置application.yml

server:port: 8080# 数据源
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTCusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSource# mybatis-plus配置
mybatis-plus:type-aliases-package: com.coldscholor.pojomapper-locations: classpath:mapper/*.xmlconfiguration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 日志
logging:level:com.coldscholor: debugpattern:date-format: yyyy-MM-dd HH:mm:ss

2.4 创建实体类

@Data
@TableName("user")
public class User {@TableId(type = IdType.AUTO)private Long id;@TableField(value = "name")private String name;private Integer age;private String email;private String password;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;@TableLogicprivate Integer deleted;
}

2.5 创建Mapper接口

public interface UserMapper extends BaseMapper<User> {// 继承BaseMapper后,无需编写mapper.xml文件,即可获得CRUD功能
}

2.6 启动类配置

@SpringBootApplication
@MapperScan("com.coldscholor.mapper")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

三、DQL操作

MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。

3.1 基础查询

@Test
public void testSelect() {// 查询所有用户List<User> userList = userMapper.selectList(null);userList.forEach(System.out::println);// 根据id查询User user = userMapper.selectById(1L);System.out.println(user);// 根据id批量查询List<Long> idList = Arrays.asList(1L, 2L, 3L);List<User> users = userMapper.selectBatchIds(idList);users.forEach(System.out::println);// 根据map条件查询Map<String, Object> map = new HashMap<>();map.put("name", "Tom");map.put("age", 20);List<User> userList2 = userMapper.selectByMap(map);userList2.forEach(System.out::println);
}

3.2 QueryWrapper查询

@Test
public void testQueryWrapper() {// 方式一:按条件查询QueryWrapper<User> qw = new QueryWrapper<>();qw.lt("age", 18);List<User> userList = userMapper.selectList(qw);System.out.println(userList);// 方式二:lambda格式按条件查询QueryWrapper<User> qw2 = new QueryWrapper<>();qw2.lambda().lt(User::getAge, 10);List<User> userList2 = userMapper.selectList(qw2);System.out.println(userList2);// 组合条件查询QueryWrapper<User> qw3 = new QueryWrapper<>();qw3.like("name", "o").between("age", 20, 30);List<User> userList3 = userMapper.selectList(qw3);System.out.println(userList3);
}

3.3 LambdaQueryWrapper查询

@Test
public void testLambdaQueryWrapper() {// 方式三:lambda格式按条件查询LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();lqw.lt(User::getAge, 10);List<User> userList = userMapper.selectList(lqw);System.out.println(userList);// 并且与或者关系LambdaQueryWrapper<User> lqw2 = new LambdaQueryWrapper<>();// 并且关系:10到30岁之间lqw2.lt(User::getAge, 30).gt(User::getAge, 10);// 或者关系:小于10岁或者大于30岁// lqw2.lt(User::getAge, 10).or().gt(User::getAge, 30);List<User> userList2 = userMapper.selectList(lqw2);System.out.println(userList2);// 条件查询LambdaQueryWrapper<User> lqw3 = new LambdaQueryWrapper<>();// 等同于=lqw3.eq(User::getName, "Jerry").eq(User::getPassword, "jerry123");User user = userMapper.selectOne(lqw3);System.out.println(user);// 范围查询LambdaQueryWrapper<User> lqw4 = new LambdaQueryWrapper<>();lqw4.between(User::getAge, 18, 30);List<User> userList4 = userMapper.selectList(lqw4);System.out.println(userList4);// 模糊查询LambdaQueryWrapper<User> lqw5 = new LambdaQueryWrapper<>();lqw5.like(User::getName, "Tom").likeLeft(User::getEmail, "qq.com");List<User> userList5 = userMapper.selectList(lqw5);System.out.println(userList5);// 排序LambdaQueryWrapper<User> lqw6 = new LambdaQueryWrapper<>();lqw6.orderByDesc(User::getAge).orderByAsc(User::getId);List<User> userList6 = userMapper.selectList(lqw6);System.out.println(userList6);
}

3.4 分页查询

  1. 配置分页插件:
@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}
}
  1. 分页查询测试:
@Test
public void testPage() {// 创建分页对象,参数1:当前页,参数2:每页记录数Page<User> page = new Page<>(1, 3);// 条件分页查询LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();lqw.ge(User::getAge, 20);Page<User> userPage = userMapper.selectPage(page, lqw);System.out.println("总记录数:" + userPage.getTotal());System.out.println("总页数:" + userPage.getPages());System.out.println("当前页:" + userPage.getCurrent());System.out.println("每页记录数:" + userPage.getSize());List<User> records = userPage.getRecords();records.forEach(System.out::println);
}

四、DML操作

4.1 添加操作

@Test
public void testInsert() {User user = new User();user.setName("张三");user.setAge(25);user.setEmail("zhangsan@example.com");user.setPassword("123456");int result = userMapper.insert(user);System.out.println("影响行数:" + result);System.out.println("用户ID:" + user.getId()); // 主键回填
}@Test
public void testInsertBatch() {List<User> userList = new ArrayList<>();for (int i = 0; i < 5; i++) {User user = new User();user.setName("用户" + i);user.setAge(20 + i);user.setEmail("user" + i + "@example.com");userList.add(user);}// 批量插入userService.saveBatch(userList);
}

4.2 修改操作

@Test
public void testUpdate() {// 根据id修改User user = new User();user.setId(1L);user.setName("李四");user.setAge(30);int result = userMapper.updateById(user);System.out.println("影响行数:" + result);// 条件修改User user2 = new User();user2.setAge(25);LambdaUpdateWrapper<User> luw = new LambdaUpdateWrapper<>();luw.eq(User::getName, "Tom").set(User::getAge, 25);int result2 = userMapper.update(user2, luw);System.out.println("影响行数:" + result2);
}

4.3 删除操作

@Test
public void testDelete() {// 根据id删除int result = userMapper.deleteById(1L);System.out.println("影响行数:" + result);// 批量删除List<Long> idList = Arrays.asList(2L, 3L, 4L);int result2 = userMapper.deleteBatchIds(idList);System.out.println("影响行数:" + result2);// 条件删除LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();lqw.eq(User::getName, "张三");int result3 = userMapper.delete(lqw);System.out.println("影响行数:" + result3);// map条件删除Map<String, Object> map = new HashMap<>();map.put("name", "李四");int result4 = userMapper.deleteByMap(map);System.out.println("影响行数:" + result4);
}

总结

MyBatis-Plus是基于MyBatis的增强工具,它在不改变原有功能的基础上提供了强大的CRUD操作能力。通过继承BaseMapper 接口,开发者无需编写 XML 配置即可获得基本的数据库操作功能;支持 QueryWrapperLambdaQueryWrapper进行灵活的条件查询。整体而言,MyBatis-Plus极大地提升了开发效率,是Spring Boot 项目中处理数据持久层的优秀选择。

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

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

相关文章

基于W55MH32Q-EVB 实现 HTTP 服务器配置 OLED 滚动显示信息

目录 1 前言 2 项目环境 2.1 硬件准备 2.2 软件环境 3.硬件连接和方案 3.1 硬件连接 3.2 方案图示 4.例程修改 1 前言 HTTP&#xff08;超文本传输协议&#xff0c;HyperText Transfer Protocol&#xff09;是一种用于分布式、协作式、超媒体信息系统的应用层协议&#xff0c; …

YggJS RLogin暗黑霓虹主题登录注册页面 版本:v0.1.1

项目介绍 yggjs_rlogin 是一个专注于 React 登录/注册页面的组件库。本文档介绍“暗黑霓虹”主题&#xff1a;#111 暗色背景 青蓝霓虹描边输入框 赛博朋克光效按钮。 安装说明 安装&#xff1a;pnpm add yggjs_rlogin react react-dom使用&#xff1a;从 yggjs_rlogin 引入组…

大数据毕业设计选题推荐:护肤品店铺运营数据可视化分析系统详解

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

【github-action 如何为github action设置secrets/environment】

Using secrets in GitHub Actions 在 GitHub Actions 中使用密钥 Learn how to create secrets at the repository, environment, and organization levels for GitHub Actions workflows. 学习如何在仓库、环境和组织级别为 GitHub Actions 工作流创建密钥。 Creating secre…

宝塔面板Docker安装n8n汉化中文

一、Docker安装N8N 安装配置默认即可&#xff0c;如果端口已被使用&#xff0c;可以自行更改 当状态为运行中时&#xff0c;就可以点击端口&#xff1a;访问N8N 填写完信息后&#xff0c;点击下一步&#xff08;邮箱要能接收邮件&#xff1a;接收密钥&#xff09; 点开始 点击发…

F003疫情传染病数据可视化vue+flask+mysql

编号:F003 文章结尾有CSDN官方提供的学长的联系方式&#xff01;&#xff01; 欢迎关注B站 ✅ vue flask 前后端分离架构 ✅ 实现中国地图、柱状图、折线图、水地图、环图等多种图形的echarts可视化分析 视频 vueflask爬虫 新冠疫情大屏实现 python 可视化分析项目源码1 系统…

plantsimulation知识点25.8.19 工件不在RGV中心怎么办?

如果出现这种情况&#xff0c;工件不在RGV的中心该怎么处理。首先说一下出现这种情况的原因。因为模拟的是两台RGV共同托举一个工件移动&#xff0c;实际上RGV控制的代码还是写在一条轨道的传感器控制代码中。另一台RGV只是从动的&#xff0c;工件也是在其中任意一台RGV上&…

redis-sentinel基础概念及部署

一. 引言&#xff1a;Redis Sentinel 是 redis 官方提供的高可用解决方案&#xff0c;主要用于监控 Redis 主从集群&#xff0c;在主节点故障时自动完成故障转移&#xff0c;确保服务持续可用。二. 核心功能1. 监控&#xff08;monitoring&#xff09;&#xff1a;持续检查主节…

LangChain RAG 简述

在 LangChain 中实现 RAG&#xff08;检索增强生成&#xff0c;Retrieval-Augmented Generation&#xff09;的核心思路是&#xff1a;让大模型在生成回答前&#xff0c;先从外部知识库&#xff08;如文档、数据库等&#xff09;中检索相关信息&#xff0c;再基于检索到的内容生…

GEO 优化专家孟庆涛:技术破壁者重构 AI 时代搜索逻辑

在生成式 AI 重塑全球搜索生态的浪潮中&#xff0c;中国 GEO&#xff08;生成式引擎优化&#xff09;领域的开拓者孟庆涛以 "智能决策革命" 的技术框架&#xff0c;颠覆了传统 "发发文章" 的简单认知。作为辽宁粤穗网络科技有限公司总经理兼 GEO 实验室主任…

用relation-graph构建关系图谱 vue版

用relation-graph构建关系图谱 vue版vue文件和Json数据vue文件和Json数据 <template><div><div style"margin-top:0px;width: calc(100% - 10px);height:calc(100vh);"><RelationGraph ref"graphRef" :options"graphOptions&qu…

Python基础-控制结构

控制结构是编程语言中用来控制程序执行流程的语句。Python提供了条件语句、循环语句等控制结构&#xff0c;让程序能够根据不同条件执行不同的代码块。 程序执行流程图&#xff1a; ┌───────────────────────────────────────────…

Java算法之排序

下面我们将讲述七大基于比较的排序算法的基本原理及实现。并从稳定性、时间复杂度、空间复杂度3种性能对每种排序进行分析。 重点&#xff1a;快速排序和堆排序&#xff1b;难点&#xff1a;快速排序和归并排序 目录 一、排序概念 二、常见排序算法的实现 2.1 插入排序 2.…

RabbitMQ:SpringAMQP 多消费者绑定同一队列

目录一、案例需求二、代码实现三、总结生产者源码 消费者源码 一、案例需求 模拟WorkQueue&#xff0c;实现一个队列绑定多个消费者。 在RabbitMQ的控制台创建一个队列&#xff0c;命名为work.queue。在生产者服务中定义测试方法&#xff0c;在1s内产生50条消息&#xff0c;…

Java技术总监的成长之路(技术干货分享)

以下是针对 ​Java技术总监​ 在 Linux 环境下搭建企业级开发环境的完整指南&#xff0c;涵盖 JDK 配置、工程工具链、协作平台及性能优化方案&#xff1a; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 一、核心环境搭建 1. ​JDK 安装与调优​ ​版本选择…

C++代码解释:实现一个 mystring 类,用于表示字符串,实现构造函数,默认构造长度为 10 的空间,提供打印字符串,获取空间大小,修改内容的成员函数

题目代码#include <cstring> // 包含字符串处理函数库&#xff0c;如strlen、strncpy等 #include <iostream> // 包含输入输出流库&#xff0c;用于cout等操作 using namespace std; // 使用标准命名空间&#xff0c;避免重复书写std::class mystring { // 定…

如何解决IDEA/Datagrip无法连接数据库的问题:解决方法为添加参数-Djava.net.preferIPv4Stack=true

如何解决IDEA/Datagrip无法连接数据库的问题&#xff1a;解决方法为添加参数-Djava.net.preferIPv4Stacktrue 引言 在开发过程中&#xff0c;我们常常使用集成开发环境&#xff08;IDE&#xff09;如 IntelliJ IDEA 或 JetBrains DataGrip 来与数据库进行交互。然而&#xff…

走进数字时代,融入数字生活,构建数字生态

一、准备在IT行业深耕十七年&#xff0c;始终专注于企业生产经营中的实际应用问题&#xff0c;历经开发、测试、运维、实施、架构设计等多个技术岗位&#xff0c;并参与肉制品的生产与销售业务&#xff0c;推进了企业主业的市场管理落地&#xff0c;积累了业务与信息技术融合的…

【Vue开发】在Vite+Vue3项目中实现离线Iconify图标方案

在ViteVue3项目中实现离线Iconify图标方案 项目背景 当前项目需要部署到无网络连接的离线环境&#xff0c;因此需要将Iconify图标集打包到项目构建结果中&#xff0c;实现完全离线使用。 技术环境 框架: Vue 3构建工具: Vite核心依赖:"iconify/json": "^2.2…

Kotlin 协程之Channel

前言 在之前的文章中&#xff0c;我们已经知道了协程的启动、挂起、取消、异常以及常用的协程作用域等基础应用。 这些基础应用适合的场景是一次性任务&#xff0c;执行完就结束了的场景。 launch / async 适合的场景 网络请求数据库查询文件读写并行计算任务等等 Channel …