MybaitsPlus学习笔记(二)基本CURD

目录

一、BaseMapper

二、常用实例

1、插入

2、删除

3、修改

4、查询

三、IService

四、 IService中的一些方法测试


一、BaseMapper

        MyBatis-Plus中的基本CRUD在内置的BaseMapper中都已得到了实现,我们可以直接使用,接口如 下:

public interface BaseMapper<T> extends Mapper<T> {/*** 插入一条记录** @param entity 实体对象*/int insert(T entity);/*** 根据 ID 删除** @param id 主键ID*/int deleteById(Serializable id);/*** 根据实体(ID)删除** @param entity 实体对象* @since 3.4.4*/int deleteById(T entity);/*** 根据 columnMap 条件,删除记录** @param columnMap 表字段 map 对象*/int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);/*** 根据 entity 条件,删除记录** @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)*/int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 删除(根据ID或实体 批量删除)** @param idList 主键ID列表或实体列表(不能为 null 以及 empty)*/int deleteBatchIds(@Param(Constants.COLLECTION) Collection<?> idList);/*** 根据 ID 修改** @param entity 实体对象*/int updateById(@Param(Constants.ENTITY) T entity);/*** 根据 whereEntity 条件,更新记录** @param entity        实体对象 (set 条件值,可以为 null)* @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)*/int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);/*** 根据 ID 查询** @param id 主键ID*/T selectById(Serializable id);/*** 查询(根据ID 批量查询)** @param idList 主键ID列表(不能为 null 以及 empty)*/List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);/*** 查询(根据 columnMap 条件)** @param columnMap 表字段 map 对象*/List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);/*** 根据 entity 条件,查询一条记录* <p>查询一条记录,例如 qw.last("limit 1") 限制取一条记录, 注意:多条数据会报异常</p>** @param queryWrapper 实体对象封装操作类(可以为 null)*/default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) {List<T> ts = this.selectList(queryWrapper);if (CollectionUtils.isNotEmpty(ts)) {if (ts.size() != 1) {throw ExceptionUtils.mpe("One record is expected, but the query result is multiple records");}return ts.get(0);}return null;}/*** 根据 Wrapper 条件,判断是否存在记录** @param queryWrapper 实体对象封装操作类* @return*/default boolean exists(Wrapper<T> queryWrapper) {Long count = this.selectCount(queryWrapper);return null != count && count > 0;}/*** 根据 Wrapper 条件,查询总记录数** @param queryWrapper 实体对象封装操作类(可以为 null)*/Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根据 entity 条件,查询全部记录** @param queryWrapper 实体对象封装操作类(可以为 null)*/List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根据 Wrapper 条件,查询全部记录** @param queryWrapper 实体对象封装操作类(可以为 null)*/List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根据 Wrapper 条件,查询全部记录* <p>注意: 只返回第一个字段的值</p>** @param queryWrapper 实体对象封装操作类(可以为 null)*/List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根据 entity 条件,查询全部记录(并翻页)** @param page         分页查询条件(可以为 RowBounds.DEFAULT)* @param queryWrapper 实体对象封装操作类(可以为 null)*/<P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根据 Wrapper 条件,查询全部记录(并翻页)** @param page         分页查询条件* @param queryWrapper 实体对象封装操作类*/<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}

二、常用实例

1、插入
@Test
public void testInsert(){
User user = new User(null, "张三", 23, "zhangsan@qcby.com");
//INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
int result = userMapper.insert(user);
System.out.println("受影响行数:"+result);
System.out.println("id自动获取:"+user.getId());
}

最终执行的结果,所获取的id可能并不是递增的。

这是因为MyBatis-Plus在实现插入数据时,会默认基于雪花算法的策略生成id

mybatis-plus:global-config:db-config:id-type: auto

可以通过修改配置来实现添加的id递增

2、删除

id删除

@Test
public void testDeleteById(){
//通过id删除用户信息
//DELETE FROM user WHERE id=?
int result = userMapper.deleteById(1475754982694199298L);
System.out.println("受影响行数:"+result);
}

id批量删除

@Test
public void testDeleteBatchIds(){
//通过多个id批量删除
//DELETE FROM user WHERE id IN ( ? , ? , ? )
List<Long> idList = Arrays.asList(1L, 2L, 3L);
int result = userMapper.deleteBatchIds(idList);
System.out.println("受影响行数:"+result);
}

map删除

@Test
public void testDeleteByMap(){
//根据map集合中所设置的条件删除记录
//DELETE FROM user WHERE name = ? AND age = ?
Map<String, Object> map = new HashMap<>();
map.put("age", 23);
map.put("name", "张三");
int result = userMapper.deleteByMap(map);
System.out.println("受影响行数:"+result);
}
3、修改
@Test
public void testUpdateById(){
User user = new User(4L, "admin", 22, null);
//UPDATE user SET name=?, age=? WHERE id=?
int result = userMapper.updateById(user);
System.out.println("受影响行数:"+result);
}
4、查询

 根据id查询用户信息 

@Test
public void testSelectBatchIds(){
//根据多个id查询多个用户信息
//SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )
List<Long> idList = Arrays.asList(4L, 5L);
List<User> list = userMapper.selectBatchIds(idList);
list.forEach(System.out::println);
}

ids查询多个 

@Test
public void testSelectById(){
//根据id查询用户信息
//SELECT id,name,age,email FROM user WHERE id=?
User user = userMapper.selectById(4L);
System.out.println(user);
}

map查询

@Test
public void testSelectByMap(){
//通过map条件查询用户信息
//SELECT id,name,age,email FROM user WHERE name = ? AND age = ?
Map<String, Object> map = new HashMap<>();
map.put("age", 22);
map.put("name", "admin");
List<User> list = userMapper.selectByMap(map);
list.forEach(System.out::println);
}

查所有

@Test
public void testSelectList(){
//查询所有用户信息
//SELECT id,name,age,email FROM user
List<User> list = userMapper.selectList(null);
list.forEach(System.out::println);
}

三、IService

MyBatis-Plus中有一个接口 IService和其实现类 ServiceImpl,封装了常见的业务层逻辑

四、 IService中的一些方法测试

查总数

//count@Testpublic void test1(){Long count = userService.count();System.out.println(count);}

插入一条记录(选择字段,策略插入) 

    //插入一条记录(选择字段,策略插入)@Testpublic void test2(){User user = new User();user.setName("zhangsan");user.setAge(22);user.setEmail("qq.com");boolean result = userService.save(user);System.out.println(result);}

插入(批量)

    @Testpublic void test3(){User user = new User();user.setName("zhangsan3");user.setAge(33);user.setEmail("11qq.com");User user2 = new User();user2.setName("zhangsan4");user2.setAge(44);user2.setEmail("22qq.com");List<User> a = new ArrayList<>();a.add(user);a.add(user2);boolean res = userService.saveBatch(a,1);System.out.println(res);}

这个需要认真理解

    //批量修改插入//根据id找,找到的修改,其他添加@Testpublic void test4(){//修改zhangsanUser user = new User();user.setName("zhangsanUP");user.setAge(33);user.setEmail("Update@qq.com");user.setId(7);//添加zhangsan5User user2 = new User();user2.setName("zhangsan5");user2.setAge(55);user2.setEmail("55.com");//user2.setId(15);List<User> a = new ArrayList<>();a.add(user);a.add(user2);boolean res = userService.saveOrUpdateBatch(a);System.out.println(res);}
    //根据 ID 删除@Testpublic void test5(){boolean res = userService.removeById(11);System.out.println(res);}//根据 columnMap 条件,删除记录@Testpublic void test6(){Map<String,Object> map =  new HashMap<>();map.put("age",33);boolean res = userService.removeByMap(map);System.out.println(res);}//根据 entity 条件,删除记录@Testpublic void test7(){QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.le("age",12);boolean res = userService.remove(queryWrapper);System.out.println(res);}//删除(根据ID 批量删除)@Testpublic void test8(){List<Integer> idList = new ArrayList<>();idList.add(1);idList.add(2);boolean res = userService.removeByIds(idList);System.out.println(res);}//JDBC批量提交是指将多条SQL语句组合成一个批处理,然后一次性提交给数据库执行。// 这可以显著提高性能,特别是在处理大量插入、更新或删除操作时。//根据 ID 选择修改@Testpublic void test9(){User user2 = new User();user2.setName("zhangsanUP");user2.setAge(555);user2.setEmail("55up.com");user2.setId(12);boolean res = userService.updateById(user2);System.out.println(res);}//根据 UpdateWrapper 条件,更新记录 需要设置sqlset@Testpublic void test10(){UpdateWrapper<User> updateWrapper = new UpdateWrapper();updateWrapper.set("name","updatewrapper").set("age",12).like("name","zhang");boolean res = userService.update(updateWrapper);System.out.println(res);}//根据ID 批量更新@Testpublic void test11(){User user1 = new User();user1.setName("zhangsan1");user1.setAge(555);user1.setEmail("55up.com");user1.setId(9);User user2 = new User();user2.setName("zhangsanUP2");user2.setAge(555);user2.setEmail("55up.com");user2.setId(12);List<User> a = new ArrayList<>();a.add(user1);a.add(user2);boolean res = userService.updateBatchById(a);System.out.println(res);}//根据 ID 查询@Testpublic void test13(){User res = userService.getById(12);System.out.println(res);}//查询(根据ID 批量查询)@Testpublic void test14(){List<Integer> idList = new ArrayList<>();idList.add(9);idList.add(12);List<User> res = userService.listByIds(idList);System.out.println(res);}//查询(根据 columnMap 条件@Testpublic void test15(){Map<String,Object> map =  new HashMap<>();map.put("name","Jack");List<User> res = userService.listByMap(map);System.out.println(res);}//根据 Wrapper,查询一条记录//throwEx有多个 result 是否抛出异常//One record is expected, but the query result is multiple records//如果有多个返回第一个@Testpublic void test16(){QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.le("age",555);User res = userService.getOne(queryWrapper,false);System.out.println(res);}//根据 Wrapper 条件,查询总记录数@Testpublic void test17(){QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.le("age",100);Long res = userService.count(queryWrapper);System.out.println(res);}//查询列表@Testpublic void test18(){QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.le("age",100);List<User> res = userService.list(queryWrapper);System.out.println(res);}//查询所有@Testpublic void test19(){List<User> res = userService.list();System.out.println(res);}//查询所有id@Testpublic void test21(){List<Object> res = userService.listObjs();System.out.println(res);}//根据 Wrapper 条件,查询全部记录@Testpublic void test22(){QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.le("age",100);List<Object> res = userService.listObjs(queryWrapper);System.out.println(res);}

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

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

相关文章

设计模式之适配模式是什么?以及在Spring AOP中的拦截器链的使用源码解析。

前言 本文涉及到适配模式的基本用法&#xff0c;以及在Spring AOP中如何使用&#xff0c;首先需要了解适配模式的工作原理&#xff0c;然后结合Spring AOP的具体实现来详细详细解析源码。 首先&#xff0c;适配模式&#xff0c;也就是Adapter Pattern&#xff0c;属于结构型设计…

【C++】36.C++IO流

文章目录 1. C语言的输入与输出2. 流是什么3. CIO流3.1 C标准IO流3.2 C文件IO流 4. stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。pri…

JavaScript表单介绍

一、表单的基本概念 在网页开发里&#xff0c;表单是实现用户与网页交互的关键组件&#xff0c;用于收集用户输入的数据&#xff0c;JavaScript 则能为表单增添强大的交互性和功能性。表单在 HTML 里通过 <form> 标签创建&#xff0c;包含多种表单元素&#xff0c;如文本…

哈希表(C语言版)

文章目录 哈希表原理实现(无自动扩容功能)代码运行结果 分析应用 哈希表 如何统计一段文本中&#xff0c;小写字母出现的次数? 显然&#xff0c;我们可以用数组 int table[26] 来存储每个小写字母出现的次数&#xff0c;而且这样处理&#xff0c;效率奇高。假如我们想知道字…

昆虫-目标检测数据集(包括VOC格式、YOLO格式)

昆虫-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接: https://pan.baidu.com/s/1tYb8s-AVJgSp7SGvqdWF9A?pwdt76a 提取码: t76a 数据集信息介绍&#xff1a; 共有 6009 张图像和一一对应的标注文件 标注文件格式提供了两种&#x…

C++(23):unreachable

C++23在头文件 "><utility>定义了std::unreachable(),用于指示编译器,该段代码不应该被允许,因此编译器可以对该位置进行优化,如果一旦允许了该位置的代码,行为未定义: #include <utility> #include <iostream>using namespace std;int func(…

备战蓝桥杯 Day1 回顾语言基础

开启蓝桥杯刷题之路 Day1 回顾语言基础 1.配置dev 工具->编译选项->勾选编译时加入以下命令->设定编译器配置(release和debug)都要-> -stdc11 ->代码生成/优化->代码生成/优化->语言标准(-std)->ISO C11 ->代码警告->显示最多警告信息(-Wall)…

python学opencv|读取图像(七十五)人脸识别:Fisherfaces算法和LBPH算法

【1】引言 前序学习进程中&#xff0c;已经掌握了使用Eigenfaces算法进行的人脸识别。相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;七十四&#xff09;人脸识别&#xff1a;EigenFaces算法-CSDN博客 在此基础上&#xff0c;学习剩余两种人脸识别算法&am…

React 前端框架介绍

什么是 React&#xff1f; React 是一个由 Facebook 开发并维护的开源 JavaScript 库&#xff0c;用于构建用户界面。它主要用于创建交互式用户界Face&#xff08;UI&#xff09;&#xff0c;尤其是当数据变化时需要更新部分视图时非常有效。React 的核心思想是组件化和声明性…

包装类的空指针异常

问题&#xff1a; Integer是引用对象&#xff0c;当初始化不进行赋值的时候是null,是null就不可以自动拆箱 实践&#xff1a; public class Test {public static void main(String[] args) {Integer num null;//自动拆箱int i num;} } 会包异常信息&#xff1a; Excepti…

【Elasticsearch】检索选定字段(Retrieve selected fields)

在 Elasticsearch 中&#xff0c;检索选定字段&#xff08;Retrieve selected fields&#xff09;是一个重要的功能&#xff0c;用于优化查询性能和减少数据传输量。以下是结合所有回答的详细总结&#xff0c;涵盖每种字段检索方式的原理、应用场景、性能特点以及限制。 1._so…

【MySQL】 基本查询(下)

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;【MySQL】 基本查询(下) 发布时间&#xff1a;2025.2.18 隶属专栏&#xff1a;MySQL 目录 Update语法案例 Delete删除数据语法案例 截断表语法案例 插入查询结果语法案例 聚合函数函数介绍案例 group by子句的使用语…

docker 基础命令使用(ubuntu)

docker 状态查询 docker ps docker ps -adocker --version docker info docker --help docker run --help docker ps --help ...docker 操作镜像命令 docker imagesdocker rmi 镜像id/镜像名docker 操作容器命令 docker ps docker ps -adocker run 命令 # 端口映射 -p 参数…

idea 2023.3.7常用插件

idea 2023.3.7常用插件 文档 idea 2019.3常用插件idea 2023.3.7常用插件 idea 2023.3.7常用插件 插件名称插件版本说明1AceJump3.5.9AceJump允许您快速将插入符号导航到编辑器中可见的任何位置。只需按“ctrl&#xff1b;”&#xff0c;键入一个字符&#xff0c;然后在Ace …

基于Flask的广西高校舆情分析系统的设计与实现

【Flask】基于Flask的广西高校舆情分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统综合运用Python、Flask框架及多种数据处理与可视化工具开发&#xff0c;结合Boot…

用什么办法能实现ubuntu里面运行的自己开发的python程序能自动升级。

要实现Ubuntu中自己开发的Python程序自动升级&#xff0c;可以通过以下几种方式&#xff1a; 1. 使用 Git 仓库 定时任务 如果你的Python程序托管在Git仓库中&#xff0c;可以通过定时拉取最新代码来实现自动升级。 步骤&#xff1a; 确保Python程序在Git仓库中。在Ubuntu上…

破解微服务疑难杂症:2025年全解决方案

微服务架构已经成为现代软件开发的主流选择&#xff0c;其优势在于能够将复杂的系统拆分为独立的服务模块&#xff0c;方便开发和维护。然而&#xff0c;在微服务的实施过程中&#xff0c;开发者往往会面临许多挑战&#xff0c;如服务间通信、数据一致性、性能优化和故障处理等…

Linux(Centos 7.6)命令详解:head

1.命令作用 将每个文件的前10行打印到标准输出(Print the first 10 lines of each FILE to standard output) 2.命令语法 Usage: head [OPTION]... [FILE]... 3.参数详解 OPTION: -c, --bytes[-]K&#xff0c;打印每个文件的前K字节-n, --lines[-]&#xff0c;打印前K行而…

NAT(网络地址转换)技术详解:网络安全渗透测试中的关键应用与防御策略

目录 NAT的作用 NAT类型 NAT工作流程示例 NAT 转换技术的原理 源地址转换&#xff08;SNAT&#xff0c;Source NAT&#xff09;&#xff1a; 目标地址转换&#xff08;DNAT&#xff0c;Destination NAT&#xff09;&#xff1a; 端口地址转换&#xff08;PAT&#xff0c…

【怎么使用Redis实现一个延时队列?】

怎么使用Redis实现一个延时队列? 详细说明Java代码示例解释注意事项使用Redis实现延时队列通常通过有序集合(Sorted Set)来实现,利用Redis的ZSET类型及其相关命令可以很方便地实现这一功能。 有序集合中的每个元素都有一个分数(score),我们可以利用这个分数来存储消息需…