【MyBatisPlus】快速入门

文章目录

  • 1. 简单使用
  • 2. 条件构造器 —— 针对于复杂查询
  • 3. 自定义SQL
  • 4. IService
    • 4.1 基本接口方法
      • 4.1.1 新增
      • 4.1.2 删除
      • 4.1.3 修改
      • 4.1.4 查找
    • 4.2 开发基础业务接口
    • 4.3 开发复杂业务接口
    • 4.4 Lambda方法
    • 4.5 批量新增
  • 5. 代码生成
  • 6. 分页功能
    • 6.1 分页插件基本使用
    • 6.1 通用分页实体

1. 简单使用

public interface UserMapper extends BaseMapper<User> {}class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testvoid testInsert() {User user = new User();user.setUsername("xiaowang");user.setPassword("123");user.setPhone("18688990011");user.setBalance(200);user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());userMapper.insert(user);}@Testvoid testSelectById() {User user = userMapper.selectById(5L);System.out.println("user = " + user);}@Testvoid testQueryByIds() {List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L, 4L));users.forEach(System.out::println);}@Testvoid testUpdateById() {User user = new User();user.setId(5L);user.setBalance(20000);userMapper.updateById(user);}@Testvoid testDeleteUser() {userMapper.deleteById(5L);}
}

2. 条件构造器 —— 针对于复杂查询

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

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

在这里插入图片描述

@Test
public void testQueryWrapper(){// select id, username, info, balance from user where username like %o% and balance = 1000;QueryWrapper<User> wrapper = new QueryWrapper<User>().select("id", "username", "info", "balance").like("username", "o").ge("balance", 1000);List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);
}@Test
public void testUpdateByQueryWrapper(){// update user set balance = 2000 where username = "jack";User user = new User();user.setBalance(2000);QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username", "jack");userMapper.update(user, wrapper);
}@Test
public void testUpdateWrapper(){// update user set balance = balance - 200 where id in (1,2,4);List<Long> ids = Arrays.asList(1L, 2L, 4L);UpdateWrapper<User> wrapper = new UpdateWrapper<User>().setSql("balance = balance - 200").in("id", ids);userMapper.update(null, wrapper);
}

lambdaQueryWrapper解决上述testQueryWrapper硬编码问题

@Test
public void testLambdaQueryWrapper(){// select id, username, info, balance from user where username like %o% and balance = 1000;LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().select(User::getId, User::getUsername, User::getInfo, User::getBalance).like(User::getUsername, "o").ge(User::getBalance, 1000);List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);
}

条件构造器的用法:

  • QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分
  • UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用
  • 尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬编码

3. 自定义SQL

在这里插入图片描述

在这里插入图片描述

4. IService

4.1 基本接口方法

IService底层操作数据库,用的还是mapper

在这里插入图片描述

4.1.1 新增

在这里插入图片描述

4.1.2 删除

在这里插入图片描述

4.1.3 修改

在这里插入图片描述

4.1.4 查找

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

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

在这里插入图片描述

4.2 开发基础业务接口

在这里插入图片描述
IUserService.java

public interface IUserService extends IService<User> {
}

UserServiceImpl.java

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
}
@SpringBootTest
public class IUserServiceTest {@Autowiredprivate IUserService userService;@Testvoid testSaveUser() {User user = new User();user.setUsername("LiLei");user.setPassword("123");user.setPhone("18688990011");user.setBalance(200);user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());userService.save(user);}@Testvoid testQueryByIds() {List<User> users = userService.listByIds(Arrays.asList(1L, 2L, 3L, 4L));users.forEach(System.out::println);}
}

在这里插入图片描述

在这里插入图片描述

@Api(tags = "用户管理接口")
@RequestMapping("/users")
@RestController
@RequiredArgsConstructor
public class UserController {// final配合@RequiredArgsConstructor,可以通过构造函数注入private final IUserService userService;@ApiOperation("用户新增接口")@PostMappingpublic void saveUser(@RequestBody UserFormDTO userDTO){// 使用BeanUtil,将UserFormDTO对象的属性拷贝到User.classUser user = BeanUtil.copyProperties(userDTO, User.class);userService.save(user);}@ApiOperation("删除用户接口")@DeleteMapping("{id}")// @PathVariable用于RESTFUL风格,从路径中获取参数public void deleteUserById(@ApiParam("用户id") @PathVariable("id") Long id){userService.removeById(id);}@ApiOperation("根据id查询用户接口")@GetMapping("{id}")public UserVO queryUserById(@ApiParam("用户id") @PathVariable("id") Long id){User user = userService.getById(id);return BeanUtil.copyProperties(user, UserVO.class);}@ApiOperation("根据id批量查询用户接口")@GetMapping// @RequestParam用于从路径中获取参数,比如ids=1,2,4public List<UserVO> queryUserByIds(@ApiParam("用户id集合") @RequestParam("ids") List<Long> ids){List<User> users = userService.listByIds(ids);// List<PO> -> List<VO>return BeanUtil.copyToList(users, UserVO.class);}
}

4.3 开发复杂业务接口

Controller

@Api(tags = "用户管理接口")
@RequestMapping("/users")
@RestController
@RequiredArgsConstructor
public class UserController {@ApiOperation("扣减用户余额接口")@PutMapping("/{id}/deduction/{money}")public void deductMoneyById(@ApiParam("用户id") @PathVariable("id") Long id,@ApiParam("用户money") @PathVariable("money") Integer money){userService.deductBalance(id, money);}
}

service

@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {private final UserMapper userMapper;@Overridepublic void deductBalance(Long id, Long money) {User user = getById(id);if(user == null || user.getStatus() == 2){throw new RuntimeException("用户状态异常!");}if(user.getBalance() < money){throw new RuntimeException("用户余额不足!");}userMapper.deductBalance(id, money);}
}

mapper

public interface UserMapper extends BaseMapper<User> {void updateBalanceByIds(@Param(Constants.WRAPPER) UpdateWrapper<User> wrapper, @Param("amount") int amount);@Update("UPDATE user SET balance = balance - #{money} WHERE id = #{id}")void deductBalance(@Param("id") Long id, @Param("money") Long money);}

4.4 Lambda方法

controller

@Api(tags = "用户管理接口")
@RequestMapping("/users")
@RestController
@RequiredArgsConstructor
public class UserController {// final配合@RequiredArgsConstructor,可以通过构造函数注入private final IUserService userService;@ApiOperation("根据复杂条件查询用户接口")@GetMapping("/list")public List<UserVO> queryUsers(UserQuery query){List<User> users = userService.queryUsers(query.getName(), query.getStatus(), query.getMinBalance(), query.getMaxBalance());return BeanUtil.copyToList(users, UserVO.class);}
}

service

public interface IUserService extends IService<User> {List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance);
}
@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Overridepublic List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {// select * from user where name = ? ans status = ? and balance >= minBalance and balance <= maxBalance;return lambdaQuery().like(name != null, User::getUsername, name).eq(status != null, User::getStatus, status).gt(minBalance != null, User::getBalance, minBalance).lt(maxBalance != null, User::getBalance, maxBalance).list();}
}

4.5 批量新增

在这里插入图片描述

5. 代码生成

MyBatisPlus使用的过程如下:

在这里插入图片描述

这些代码都比较固定,只是类名不同,我们可以用插件自动生成这些比较固定的代码

在这里插入图片描述

在这里插入图片描述

配置数据库信息

在这里插入图片描述

配置代码生成信息

在这里插入图片描述

在这里插入图片描述

6. 分页功能

6.1 分页插件基本使用

MyBatisPlus内置的分页插件如下:

在这里插入图片描述
首先,需要在配置类中注册MyBatisPlus的核心插件,同时添加分页插件

@Configuration
public class MybatisConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {// 1 初始化核心插件MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 2 添加分页插件PaginationInnerInterceptor pageInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);pageInterceptor.setMaxLimit(1000L); // 设置分页上限interceptor.addInnerInterceptor(pageInterceptor);return interceptor;}
}

分页对象

在这里插入图片描述

引入依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId><version>3.5.3.1</version>
</dependency>
@Test
public void testPageQuery(){// 创建Page对象,设置分页参数int pageNo = 2, pageSize = 2;Page<User> page = Page.of(pageNo, pageSize);// 排序条件page.addOrder(new OrderItem("balance", true));page.addOrder(new OrderItem("id", true));// 分页查询Page<User> p = userService.page(page);long total = p.getTotal();  // 数据总条数long pages = p.getPages();  // 总页数List<User> users = p.getRecords();  // 第pageNo页数据,pageSize条users.forEach(System.out::println);
}

6.1 通用分页实体

统一的分页查询条件,包括页码、页大小、排序方式、是否升序

@Data
@ApiModel(description = "分页查询实体")
public class PageQuery {private Integer pageNo;private Integer pageSize;private String sortBy;private Boolean isAsc;
}

用户条件查询实体

@Data
@ApiModel(description = "用户条件查询实体")
public class UserQuery extends PageQuery{@ApiModelProperty("用户名关键字")private String name;@ApiModelProperty("用户状态:1-正常,2-冻结")private Integer status;@ApiModelProperty("余额最小值")private Integer minBalance;@ApiModelProperty("余额最大值")private Integer maxBalance;
}

返回实体PageDTO

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageDTO<V> {@ApiModelProperty("总条数")private Long total;@ApiModelProperty("总页数")private Long pages;@ApiModelProperty("结果集合")private List<V> list;
}

controller

@ApiOperation("根据复杂条件分页查询用户接口")
@GetMapping("/page")
public PageDTO<UserVO> queryUsersPage(UserQuery query){return userService.queryUsersPage(query);
}

service

@Service
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {private final UserMapper userMapper;@Overridepublic PageDTO<UserVO> queryUsersPage(UserQuery query) {String name = query.getName();Integer status = query.getStatus();// 分页参数Page<User> page = Page.of(query.getPageNo(), query.getPageSize());// 排序条件if(StrUtil.isNotBlank(query.getSortBy())){page.addOrder(new OrderItem(query.getSortBy(), query.getIsAsc()));}else{// 排序条件为空,按更新时间排序page.addOrder(new OrderItem("update_time", false));}Page<User> p = lambdaQuery().like(name != null, User::getUsername, name).eq(status != null, User::getStatus, status).page(page);PageDTO<UserVO> dto = new PageDTO<>();dto.setTotal(p.getTotal());dto.setPages(p.getPages());List<User> records = p.getRecords();// 查询结果为空,PageDTO的结果设置为空集合if(CollUtil.isEmpty(records)){dto.setList(Collections.emptyList());return dto;}// 工具包直接将List<User>转为List<UserVO>dto.setList(BeanUtil.copyToList(records, UserVO.class));return dto;}
}

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

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

相关文章

Linux--初识和基本的指令(1)

目录 前言 0.什么是操作系统 0.1 搭建 Linux 环境 0.2搭建 Linux 环境小结 1.使用 XShell 远程登录 Linux 1.1关于 Linux 桌面 1.2下载安装 XShell 1.3查看 Linux 主机 ip 1.4XShell 下的复制粘贴 2.Linux下基本指令 2.1 pwd命令 2.2 ls命令 2.3 mkdir指令 2.4 cd…

ControlNet原理及应用

《Adding Conditional Control to Text-to-Image Diffusion Models》 目录 1.背景介绍 2.原理详解 2.1 Controlnet 2.2 用于Stable Diffusion的ControlNet 2.3 训练 2.4 推理 3.实验结果 3.1 定性结果 3.2 消融实验 3.3 和之前结果比较 3.4 数据集大小的影响 4.结…

systemverilog:interface中端口方向、Clocking block的理解

1、interface中端口方向的理解 &#xff08;1&#xff09;从testbench的角度看&#xff0c;tb中信号的输入输出方向与interface中信号输入输出方向一致&#xff1a; &#xff08;2&#xff09;从DUT角度看&#xff0c;DUT中信号输入输出方向与interface中信号输入输出方向相反…

springboot323基于Java的美妆购物网站的设计与实现

交流学习&#xff1a; 更多项目&#xff1a; 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示&#xff1a; ————————————————

图像分类系列(三) GoogLeNet InceptionV1学习详细记录

前言 ​ 在上一期中介绍了VGG&#xff0c;VGG在2014年ImageNet 中获得了定位任务第1名和分类任务第2名的好成绩&#xff0c;而今天要介绍的就是同年分类任务的第一名——GoogLeNet 。 ​ 作为2014年ImageNet比赛冠军&#xff0c;GoogLeNet 比VGG更深的网络&#xff0c;比Alex…

基于Java+SpringBoot+Vue3+Uniapp+TypeScript(有视频教程)前后端分离健身预约系统设计与实现

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

Yolov5

Yolov5 Anchor &#xff11;&#xff0e;Anchor是啥&#xff1f; anchor字面意思是锚&#xff0c;是个把船固定的东东&#xff08;上图&#xff09;&#xff0c;anchor在计算机视觉中有锚点或锚框&#xff0c;目标检测中常出现的anchor box是锚框&#xff0c;表示固定的参考框…

App测试入门

App测试基础知识 App测试&#xff0c;是指对移动应用软件&#xff08;如手机app、平板app等&#xff09;进行全面和系统的测试&#xff0c;以确保其功能、性能、安全性、稳定性、兼容性等方面能满足用户的使用需求和期望。 App常见运行系统 IOS系统&#xff1a; IOS系统是苹果公…

服务容错之限流之 Tomcat 限流 Tomcat 线程池的拒绝策略

在文章开头&#xff0c;先和大家抛出两个问题&#xff1a; 每次提到服务限流为什么都不考虑基于 Tomcat 来做呢&#xff1f;大家有遇到过 Tomcat 线程池触发了拒绝策略吗&#xff1f; JUC 线程池 在谈 Tomcat 的线程池前&#xff0c;先看一下 JUC 中线程池的执行流程&#x…

【Linux】进程间通信 -- 共享内存

共享内存 共享内存是SystemV标准进程间通信的一种&#xff0c;该标准还有消息队列和信号量&#xff0c;但下文主要介绍共享内存&#xff0c;然后在谈一下信号量的内容。SystemV标准的进程间通信可以看做单机版的进程间通信。 // 1. log.hpp #pragma once#include <iostrea…

Java(一)(引用类型的参数在传递,方法重载,面向对象编程基础)

基本类型和引用类型的参数在传递的时候有什么不同? 基本类型的值传递:参数传输存储的数据值 引用类型的值传递:参数传输存储的地址值 传递数组名字的时候,传递的是数组的地址,change方法可以通过地址直接访问我们在堆内存中开辟的数组,然后改变数组,数组中的元素发生变化 方…

K-Means算法进行分类

已知数据集D中有9个数据点&#xff0c;分别是&#xff08;1,2&#xff09;&#xff0c;(2,3), (2,1), (3,1),(2,4),(3,5),(4,3),(1,5),(4,2)。采用K-Means算法进行聚类&#xff0c;k2&#xff0c;设初始中心点为&#xff08;1.1,2.2&#xff09;&#xff0c;&#xff08;2.3,3.…