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://xiahunao.cn/news/2803416.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

白令海峡的题解

原题描述&#xff1a; 时间限制: 1000ms 空间限制: 524288kB 题目描述 很久很久以前&#xff0c;一座大陆桥横跨西伯利亚东端与美洲大陆西端。 处于进化早期的人类&#xff0c;正以部落的形式在大陆上游荡、捕猎&#xff0c;四海为家。在饥饿与寒冷折磨下&#xff0c;人…

开源软件:塑造软件行业未来的协作与创新之力

随着信息技术的迅猛发展&#xff0c;开源软件已经逐渐成为软件开发的潮流&#xff0c;以其独特的低成本、可协作性和透明度等特性&#xff0c;在全球范围内引起了广泛的关注和应用。越来越多的企业和个人选择使用开源软件&#xff0c;这不仅推动了软件行业的繁荣&#xff0c;还…

电路设计(27)——交通信号灯的multisim仿真

1.功能要求 使用数字芯片设计一款交通信号灯&#xff0c;使得&#xff1a; 主干道的绿灯时间为60S&#xff0c;红灯时间为45S 次干道的红灯时间为60S&#xff0c;绿灯时间为45S 主、次干道&#xff0c;绿灯的最后5S内&#xff0c;黄灯闪烁 使用数码管显示各自的倒计时时间。 按…

: ) 万字项目实践指南——贪吃蛇 手把手教你写出自己的小游戏!

目录 前言 1. 游戏背景 2. 游戏效果演示 3. 目标 4. 项目定位 5. 技术要点 6. Win 32 API 介绍 6.1 Win32 API 6.2 控制台程序&#xff08;Console) 6.3 控制台屏幕上的坐标COORD​ 6.4 GetStdHandle 6.5 GetConsoleCursorInfo 6.5.1 CONSOLE_CURSOR_INFO ​ 6.6 SetConsoleCur…

Yooasset、UniTask 使用遇到的一个奇怪的问题

先上截图 从截图可以看出 释放资源的方法是一个同步方法&#xff0c;但是执行释放资源的时候&#xff0c;竟然触发了我另一个地方的代码。 经检查&#xff0c;这个地方之所以会被执行&#xff0c;是因为Yooasset在释放资源的时候&#xff0c;激活了加载资源的等待。

迅为RK3568开发板驱动开发指南-输入子系统

《iTOP-RK3568开发板驱动开发指南》更新&#xff0c;本次更新内容对应的是驱动&#xff08;第十三篇 输入子系统&#xff09;视频&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。 第13篇-输入子系统目录 第1篇 驱动基础篇 第2篇 字符设备基础 第3篇 并发与竞争 …

如何用jmeter请求application/octet-stream,image/jpeg

用postman调用时&#xff1a; 用jmeter&#xff1a; 注意上图不要勾选&#xff0c;不然会把所有的内容都以二进制传进去&#xff0c;我们不勾选只传二进制的图片内容&#xff0c;勾选了会把MIME类型、参数名称都转为二进制传进去。会报错。

网络知识

目录 IP地址(Internet protocol address) —— 互联网协议地址 子网掩码 网关 路由 DNS&#xff08;Domain Name Server&#xff09; —— 域名服务器 IP地址(Internet protocol address) —— 互联网协议地址 子网掩码 作用&#xff1a;划分网段 网络部分相同的IP地址&a…

【数据结构】排序(2)

目录 一、快速排序&#xff1a; 1、hoare(霍尔)版本&#xff1a; 2、挖坑法&#xff1a; 3、前后指针法&#xff1a; 4、非递归实现快速排序&#xff1a; 二、归并排序&#xff1a; 1、递归实现归并排序&#xff1a; 2、非递归实现归并排序&#xff1a; 三、排序算法…

实在智能签约国内头部燃气集团:用Agent加速数智化深入,量利双升建设智慧燃气

燃气是我国四大能源产业之一&#xff0c;是推进国民经济建设与生态保护协同发展的主战场&#xff0c;高速的发展机遇下伴随着诸多挑战&#xff1a;随着业务规模扩大&#xff0c;运营工作量和复杂度不断上升&#xff0c;考验企业的业态模式能力&#xff1b;运营各环节需投入大量…

基于springboot+vue的智能推荐的卫生健康系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

你还不会大厂必考的10个经典排序算法吗?

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ 前言 众所周知&#xff0c;10个经典排序算法在大厂的校招、社招面试中频繁出现&#xff0c;那么今天我们就来用JS语言实现一下这10个经典排序算法吧。 概念 排序算法&#xff1a; 排序算法是《数据结构与算法》中…

vscode远程调试服务器的Python代码

目录 1 配置vscode远程阅读代码 2 打开conda环境 3 配置相应的调试环境 4 开始调试 这篇博客首先参考了我自己之前的两篇博客 vscode怎么查看python库的源代码/vscode打开conda环境 ubuntu上安装vscode&#xff0c;并远程开发与远程调试服务器代码 1 配置vscode远程阅读…

Intel PT简介以及perf 使用 Intel pt

文章目录 前言一、工作原理二、追踪执行流程三、追踪定时信息四、perf使用 intel pt4.1 perf record4.2 perf report4.3 perf script 五、与 Intel LBR 比较六、perf 对 Intel pt 的支持参考资料 前言 代码插装是最古老的性能分析方法之一。我们经常使用它。在函数开头插入pri…

Oerlikon欧瑞康LPCVD system操作使用说明

Oerlikon欧瑞康LPCVD system操作使用说明

C++从入门到精通 第五章(指针与引用)

写在前面&#xff1a; 本系列专栏主要介绍C的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程&#xff0c;笔者的原创部分主要在示例代码的注释部分。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C教材&#xff08;比…

怎么把ppt压缩到10m以内?立刻学会~

在分享PPT文件时&#xff0c;文件大小通常会成为一个重要考虑因素。过大的文件不仅会增加传输和下载时间&#xff0c;还可能遇到一些网络限制。本文将介绍如何将PPT文件压缩到10M以内的方法&#xff0c;并详细介绍使用压缩工具的解决方案。 使用压缩工具的解决方法 工具一&…

http协议基础与Apache的简单介绍

一、相关介绍&#xff1a; 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集因特网&#xff1a;世界上最大的互联网网络。即因特网概念从属于互联网概念。习惯上&#xff0c;大家把连接在因特网上的计算机都成为主机。万维网&#xff1a;WWW&#xff08;world…

Excel面试题及答案(1)

1.辅助列添加,快速填充方式填充隔行的编号;定位条件定位到空值后,右击---插入整行 2.利用通配符计算A3:A9含有车间的单元格个数(保留计算公式)。 3.利用身份证号提取 “性别”、“年月日”、“年龄” 性别:利用mid()方法,添加了一列辅助列,根据提取身份证后面第2位…

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

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