【MyBatis Plus】002 -- 通用CRUD(插入、更新、删除、查询)

目录

3、通用CRUD

3.1 插入操作

3.1.1 方法定义

3.1.2 测试用例

3.1.3 测试

3.1.4 @TableField

3.2 更新操作

3.2.1 根据id更新

3.2.2 根据条件更新

3.3 删除操作

3.3.1 根据id删除(deleteById)

3.3.2 根据Map删除数据(deleteByMap)

3.3.3 根据Wrapper删除数据 (delete)

3.3.4 根据id集合批量删除 (deleteBatchIds)

3.4 查询操作

3.4.1 根据ID查询 (selectById)

3.4.2 根据ID 批量查询(selectBatchIds)

3.4.3 根据 entity 条件,查询一条记录 (selectOne)

3.4.4 根据wrapper条件,查询总记录数(selectCount)

3.4.5 根据 entity 条件,查询全部记录(selectList)

3.4.6 根据 entity 条件,查询全部记录并翻页(selectPage)

3.5 SQL注入的原理


3、通用CRUD

通过前面的学习,我们了解到通过继承BaseMapper就可以获取到各种各样的单表操作,接下来我们将详细讲解这些操作

3.1 插入操作

3.1.1 方法定义

3.1.2 测试用例

@RunWith 就是一个运行器

@RunWith(JUnit4.class) 就是指用JUnit4来运行

@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境

@ContextConfiguration Spring整合JUnit4测试时,使用注解引入多个配置文件

单个文件

@ContextConfiguration(Locations=“classpath:applicationContext.xml”)

@ContextConfiguration(classes = SimpleConfiguration.class)

多个文件时,可用{}

@ContextConfiguration(locations = { “classpath:spring1.xml”, “classpath:spring2.xml” })

SpringBoot2.2.0以前是JUnit4,在SpringBoot之后是JUnit5,对于Junit4而言,所有的测试方法应当是public声明的,而Junit5不用

3.1.3 测试

id生成策略不对:

如何设置id的生成策略呢?

MP支持的id策略:

我们要修改User对象,指定id类型为自增长:

再次测试,数据插入成功:

3.1.4 @TableField

在MP中通过@TableField注解可以指定字段的一些属性,常常解决的问题有2个:

1、对象中的属性名和字段名不一致的问题(非驼峰)

2、对象中的属性字段在表中不存在的问题

使用:

其他用法,如大字段不加入查询字段:(即,查询时不返回该字段的值)

效果:

3.2 更新操作

在MP中,更新操作有2种,一种是根据id更新,另一种是根据条件更新

3.2.1 根据id更新

方法定义:

测试用例:

测试结果:

数据库结果:

3.2.2 根据条件更新

方法定义:

测试用例:(QueryWrapper没有set方法,只能通过创建对象,通过对象来调用set方式,从而实现属性值的更新;而UpdateWarpper可以直接使用set方法指定数据库表字段名进行对应的修改)

PSwrapper:意为 封装

或者,通过UpdateWrapper进行更新:

测试结果:

关于wrapper更多的用法后面会有详细讲解

3.3 删除操作

3.3.1 根据id删除(deleteById)

方法定义:

测试用例:(这里指定id为 6L 的原因是因为id的类型为 long

结果:

数据被删除:

3.3.2 根据Map删除数据(deleteByMap)

方法定义:

测试用例:(Map中的元素相当于where语句,多条件之间是 and 关系)

结果:

3.3.3 根据Wrapper删除数据 (delete)

方法定义:

测试用例:(根据包装的参数进行删除)

wrapper有两种写法:

推荐使用第二种用法,因为该用法不用手写字段名,减少了错误可能发生的概率

结果:

3.3.4 根据id集合批量删除 (deleteBatchIds)

方法定义:

测试用例:

结果:

3.4 查询操作

MP提供了多种查询操作,包括根据id查询、批量查询、查询单条数据、查询列表、分页查询等操作

3.4.1 根据ID查询 (selectById)

方法定义:

测试用例:(如果查询的数据不存在,则会返回null)

结果:

3.4.2 根据ID 批量查询(selectBatchIds)

方法定义:

测试用例:(集合中的元素即为查询条件)

结果:

3.4.3 根据 entity 条件,查询一条记录 (selectOne)

方法定义:

测试用例:

结果:

如果要查询的数据超过一条时,会抛出异常:

3.4.4 根据wrapper条件,查询总记录数(selectCount)

方法定义:

测试用例:(eq:等于,gt:大于)

结果:

 

3.4.5 根据 entity 条件,查询全部记录(selectList)

方法定义:

 

测试用例:(like:以%val%的形式进行模糊查找)

 

结果:

3.4.6 根据 entity 条件,查询全部记录并翻页(selectPage)

方法定义:(首先要配置MP底层提供的一个分页插件PaginationInterceptor)

配置分页插件:(【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理 中的bean管理内容,通过声明配置类来管理第三方bean对象)

测试用例:(查询用户表中年龄大于20岁的用户)

结果:

3.5 SQL注入的原理

前面我们已经知道,MP在启动后会将BaseMapper中的一系列的方法注册到mappedStatements那么究竟是如何注入的呢?流程又是怎么样的?下面我们将一起来分析下。

在MP中,ISqlInjector负责SQL的注入工作,它是一个接口,AbstractSqlInjector是它的实现类,实现关系如下:

AbstractSqlInjector中,主要是由inspectInject()方法进行注入的,如下:

 

在实现方法中, methodList.forEach(m -> m.inject(builderAssistant, mapperClass,modelClass,tableInfo)); 是关键,循环遍历方法,进行注入。 

最终调用抽象方法injectMappedStatement进行真正的注入:

查看该方法的实现:

以SelectById为例查看:

 

可以看到,生成了SqlSource对象,再将SQL通过addSelectMappedStatement方法添加到mappedStatements

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Level_2(2)题目整理

文章目录L2-022 重排链表(模拟❗)L2-023 图着色问题L2-024 部落(并查集)L2-025 分而治之(与 L2-023差不多,邻接表遍历)L2-026 小字辈(求树的深度)L2-027 名人堂与代金券(💡处理&…

得物 API一站式协作平台的一些思考

1.背景 Mooncake是得物API一站式协作平台。从2022年3月份开始负责Mooncake,到现在已经一年了,回顾这一年,Mooncake大的阶段上,总共经历过两个版本: 1、Mooncake 1.0: 面向前端和客户端的mock平台,主要解决接口调用者…

C++实现前缀树

文章目录1. 什么是前缀树2. 前缀树的实现2.1 前缀树的基本结构2.2 插入2.3 word出现了几次2.3 word作为前缀出现几次2.4 删除1. 什么是前缀树 假设这里有一个字符串数组,和一个树的根结点: 这个结点的pass意思是:有几个字符通过了这个结点。…

ubuntu下Thrift安装

thrift是一种常用rpc框架,工作中经常会用到,本文记录一下其安装过程。 目录 1.下载软件包 1.1thrift下载 1.2libevent下载 1.3boost下载 2.安装(注意步骤) 2.1安装libevent 2.2安装boost 2.3安装与Python2.7版本对应的py…

【工作感悟】老程序员总结的四条工作经验教训

文章目录前言1. 不要做小需求2. 要做大需求3. 定期同步工作进度4. 项目结束,主动复盘总结前言 想来从事互联网工作已经很多年了,已经从当初的懵懂少年逐渐退化成老油条。刚毕业的时候,真是个愣头青,什么都不懂,也什么…

UE4 回放系统升级到UE5之后的代码报错问题解决

关键词: UE4 回放系统 升级 UE5 报错 DemoNetDriver GetDemoCurrentTime GetDemoTotalTime 背景 照着网上教的UE4的回放系统,也叫重播系统,英文Replay。做完了,测试运行正常,可升级到UE5却报了一堆 WorldSetting 和 …

计算机组成原理——第五章中央处理器

半生风雨半生伤,半醉半醒半心凉 文章目录前言5.1 CPU的功能和基本结构5.2 指令周期的数据流5.3.1 单总线结构5.3.2 专用通路结构前言 之前我们就说过CPU主要包括两个部分,运算器和控制器,运算器主要是实现算数运算.逻辑运算, 运算…

亲测:腾讯云轻量应用服务器性能如何?

腾讯云轻量应用服务器性能评测,轻量服务器CPU主频、处理器型号、公网带宽、月流量、Ping值测速、磁盘IO读写及使用限制,轻量应用服务器CPU内存性能和标准型云服务器CVM处于同一水准,所以大家不要担心轻量应用服务器的性能,腾讯云百…

springboot项目中的mysql用国产数据库达梦替换的相关说明

一、 用“DM管理工具”的“管理用户”创建你需要用户,也是达梦的模式。 用户的权限问题可以直接角色授权,方便一些。 二、借用达梦的“DM数据迁移工具”做数据库的表内容转移。 1. 新建工程、新建迁移 编辑mysql的数据库源 编辑达梦的目的端数据库 选择之…

应届生通过Java培训班转行IT有前途吗?

借用邓小平同志曾说过的一句话:科学技术是第一生产力。IT行业作为科技行业中的一员,不管是在自身的发展,还是支持其他行业的发展中都扮演了不可或缺的角色,“互联网”是社会发展的趋势,前途是无限的。而计算机语言是目…

春季儿童吃什么有助于长高,3款适合孩子长高的食谱做法,学起来

儿童身高一直以来都比较受到父母的关注,虽然身高不能说明一个人的能力有多强,但是会影响到人的外表。身高影响成败,一些专业对身高要求非常严格,因此大部分家长都希望孩子在身高方面能有一定的优势。 春季是孩子分泌生长激素增加时…

你了解C语言中的数组指针和函数指针吗?

如题,本篇文章重点讲解C语言中的数组指针和函数指针。这2种指针其实都不是很常用,个人感觉使用起来代码的可读性不是很高,但是还是需要了解一下。 数组指针 数组指针,即指向数组的指针,是用来存放数组的地址的。那如…

Redis Lua沙盒绕过命令执行(CVE-2022-0543)

一、描述 影响范围:Debian系得linux发行版本Ubuntu Debian系得linux发行版本 其并非Redis本身漏洞,形成原因在于系统补丁加载了一些redis源码注释了的代码 揭露时间:2022.3.8 二、原理 redis在用户连接后可以通过eval命令执行Lua脚本&#x…

Flutter成不了“顶流明星”的7大理由

Flutter是一款由Google推出的跨平台移动应用开发框架,近年来备受关注。尽管Flutter在某些方面表现出色,但仍然有一些人对它的发展前景表示怀疑。近期一些文章针对Flutter的发展提出了不少质疑和批评,称其难以成为移动应用开发的“顶流明星”&…

[Java]面向对象高级篇

文章目录包装类包装类层次结构基本类型包装类特殊包装类数组一维数组多维数组可变长参数字符串String类StringBuilder类内部类成员内部类静态内部类局部内部类匿名内部类Lambda表达式方法引用异常机制自定义异常抛出异常异常的处理常用工具类数学工具类随机数数组工具类包装类 …

在线文章生成工具-原创文章生成工具

在线文章生成器 在线文章生成器是指一种可以在线使用的自动化创造文章的工具。它可以使用自然语言处理(NLP)技术和人工智能算法提供需要的信息,基于标题、关键字,句子关联性等元素自动创造文章内容,涵盖各种类型&…

Java中线程的常用操作-后台线程、自定义线程工厂ThreadFactpry、join加入一个线程、线程异常捕获

场景 Java中Thread类的常用API以及使用示例: Java中Thread类的常用API以及使用示例_霸道流氓气质的博客-CSDN博客 上面讲了Thread的常用API,下面记录下线程的一些常用操作。 注: 博客:霸道流氓气质的博客_CSDN博客-C#,架构之…

Win10,详细永久关闭更新方法(附图文)

一、服务设置 1.同时按下键盘 Win R,打开运行对话框,然后输入命令 services.msc ,点击下方的“确定”打开服务。 2.找到 Windows Update 这一项,并双击打开。 3.停止该服务,启动类型设置为禁用 4.点击恢复&#…

完整指南:如何安装Man手册

Man手册简介 man手册是Unix和类Unix操作系统中的命令行工具,用于提供关于特定命令、函数和文件的帮助文档。它通常包含命令的语法、选项、参数、示例以及其他相关信息。man手册可以通过在终端输入"man"命令,后跟要查看的命令或函数名称来访问…

惠普Probook455电脑开机突然卡住无法进入桌面

惠普Probook455电脑开机突然卡住无法进入桌面解决方法分享。最近有用户使用的惠普Probook455电脑在开机的时候,电脑一直卡在开机的界面上,无法进入到系统中。无论是重启还是安全模式都无法解决问题。那么遇到这个情况怎么去进行问题的解决,来…