MybatisPlus--03--IService、ServiceImpl

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 1. IService接口
    • 1.1 IService、ServiceImpl 接口的使用
      • 第一步:实现basemapper接口
      • 第二步:编写service类
      • 第三步:编写serviceImpl
      • 第四步:在controller层调用
    • 1.2 原理
  • 2. IService接口具体方法
    • 2.1 新增 save
        • 2.1.1新增一条记录
        • 2.1.2 批量操作
        • 2.1.3 设置批次数量
    • 2.2 查询 get
        • 根据id查询
    • 2.3 多行查询 list
        • 根据ID批量查询
        • 查询所有
    • 2.4 删除 remove
        • 根据id删除
        • 根据实体的id删除
        • 批量删除
        • 根据Map条件删除
    • 2.5 修改 update
        • 根据ID修改
        • 批量修改
        • 修改或更新
    • 2.6 查询记录数 count
    • 2.7 分页 Page
        • 配置
        • 分页查询数据


1. IService接口

在这里插入图片描述

1.1 IService、ServiceImpl 接口的使用

  • IService的使用需要另外两个接口的配合:baseMapper和ServiceImpl

在这里插入图片描述

第一步:实现basemapper接口

public interface AdminMapper extends BaseMapper<Admin> {
}

第二步:编写service类

public interface AdminService extends IService<Admin> {
}

第三步:编写serviceImpl

  • ServiceImpl里面是各种的方法实现,好奇的可以点进源码看下

两个泛型需要注意的

  • 第一个是继承basemapper的(AdminMapper)
  • 第二个是实体类(Admin)
public class AdminServiceImpl extends ServiceImpl<AdminMapper,Admin> implements AdminService {}

第四步:在controller层调用

我们可以参考IService接口解释或者Mybatis-plus官网的方法解释来调用


@Slf4j
@RestController
@RequestMapping("/data-board")
public class DataBoardController {@Autowired AdminService adminService;@PostMapping("/taskList")public ApiResponse<List<PersonalMediaTaskModel>> test1() {// adminService中有很多方法Admin admin = adminService.getById(13);return ApiResponse.createBySuccess(admin );}
}

1.2 原理

综合来看,比较合理的解释是:

  1. 从分层角度来解释,BaseMapper是DAO层的CRUD封装,而IService是业务业务逻辑层的CRUD封装,所以多了批量增、删、改的操作封装,这也比较符合官方指南中的阐述;
  2. IService是对BaseMapper的扩展,从BaseMapper、IService、ServiceImpl三者的类关系以及源码可以看出;
  3. 如果继承BaseMapper,则不需要去实现其内部方法,依靠mybatis的动态代理即可实现CRUD操作; 而如果自定义IBaseService去继承IService,则需要去实现IService中的方法;

在这里插入图片描述
在这里插入图片描述

2. IService接口具体方法

BaseMapper 是用在Mapper中,而IService是在Service层使用的封装接口,它进一步封装 CRUD 。为了和BaseMapper 中方法进行区分,它采用了不同的前缀:

  • save新增
  • get 查询单行
  • remove 删除
  • update修改
  • list 查询集合
  • page 分页

2.1 新增 save

在这里插入图片描述

2.1.1新增一条记录
@Resource
private UserService userService;
@Test
public void testServcie(){User user  = new User();user.setUsername("service增加");user.setPassword("12321");boolean save = userService.save(user);System.out.println("是否成功:"+save);
}

在这里插入图片描述

2.1.2 批量操作
@Resource
private UserService userService;
@Test
public void testServcie(){List<User> users = new ArrayList<>();User user1 = new User("批量增加1","123");users.add(user1);User user2 = new User("批量增加2","123");users.add(user2);User user3 = new User("批量增加3","123");users.add(user3);User user4 = new User("批量增加4","123");users.add(user4);User user5 = new User("批量增加5","123");users.add(user5);boolean save = userService.saveBatch(users);System.out.println("是否成功:"+save);
}

在这里插入图片描述

2.1.3 设置批次数量
public void testServcie(){List<User> users = new ArrayList<>();User user1 = new User("指定数量批量增加6","123");users.add(user1);User user2 = new User("指定数量批量增加7","123");users.add(user2);User user3 = new User("指定数量批量增加8","123");users.add(user3);User user4 = new User("指定数量批量增加9","123");users.add(user4);User user5 = new User("指定数量批量增加10","123");users.add(user5);boolean save = userService.saveBatch(users,2);System.out.println("是否成功:"+save);
}

在这里插入图片描述

2.2 查询 get

在这里插入图片描述

根据id查询
@Test
public void testServcie(){User user = userService.getById(1);System.out.println(user);
}

在这里插入图片描述

2.3 多行查询 list

在这里插入图片描述

根据ID批量查询
@Test
public void testServcie(){List<Integer> list = Arrays.asList(1, 2, 3);List<User> users = userService.listByIds(list);users.forEach(System.out::println);
}

在这里插入图片描述

查询所有
@Test
public void testServcie(){//返回listList<User> list = userService.list();System.out.println(list);//返回mapList<Map<String, Object>> maps = userService.listMaps();System.out.println(maps);List<Object> objects = userService.listObjs();System.out.println(objects);
}

在这里插入图片描述

2.4 删除 remove

在这里插入图片描述

根据id删除
@Test
public void testServcie(){boolean b = userService.removeById(21);
}

在这里插入图片描述

根据实体的id删除
@Test
public void testServcie(){User user = userService.getById(22);boolean b = userService.removeById(user);
}
批量删除
@Test
public void testServcie(){List<Integer> list = Arrays.asList(23, 24, 25);boolean b = userService.removeByIds(list);
}

在这里插入图片描述

根据Map条件删除
@Test
public void testServcie(){Map<String ,Object> map = new HashMap<>();map.put("username","批量增加5");map.put("password","123");boolean b = userService.removeByMap(map);
}

在这里插入图片描述

2.5 修改 update

在这里插入图片描述

根据ID修改
@Test
public void testServcie(){User user = userService.getById(27);user.setUsername("修改1");user.setPassword("213123");boolean b = userService.updateById(user);
}

在这里插入图片描述

批量修改
@Test
public void testServcie(){List<Integer> list = Arrays.asList(28, 29, 30);List<User> users = userService.listByIds(list);users.forEach(user -> {user.setUsername("批量修改");});boolean b = userService.updateBatchById(users);
}

在这里插入图片描述

修改或更新

在这里插入图片描述

2.6 查询记录数 count

在这里插入图片描述

@Test
public void testServcie(){long count = userService.count();System.out.println(count);
}

在这里插入图片描述

2.7 分页 Page

在这里插入图片描述
在Mybatis-plus中提供了有关分页的接口和实现类 IPage 和 Page

public class Page<T> implements IPage<T> {private static final long serialVersionUID = 8545996863226528798L;//用来存放查询出来的数据protected List<T> records = Collections.emptyList();//返回的数据总数protected long total = 0;// 每页显示条数,默认 10protected long size = 10;//当前页,默认1protected long current = 1;// 排序字段信息@Setterprotected List<OrderItem> orders = new ArrayList<>();//自动优化 COUNT SQLprotected boolean optimizeCountSql = true;// 是否进行 count 查询protected boolean searchCount = true;public Page() {}/*** 有参构造函数* @param current 当前页* @param size    每页显示条数*/public Page(long current, long size) {this(current, size, 0);}public Page(long current, long size, long total) {this(current, size, total, true);}public Page(long current, long size, boolean searchCount) {this(current, size, 0, searchCount);}public Page(long current, long size, long total, boolean searchCount) {if (current > 1) {this.current = current;}this.size = size;this.total = total;this.searchCount = searchCount;}//是否存在上一页public boolean hasPrevious() {return this.current > 1;}//是否存在下一页public boolean hasNext() {return this.current < this.getPages();}..........
}
配置
  • 使用Spring时,在Spring的配置文件中先配置mybatis-plus内置的分页插件
<!-- 配置mybatis-plus的分页拦截器-->
<bean id="paginationInnerInterceptor" class="com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor"/><!-- 配置mybatis-plus的分页拦截器插件 -->
<bean id="mybatisPlusInterceptor" class="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor"><property name="interceptors" ><list><ref bean="paginationInnerInterceptor"/></list></property>
</bean>
<!-- 将插件加入到MybatisSqlSessionFactoryBean 中-->
<bean class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"><!--加载连接池--><property name="dataSource" ref="dataSource"/><!-- 设置MyBatis配置文件的路径(可以不设置) --><property name="configLocation" value="classpath:mybatis-config.xml"/><!--加载映射文件路径--><property name="mapperLocations" value="classpath:mapping/*.xml"/><!--分页插件生效 --><property name="plugins"><array><ref bean="mybatisPlusInterceptor"/></array></property>
</bean>

使用SpringBoot时配置时,在配置类中配置

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;
}
分页查询数据
@Test
public void testServcie(){Page<User> page = userService.page(new Page<>(1,5));System.out.println("总数据:"+page.getTotal());List<User> users = page.getRecords();users.forEach(System.out::println);
}

在这里插入图片描述

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

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

相关文章

开发Chrome插件,background.js中log打印未出现在控制台

不同于内容脚本&#xff08;通常命名content.js&#xff09;&#xff0c;在后台脚本&#xff08;通常命名background.js或service-worker.js&#xff09;中console.log并不会在控制台中直接显示。 要查看后台脚本上下文的正确控制台&#xff0c;执行如下步骤&#xff1a; 访问…

蓝桥杯备赛系列——倒计时50天!

蓝桥杯备赛系列 倒计时50天&#xff01; 前缀和和差分 知识点 **前缀和数组&#xff1a;**假设原数组用a[i]表示&#xff0c;前缀和数组用sum[i]表示&#xff0c;那么sum[i]表示的是原数组前i项之和&#xff0c;注意一般用前缀和数组时&#xff0c;原数组a[i]的有效下标是从…

【Python笔记-设计模式】工厂模式

一、说明 (一) 解决问题 提供了一种方式&#xff0c;在不指定具体类将要创建的情况下&#xff0c;将类的实例化操作延迟到子类中完成。可以实现客户端代码与具体类实现之间的解耦&#xff0c;使得系统更加灵活、可扩展和可维护。 (二) 使用场景 希望复用现有对象来节省系统…

Maven depoly:Skipping artifact deployment

问题描述&#xff1a; 使用IDEA执行mvn depoly将本地开发的模块发布到Maven私服时&#xff0c;一直提示&#xff1a;Skipping artifact deployment&#xff0c;自动跳过了depoly部署阶段。 问题分析 Maven构建生命周期中的每一个阶段都是由对应的maven插件执行具体工作的。既然…

使用IDEA创建spring boot web项目并测试运行

文章目录 准备工作构建项目1、通过Maven Archetype构建一个webapp项目2、添加 Spring Boot 所需依赖3、创建配置文件4、创建启动类5、创建web api 接口6、测试web api接口 准备工作 idea下载地址&#xff1a; https://www.jetbrains.com/idea/download/?sectionwindows java下…

关于torch.cuda.is_available() 返回False 详细说明及解决

一 cuda 环境检测失败 cuda 环境检测代码&#xff1a; import torchprint(torch.__version__) print(torch.cuda.is_available()) print(torch.version.cuda) cuda 环境检测代码执行结果如下图&#xff1a; 关键代码print(torch.cuda.is_available()) 返回 False 通常表示当…

java.lang.IllegalStateException: Promise already completed.

spark submit 提交作业的时候提示Promise already complete 完整日志如下 File "/data5/hadoop/yarn/local/usercache/processuser/appcache/application_1706192609294_136972/container_e41_1706192609294_136972_02_000001/py4j-0.10.6-src.zip/py4j/protocol.py"…

Draw.io绘制UML图教程

一、draw.io介绍 1、draw.io简介 draw.io 是一款强大的免费在线图表绘制工具&#xff0c;支持创建流程图、组织结构图、时序图等多种图表类型。它提供丰富的形状库、强大的文本编辑和样式设置功能&#xff0c;使用户能够轻松创建专业级图表。draw.io 具有用户友好的界面&…

LeetCode 热题 100 | 二叉树(终)

目录 1 二叉树小结 1.1 模式一 1.2 模式二 2 236. 二叉树的最近公共祖先 3 124. 二叉树中的最大路径和 菜鸟做题&#xff08;返校版&#xff09;&#xff0c;语言是 C 1 二叉树小结 菜鸟碎碎念 通过对二叉树的练习&#xff0c;我对 “递归” 有了一些肤浅的理解。…

【激光SLAM】基于滤波的激光SLAM方法(Grid-based)

Filter-based SLAM 贝叶斯滤波数学概念贝叶斯滤波特性贝叶斯滤波的推导 粒子滤波&#xff08;Particle filter&#xff09;特性流程状态传播权重评估重采样算法流程存在的问题 FastSLAM的原理及优化FastSLAM介绍算法流程FastSLAM优化存在的问题及优化进一步优化proposal分布最终…

RabbitMQ学习整理————基于RabbitMQ实现RPC

基于RabbitMQ实现RPC 前言什么是RPCRabbitMQ如何实现RPCRPC简单示例通过Spring AMQP实现RPC 前言 这边参考了RabbitMQ的官网&#xff0c;想整理一篇关于RabbitMQ实现RPC调用的博客&#xff0c;打算把两种实现RPC调用的都整理一下&#xff0c;一个是使用官方提供的一个Java cli…

思维模型整合

思维模型整合 4P--- 4C思考模型能力圈模型 4P— 4C思考模型 在竞争激烈的今天&#xff0c;每个赛道都有众多可以为客户提供相同价值的对手&#xff0c;而赛道中的佼佼者之所以能打败大部分人&#xff0c;可能并不是他们能比别人更能讨好大众&#xff0c;而是因为在这个赛道它有…

Jmeter学习系列之六:阶梯加压线程组Stepping Thread Group详解

性能测试中,有时需要模拟一种实际生产中经常出现的情况,即:从某个值开始不断增加压力,直至达到某个值,然后持续运行一段时间。 在jmeter中,有这样一个插件,可以帮我们实现这个功能,这个插件就是:Stepping Thread Group 1、下载配置方法 1.1.下载配置 插件下载地址:…

Selenium定位不到元素怎么办?一定要这么做

在使用Selenium进行自动化测试时&#xff0c;碰到无法定位元素该怎么办&#xff1f;这里总结了9种情况下的元素定位方法&#xff1a; 1、frame/iframe表单嵌套 WebDriver只能在一个页面上对元素识别与定位&#xff0c;对于frame/iframe表单内嵌的页面元素无法直接定位。 解决…

Jenkins持续集成Python项目

一、前言   之前学习了很多自动化测试框架&#xff0c;但是写的脚本都是本地执行&#xff0c;多数用来造数据。最近公司掀起一股自动化测试的风&#xff0c;所以就想研究下如何集成jenkins&#xff0c;本次采用pytest&#xff0c;用的是阿里云服务器centos7。 二、服务器环境…

石头剪刀布游戏(C语言)

题目描述 石头剪刀布游戏有 3 种出拳形状&#xff1a;石头、剪刀、布。分别用字母 A , B , C 表示。 游戏规则: 出拳形状之间的胜负规则如下&#xff1a; A > B&#xff1b;B > C&#xff1b;C > A&#xff1b;">"左边一个字母&#xff0c;表示相对优…

bat 查找文件所在

脚本 在批处理文件&#xff08;.bat&#xff09;中查找文件所在的目录&#xff0c;你可以使用dir命令结合循环和条件语句来实现。以下是一个简单的示例&#xff0c;演示如何在批处理文件中查找指定文件并输出其所在目录&#xff1a; echo off setlocal enabledelayedexpansio…

Vue 封装的 axios 类的使用(小bug 改进)

http类 import { baseUrl } from "./config"; //引入config.js中的配置 import axios from "axios"; //引入axios import qs from "querystringify"; //form-Data请求时的工具类class Http{axios null;lastRequestIntercept null…

开源LLMs导览:工作原理、顶级LLM列表对比

目录 一、开源 LLM 是什么意思&#xff1f;二、开源LLM如何工作&#xff1f;2.1 预训练2.2 代币化2.3 开源LLM的微调2.4 输入编码2.5 训练与优化2.6 推理 三、开源LLM对组织的好处3.1 增强的数据安全和隐私3.2 节约成本3.3 减少供应商依赖性3.4 代码透明度 四、哪种LLM模式最好…

数据可视化在商业领域有哪些重要性?

数据可视化在商业领域的重要性体现在多个方面&#xff0c;它通过将复杂的数据集转化为直观、易于理解的图形和图表&#xff0c;帮助企业和组织做出更明智的决策。以下是数据可视化对商业的一些关键重要性&#xff1a; 提高决策效率&#xff1a;通过直观的图表和图形&#xff0c…