MybatisPlus【SpringBoot】 3 基本CRUD

news/2024/4/27 4:41:55/文章来源:https://blog.csdn.net/weixin_44226181/article/details/127440571

MybatisPlus【SpringBoot】

【【尚硅谷】2022版MyBatisPlus教程(一套玩转mybatis-plus)】

3 基本CRUD

文章目录

      • MybatisPlus【SpringBoot】
      • 3 基本CRUD
        • 3.1 BaseMapper
        • 3.2 插入
        • 3.3 删除
          • 3.3.1 通过id 删除记录
          • 3.3.2 通过id 批量删除记录
          • 3.3.3 通过map 条件删除记录
        • 3.4 修改
        • 3.5 查询
          • 3.5.1 根据id 查询用户信息
          • 3.5.2 根据多个id 查询多个用户信息
          • 3.5.3 通过map 条件查询用户信息
          • 3.5.4 查询所有数据
        • 3.6 通用Service
          • 3.6.1 IService
          • 3.6.2 创建Service 接口和实现类
          • 3.6.3 测试查询记录数
          • 3.6.4 测试批量插入

3.1 BaseMapper

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

在这里插入图片描述

package com.baomidou.mybatisplus.core.mapper;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<? extendsSerializable> 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<? extendsSerializable> 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 queryresult is multiple records");}return ts.get(0);}return null;}/*** 根据 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);
}

3.2 插入

先补一个构造器。

在这里插入图片描述

//插入测试
@Test
public void testInsert(){User user = new User(null,"张三",23,"zhangsan@atguigu.com");int result = userMapper.insert(user);System.out.println("受影响行数:" + result);System.out.println("id自动获取" + user.getId());
}

测试结果

在这里插入图片描述

最终执行的结果,所获取的id为xxxxxxxxxxxxxxxxxxxx
这是因为MyBatis-Plus在实现插入数据时,会默认基于雪花算法的策略生成id

3.3 删除

3.3.1 通过id 删除记录
//通过id删除记录
@Test
public void testDeleteById(){int result = userMapper.deleteById(1580164951486169090L);System.out.println("受影响行数:" + result);
}

测试结果

在这里插入图片描述

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

测试结果

在这里插入图片描述

3.3.3 通过map 条件删除记录
//通过map条件删除记录@Testpublic void testDeleteByMap() {Map<String, Object> map = new HashMap<>();map.put("age", 23);map.put("name", "张三");int result = userMapper.deleteByMap(map);System.out.println("受影响行数:" + result);}

测试结果

在这里插入图片描述

可以看到是一个组合条件查询

3.4 修改

//修改
@Test
public void testUpdateById(){User user = new User(4L,"admin",22,null);int result = userMapper.updateById(user);System.out.println("受影响行数:" + result);
}

测试结果

在这里插入图片描述

3.5 查询

3.5.1 根据id 查询用户信息
//根据id查询用户信息
@Test
public void testSelectById(){User user = userMapper.selectById(4L);System.out.println(user);
}

测试结果

在这里插入图片描述

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

测试结果

在这里插入图片描述

3.5.3 通过map 条件查询用户信息
//通过map 条件查询用户信息
@Test
public void testSelectByMap() {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);
}

测试结果:

在这里插入图片描述

3.5.4 查询所有数据
//查询所有数据
@Test
public void testSelectList(){List<User> list = userMapper.selectList(null);list.forEach(System.out::println);
}

测试结果

在这里插入图片描述

通过观察BaseMapper中的方法,大多方法中都有Wrapper类型的形参,此为条件构造器,可针对于SQL语句设置不同的条件,若没有条件,则可以为该形参赋值null,即查询(删除/修改)所有数据

3.6 通用Service

说明:
通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删
除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,
泛型 T 为任意实体对象
建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承
Mybatis-Plus 提供的基类:
官网地址:https://baomidou.com/pages/49cc81/#service-crud-%E6%8E%A5%E5%8F%A3

在这里插入图片描述

3.6.1 IService

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

3.6.2 创建Service 接口和实现类
package com.dingjiaxiong.mybatisplus.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.dingjiaxiong.mybatisplus.domain.User;/*** ClassName: UserService* date: 2022/10/12 20:17** @author DingJiaxiong*/public interface UserService extends IService<User> {
}
package com.dingjiaxiong.mybatisplus.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dingjiaxiong.mybatisplus.domain.User;
import com.dingjiaxiong.mybatisplus.mapper.UserMapper;
import com.dingjiaxiong.mybatisplus.service.UserService;
import org.springframework.stereotype.Service;/*** ClassName: UserServiceImpl* date: 2022/10/12 20:17** @author DingJiaxiong*/@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
3.6.3 测试查询记录数
@Autowired
private UserService userService;@Test
public void testGetCount(){long count = userService.count();System.out.println("总记录数:" + count);
}

测试结果:

在这里插入图片描述

3.6.4 测试批量插入

先加一个无参构造方法

在这里插入图片描述

//测试批量插入
@Test
public void testSaveBatch(){ArrayList<User> users = new ArrayList<>();for (int i = 0 ; i < 5 ; i++){User user = new User();user.setName("dingjiaxiong" + i);user.setAge(20 + i);users.add(user);}userService.saveBatch(users);
}

测试结果:

在这里插入图片描述

OK。

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

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

相关文章

【Svelte】-(7)绑定|Each 块绑定 / audio video 媒体标签绑定 / client offset 尺寸绑定 / this / 组件绑定

文章目录Each 块绑定媒体标签绑定尺寸绑定this组件绑定Each 块绑定 您也可以在 Each 的过程中使用。 不过需要注意的是&#xff0c;与这些 <input> 交互会改变数组。当要使用不可变数据&#xff0c;应该去避免使用这些绑定&#xff0c;并且改用事件来处理这些内容。 <…

nvm切换node版本

在实际的前端开发过程中&#xff0c;可能会经常遇见 node.js 的版本问题&#xff0c;不同的项目需要使用不同的 node.js 版本。比如Vue2和Vue3需要的Node版本不一样。 地址&#xff1a;https://github.com/coreybutler/nvm-windows/releases 注意&#xff1a;安装之前必须完…

[LCT刷题][树链信息维护] P4332 [SHOI2014]三叉神经树

写在前面 把黑题看成蓝题结果想了老半天感觉不对劲 本题对于理解SplaySplaySplay和LCTLCTLCT结构具有至关重要的意义&#xff0c;值得反复思考。 可能因为我比较菜 题目思路 题目给定一个类似神经网络的东西&#xff0c;每个节点都具有激活层、三输入单输出&#xff0c;输…

node.js+vue+Web的疫情大数据平台分析系统

以往的疫情防控管理事务处理主要使用的是传统的人工管理方式&#xff0c;这种管理方式存在着管理效率低、操作流程繁琐、保密性差等缺点&#xff0c;长期的人工管理模式会产生大量的文本文件与文本数据&#xff0c;这对事务的查询、更新以及维护带来不少困难。随着互联网时代的…

Google共码未来 与 C站 创造者的经历

本人仅参加一天活动 2022.9.14&#xff1b;吃喝拉撒全免费哈哈哈 大会主题&#xff1a;共码未来 looker、chromium、wouldnt、jetpack looker https://blog.csdn.net/WebEye_Marketing/article/details/116047404 chromium https://blog.csdn.net/arv002/article/details/1…

SEO和SEM的区别是什么,哪个效果更好一些

SEO指的是搜索引擎优化&#xff0c;SEM指的是搜索引擎影响&#xff0c;那么SEO和SEM的区别具体是什么&#xff1f;对于初创业的企业来说&#xff0c;哪个更好呢&#xff1f;下面&#xff0c;本文将介绍SEO和SEM的区别&#xff0c;帮助企业和公司网络人员理清这两者的优劣势。 S…

【力扣刷题】Day31——DP专题

文章目录七、子序列问题&#xff08;线性DP and 区间DP&#xff09;1、子序列&#xff08;不连续&#xff09;29.最长递增子序列&#xff08;LIS&#xff09;30. 最长公共子序列 &#xff08;LCS&#xff09;31.不相交的线2、子序列&#xff08;连续&#xff09;32. 最长连续递…

C语言中的指针

一。什么是指针&#xff1f; 在计算机科学中&#xff0c;指针&#xff08;Pointer&#xff09;是编程语言中的一个对象&#xff0c;利用地址&#xff0c;它的值直接指向&#xff08;points to&#xff09;存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元&a…

一棋盘的麦子

14天阅读挑战赛 有一个古老的传说&#xff0c;一位国王的女儿不幸落水&#xff0c;水中有很多鳄鱼&#xff0c;国王情急之下下令&#xff1a; 来&#xff0c;就把女儿嫁给他。”很多人纷纷退让&#xff0c;一个勇敢的小伙子挺身而出&#xff0c;冒着生命危险把公 一看是个穷小子…

Java程序员快速掌握前端知识

Java程序员是一个需要终身学习的岗位&#xff0c;加之技术更新迭代越来越快&#xff0c;程序员们不得不坚持提升自己&#xff0c;上班可能接触到新事物&#xff0c;下班也要抓紧时间钻研&#xff0c;才能不被时代淘汰。 前端技术&#xff0c;Java程序员可以不精通&#xff0c;…

新手如何自学python?

对于初学者来说&#xff0c;视频教程相比于书籍更加直观有效&#xff0c;可以先看视频进行学习&#xff0c;然后再看书进行深刻学习~下面就给你分享下教程以及书籍~ 网站 1. 网易公开课 https://open.163.com/ 2. 腾讯课堂 https://ke.qq.com/ 3. 中国大学慕课 https://www.…

xxl-job反序列化漏洞分析复现

01 影响范围 Xxl-Job<2.1.2&#xff0c;需要利用Hessian触发。 02 环境搭建 下载地址&#xff1a;https://github.com/xuxueli/xxl-job/releases 修改配置文件 xxl-job-2.0.1/xxl-job-admin/src/main/resources/application.properties 修改数据库信息&#xff0c;以及…

动手写数据库:实现记录管理

在数据库中&#xff0c;数据以”记录“作为一个单元来存储&#xff0c;例如一个表的“一行”就对应一条记录。假设我们有一个表叫STUDENT&#xff0c;其中有name, age, sex, class等字段&#xff0c;那么一条记录的信息就由这四个字段对应的信息合成。一条记录如何存储并不是一…

FFmpeg入门详解之110:RTSP协议讲解

RTSP亲手搭建直播点播 测试工具&#xff1a;VLC 数据源&#xff1a; 文件或本地摄像头 测试功能&#xff1a;RTSP直播点播 播放地址&#xff1a;rtsp://127.0.0.1:8554/rtspa001 服务端&#xff1a;推流 客户端&#xff1a;拉流 RTSP&#xff08;Real Time Streaming Pro…

Windows定时截屏、后台自动截屏工具,带有密码保护功能 —— 定时执行专家

目录 一、软件简介 二、使用教程 1、软件下载 2、软件的安装方法 3、无察觉自动截屏&#xff08;例如&#xff1a;间隔每 10分钟&#xff0c;执行 1次&#xff09; 一、软件简介 《定时执行专家》是一款制作精良、功能强大、简单易用、毫秒级精度、专业级的定时任务执行软…

Windows Server安全日志与系统事件变更审计

了解用户何时变更计算机内部时钟上的时间和日期。如果系统时间已变更&#xff0c;记录的事件将反映此新时间&#xff0c;而不是事件发生的实际时间。对系统时间不正确的变更可对应用程序造成严重破坏。 您可在Windows 2003 / 2008 / 2012计算机的安全日志中找到有价值信息&…

SpringBoot——可真是迅速又便捷

刚工作那会用的还是tomcat、springMVC、hibernate、mybatis、html、jsp……搭个项目可真是麻烦&#xff0c;各种复杂的结构还得打个war包配置web.xml&#xff0c;启动tomcat……后来也没做网站开发了&#xff0c;最近又看了看springboot&#xff0c;比之前那种开发web项目简单多…

测试人生 | 转行测试开发,4年4“跳”年薪涨3倍,我的目标是星辰大海(附大厂面经)!

编者按&#xff1a;本文来自霍格沃兹测试学院优秀学员TesterC&#xff0c;**从运营岗位转行外包测试&#xff0c;再到测试开发&#xff0c;从待业在家到4年4“跳”进入 BAT 大厂&#xff0c;年薪涨了3倍&#xff01;**他是如何完成如此励志的华丽转身的&#xff1f; 应学院的邀…

C++5-explicit、const的用法、mutable、常成员函数构成重载、在主函数中修改m_i的值

一、explicit的使用 explicit作用&#xff1a; 明确确定构造函数只能构造对象 代码示例&#xff1a; class A { public:A(int i 0):m_i(i){cout<<"A"<<i<<endl;}//构造函数可以用作类型转换&#xff0c;将int转换成类对象//explicit A(int i …

网络原理 --- 传输层Ⅰ UDP协议

文章目录网络原理传输层UDP 协议总结网络原理 介绍TCP/IP协议中每一层里面的核心内容~ 应用层传输层网络层数据链路层物理层 传输层 传输层主要负责端到端之间的传输,重点关注的是起点和终点 核心的协议有两个: UDP: 无连接 ,不可靠传输,面向数据报,全双工TCP : 有连接,可…