MyBatis Plus 项目的创建和使用

1. 快速上手

1.1. 项目的创建和配置

首先,创建一个 Spring Boot 工程,添加 MyBatis Plus 和 MySQL 对应的依赖,然后,和 MyBatis 一样,需要在 yml 文件中配置数据库连接信息

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.9</version>
</dependency>

创建好项目之后,需要根据数据库中的字段来写相应的实体类

@Data
public class UserInfo {private Integer id;private String userName;private String password;private Integer deleteFlag;private Date createTime;private Date updateTime;
}

MybatisPlus 提供了一个基础的 BaseMapper 接口,已经实现了单表的增删查改操作,自定义的 Mapper 只需要继承这个 BaseMapper,就不用自己实现相应的单表增删查改操作了


为了让 Spring 扫描到这个类,也是需要加上 @Mapper注解的,或者在启动类上加上@MapperScan注解,参数就写包的路径

@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}

1.2. 增删查改的简单演示

之后就可以进行增删查改的单元测试了

查询:

@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;//查询@Testvoid testSelect(){System.out.println(userInfoMapper.selectById(1));}
}

和使用 Mybatis 时的结果是一样的

那么就有一个问题,Mapper 中不写 sql 语句是怎么知道要操作哪张表的,其实就是继承的BaseMapper<UserInfo>中传入的泛型参数,会将 Java 中类的命名规范改为数据库中的命名规范,类中的属性也是按照规范映射到数据库中表的字段的,那么就会有一个问题,如果说类名或者属性名没有按照规范来定义,还能知道操作的是哪张表吗

把类名修改以后就报错了,报错信息为数据库中找不到这个表,如果命名规范的话是可以把UserInfo转化为表名user_info

这时候使用 @TableName来指定一下具体要操作哪张表就可以了

同理,属性名如果命名不规范也是不能自动转化成功的

把规范的驼峰命名方式修改一下就又报错了,这时候,就要使用@TableField注解来指定对应的表的字段

然后来看 insert 方法

@Test
void testInsert(){UserInfo userinfo = new UserInfo();userinfo.setUserName("java");userinfo.setPassword("java");userInfoMapper.insert(userinfo);
}

虽然说插入成功了,但是数据好像不太对,这里的 id 并没有按照自增的方式来增加,而且设置为了一个新的 id,原因就是没有指定数据库中的主键

通过@TableId注解可以设置 id 的一些属性,这里传入参数(type = IdType.AUTO)表示自增

再来看修改和删除操作

@Test
void testUpdate(){UserInfo userinfo = new UserInfo();userinfo.setId(3);userinfo.setPassword("00000");userInfoMapper.updateById(userinfo);
}
@Test
void testDelete(){userInfoMapper.deleteById(3);
}

这里演示的都是通过 id 来进行操作的,这里的 id 必须是对应实体类所映射表的主键

1.3. 日志打印

和 Mybatis 一样,也可以进行配置打印日志,来观察对应的 sql 语句

mybatis-plus:configuration: # 配置打印 MyBatis日志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2. 条件构造器

MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。

  1. AbstractWrapper:这是一个抽象基类,提供了所有 Wrapper 类共有的方法和属性。
  2. QueryWrapper:专门用于构造查询条件,支持基本的等于、不等于、大于、小于等各种常见操作。它允许你以链式调用的方式添加多个查询条件,并且可以组合使用 andor 逻辑。
  3. UpdateWrapper:用于构造更新条件,可以在更新数据时指定条件。与 QueryWrapper 类似,它也支持链式调用和逻辑组合。使用 UpdateWrapper 可以在不创建实体对象的情况下,直接设置更新字段和条件。
  4. LambdaQueryWrapper:这是一个基于 Lambda 表达式的查询条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名。这种方式提高了代码的可读性和可维护性,尤其是在字段名可能发生变化的情况下。
  5. LambdaUpdateWrapper:类似于 LambdaQueryWrapper,LambdaUpdateWrapper 是基于 Lambda 表达式的更新条件构造器。它允许你使用 Lambda 表达式来指定更新字段和条件,同样避免了硬编码字段名的问题。

2.1. QueryWrapper

@Test
void testQueryWrapper() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.select("user_name", "password").eq("delete_flag", 0).like("user_name", "min");userInfoMapper.selectList(queryWrapper).forEach(System.out::println);
}

eq 就构造了一个相等条件,like 构造了一个模糊查询的条件,除此之外还有其他的一些模糊查询的构造

这就相当于下面的这条 sql 语句

部分方法名的表示含义:

方法名

表示

lt

"less than"的缩写,表示小于.

le

"less than or equal to"的缩写,表示小于等于

ge

"greater than or equal to"的缩写,表示大于等于.

gt

"greater than"的缩写,表示大于.

eq

"equals"的缩写,表示等于.

ne

"not equals"的缩写,表示不等于

如果要使用 delete 的话也是可以使用 QueryWrapper 来构造一个判断条件,然后再调用 delete 方法

2.2. UpdateWrapper

来看一下还用 QueryWrapper 来构造条件进行更新:

@Test
void testQueryWrapper2() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.lt("id", 2);UserInfo userInfo = new UserInfo();userInfo.setDeleteFlag(1);userInfoMapper.update(userInfo, queryWrapper);
}

还是先用 QueryWrapper 构造出判断条件,然后和要更新的对象传入 update 方法中,这样就有些麻烦了,来看使用 UpdateWrapper 来进行简化

@Test
void testUpdateWrapper() {UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.set("delete_flag", 0).lt("id", 2);userInfoMapper.update(updateWrapper);
}

这里直接就可以构造出要更新的内容和判断条件,然后直接传入 update 方法中

再来看批量修改的方式:

@Test
void testUpdateWrapper1() {UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.set("delete_flag", 1).in("id", List.of(1, 2, 3));userInfoMapper.update(updateWrapper);
}

这里通过 in 方法来构造 sql 语句中的 in

再来看涉及到表达式的 sql 语句怎么构造

@Test
void testUpdateWrapper2(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.setSql("age = age + 10").in("id",List.of(1,2,3));userInfoMapper.update(updateWrapper);
}

可以直接通过 setSql 方法来设置 sql 语句

2.3. LambdaQueryWrapper

在上面的示例中,传入的参数都是字符串,也就是硬编码字段名,如果发生修改的话,不方便维护,写起来容易出错,就可以使用 LambdaQueryWrapper 来通过 lambda 表达式的方式来引用类的属性

@Test
void testLambdaQueryWrapper(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.lambda().select(UserInfo :: getId,UserInfo :: getUserName,UserInfo :: getPassword).eq(UserInfo::getId ,2);System.out.println(userInfoMapper.selectOne(queryWrapper));
}

直接使用就不用调用 lambda 方法了

@Test
void testLambdaQueryWrapper() {LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.select(UserInfo::getId, UserInfo::getUserName, UserInfo::getPassword).eq(UserInfo::getId, 2);System.out.println(userInfoMapper.selectOne(lambdaQueryWrapper));
}

通过这样的方式就避免了字符串容易写错的问题

2.4. LambdaUpdateWrapper

与之对应的,还有 LambdaUpdateWrapper,使用方法也是类似的

@Test
void testLambdaUpdateWrapper(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.lambda().set(UserInfo::getDeleteFlag, 0).in(UserInfo::getId, List.of(1, 2, 3));userInfoMapper.update(updateWrapper);
}

也是直接使用,就不用调用 lambda 方法了

@Test
void testLambdaUpdateWrapper() {LambdaUpdateWrapper<UserInfo> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();lambdaUpdateWrapper.set(UserInfo::getDeleteFlag, 1).in(UserInfo::getId, List.of(1, 2, 3));userInfoMapper.update(lambdaUpdateWrapper);
}

3. 自定义 sql

Mybatis plus 提供的方法可能不能满足一些其他需求,这是就可以自定义 sql,第一种实现方式还是之前 Mybatis 的写法,直接把 sql 语句写在注解里,或者是使用 XML 的方式

除此之外,Mybatis plus 也提供了另一种构造自定义 sql 的方式,来看官方文档中的介绍

@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {@Select("select * from user_info ${ew.customSqlSegment}")List<UserInfo> selectByCustom(@Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper);
}

通过 ${ew.customSqlSegment} 引入了 Wrapper 对象生成的 SQL 片段,来实现自定义 sql,然后调用方法,传入一个 Wrapper 对象

XML 方式也是一样的,把注解中的 sql 语句写到 XML 中就可以了

再来看上面 sql 表达式的例子

来自定义一下上面的 sql 语句

@Update("update user_info set age = age + #{age} ${ew.customSqlSegment}")
Integer updateByCustom(@Param("age") Integer age,@Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper);
@Test
void updateByCustom() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.in("in",List.of(1,2,3));userInfoMapper.updateByCustom(10,queryWrapper);
}

 主页

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

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

相关文章

IDEA 2024.3 版本更新主要功能介绍

IDEA 2024.3 版本提供的新特性 IntelliJ IDEA 2024.3 的主要新特性&#xff1a; AI Assistant 增强 改进的代码补全和建议更智能的代码分析和重构建议Java 支持改进 支持 Java 21 的所有新特性改进的模式匹配和记录模式支持更好的虚拟线程调试体验开发工具改进 更新的 UI/UX 设…

Java编程,配置mongoUri连接mongodb时,需对特殊字符进行转义

一、背景 java程序连接mongo有两种方式&#xff1a; 用户名和密码方式uri方式 1、用户名和密码 以用户数据库为例&#xff0c;注意看它的密码 spring:data:mongodb:host: 192.168.10.17database: db_user_serviceport: 3717username: user_servicepassword: user_service3…

学习笔记|MaxKB对接本地大模型时,选择Ollma还是vLLM?

在使用MaxKB开源知识库问答系统的过程中&#xff0c;除了对接在线大模型&#xff0c;一些用户出于资源配置、长期使用成本、安全性等多方面考虑&#xff0c;还在积极尝试通过Ollama、vLLM等模型推理框架对接本地离线大模型。而在用户实践的过程中&#xff0c;经常会对候选的模型…

Python 快速入门(上篇)❖ Python基础知识

Python 基础知识 Python安装**运行第一个程序:基本数据类型算术运算符变量赋值操作符转义符获取用户输入综合案例:简单计算器实现Python安装** Linux安装: yum install python36 -y或者编译安装指定版本:https://www.python.org/downloads/source/ wget https://www.pyt…

【1.2 Getting Started--->Installation Guide】

NVIDIA TensorRT DOCS 此 NVIDIA TensorRT 10.6.0 安装指南提供安装要求、TensorRT 包中包含的内容列表以及安装 TensorRT 的分步说明。 安装指南 摘要&#xff1a; 本 NVIDIA TensorRT 10.3.0 安装指南提供了安装要求、TensorRT 软件包中包含的内容列表以及安装 TensorRT 的…

RT_Thread内核源码分析(三)——线程

目录 1. 线程结构 2. 线程创建 2.1 静态线程创建 2.2 动态线程创建 2.3 源码分析 2.4 线程内存结构 3. 线程状态 3.1 线程状态分类 3.2 就绪状态和运行态 3.3 阻塞/挂起状态 3.3.1 阻塞工况 3.4 关闭状态 3.4.1 线程关闭接口 3.4.2 静态线程关闭 3.4.3 动态线程关…

Unity图形学之CubeMap立方体贴图

1.CubeMap&#xff1a;有六个面的贴图组成 2. 假反射&#xff1a;反射天空盒子 &#xff08;1&#xff09;正常UV采样&#xff1a; &#xff08;2&#xff09;Cube的采样&#xff1a;利用反射角采样&#xff0c;反射角X和Cube的交点采样 Shader "Custom/TestReflect"…

C语言基础学习:抽象数据类型(ADT)

基础概念 抽象数据类型&#xff08;ADT&#xff09;是一种数据类型&#xff0c;它定义了一组数据以及可以在这组数据上执行的操作&#xff0c;但隐藏了数据的具体存储方式和实现细节。在C语言中&#xff0c;抽象数据类型&#xff08;ADT&#xff09;是一种非常重要的概念&…

Qt-多元素控件

Qt中的多元素控件 Qt提供的多元素控件有&#xff1a; 这里的多元素控件都是两两一对的。 xxWidget和xxView的一个比较简单的理解就是&#xff1a; xxView是更底层的实现&#xff0c; xxWidget是基于xxView封装来的。 可以说&#xff0c;xxView使用起来比较麻烦&#xff0c;但…

2023年9月GESPC++一级真题解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 题号 123456789101112131415 答案 CDBCDBACACBBDDA 1. 我们通常说的 “ 内存 ” 属于计算机中的&#xff08;&#xff09;。 A. 输出设备 B. 输 ⼊ 设备 C. 存储设备 D. 打印设备 【答案】 C 【考纲知识点】…

wend看源码-APISJON

项目地址 腾讯APIJSON官方网站 定义 APIJSON 可以定义为一个面向HTTP 协议的JSON 规范&#xff0c;一个面向数据访问层的ORM 框架。其主要工作流程包括&#xff1a;前端按照既定格式组装 JSON 请求报文&#xff0c;通过 APIJSON-ORM 将这些报文直接转换为 SQL 语句&#xff0c…

VMware虚拟机Ubuntu桥接模式突然连接不上网络解决办法

在Linux环境进行开发时突然发现虚拟机中的Ubuntu突然连接不上网络&#xff0c;图形化界面也找不到有线连接选项。在此记录解决办法。 解决办法 1. 在终端命令行输入以下命令&#xff1a; sudo service network-manager stop2. 然后编辑以下文件将其中NetworkingEnable fals…

丹摩征文活动|摩智算平台深度解析:Faster R-CNN模型的训练与测试实战

目录 文章前言Faster R-CNN的简介Faster RCNN的训练与测试提前准备1.1 mobaxterm&#xff08;远程连接服务器&#xff09;1.2 本文的源码下载 目标检测模型 Faster-Rcnn2.1云服务器平台 数据上传内置JupyterLab的使用本地连接使用DAMODEL实例获取实例的SSH访问信息通过SSH连接通…

【数据结构】归并排序 —— 递归及非递归解决归并排序

归并排序 一、归并排序1、归并排序的思想2、归并排序代码实现&#xff08;递归&#xff09;<1> 归并排序的递归区间<2> 归并排序的稳定性<3> 拷贝 3、归并排序代码实现&#xff08;非递归&#xff09;<1> 循环区间溢出问题 二、总结 一、归并排序 1、…

调大Vscode资源管理器字体

对于调整资源管理器字体大小&#xff08;也就是下图红框&#xff09;&#xff0c;查找了网上很多方法。要么介绍的方法是调整了代码字体&#xff0c;要么是调节了终端字体&#xff0c;要么是通过整体放缩实现的调整&#xff0c;总之都不合适。 唯一的调整方法是在几篇CSDN里看到…

【Linux】-学习笔记04

第十二章、磁盘管理 1.查看磁盘空间使用量 1.1df命令 作用&#xff1a; 列出文件系统的磁盘空间占用情况 df&#xff0c;disk free&#xff0c;通过文件系统来快速获取空间大小的信息&#xff0c;当我们删除一个文件的时候&#xff0c;这个文件 不是马上就在文件系统当中消…

centos 服务器 docker 使用代理

宿主机使用代理 在宿主机的全局配置文件中添加代理信息 vim /etc/profile export http_proxyhttp://127.0.0.1:7897 export https_proxyhttp://127.0.0.1:7897 export no_proxy"localhost,127.0.0.1,::1,172.171.0.0" docker 命令使用代理 例如我想在使用使用 do…

Vue中Select选择器el-option实现动态多选

效果如图&#xff1a; 前端列表块显示部分&#xff1a; <el-table :data"tableData" border stripe :header-cell-class-name"headerBg" selection-change"handleSelectionChange"><el-table-column type"selection" width…

【ubuntu24.04.1最简洁安装方案】

我的电脑配置&#xff1a; 128GB固态硬盘&#xff0c;1TB 机械硬盘&#xff0c;我把整个 windows 系统全噶掉了&#xff0c;只安装ubuntu24.04.1一个Linux系统噶windows系统&#xff0c; 推荐使用 DiskGenius这个工具&#xff0c;好用&#xff0c;但是也要弄明白了再用啊&#…

k8s集群加入node节点为ubuntu 22.04

文章目录 1.环境准备1.1 关闭无用服务1.2 环境和网络1.3 apt源1.4 系统优化 2. 装containerd3. 接入k8s集群3.1 kubelet、kubeadm、kubectl安装3.2 缺少一个镜像3.3 接入k8s集群 4. 一些相关问题 1.环境准备 rootcto-gpu-pro-n01:~# lsb_release -a No LSB modules are availa…