本文将介绍
IService
接口的基本业务操作、复杂业务操作、Lambda 方法的使用以及批量增加操作,帮助开发者深入了解如何高效地利用 MyBatis-Plus 提供的功能进行数据库操作。无论是简单的单表查询,还是复杂的多表联动,甚至是大数据量的批量操作,IService
都能为你提供便利的解决方案。
文章目录
前言
Iservice接口基本业务
Iservice接口复杂业务
IService的Lambda方法
IService的批量新增
总结
前言
现代 Java 开发中,Spring 框架和 MyBatis-Plus 已成为开发高效、灵活的企业级应用程序的重要工具。MyBatis-Plus 作为 MyBatis 的增强工具,提供了丰富的功能来简化数据库操作,其中 IService
接口是其核心之一。IService
不仅为我们提供了常见的 CRUD 操作,还支持 Lambda 查询、批量操作等高级功能,极大地提高了开发效率。
本文将介绍 IService
接口的基本业务操作、复杂业务操作、Lambda 方法的使用以及批量增加操作,帮助开发者深入了解如何高效地利用 MyBatis-Plus 提供的功能进行数据库操作。无论是简单的单表查询,还是复杂的多表联动,甚至是大数据量的批量操作,IService
都能为你提供便利的解决方案。
Iservice接口基本业务
首先引入依赖swagger依赖和web依赖
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
然后配置swagger信息
knife4j:
enable: true
openapi:
title: 用户管理接口文档
description: "用户管理接口文档"
email: zhanghuyi@itcast.cn
concat: 虎哥
url: https://www.itcast.cn
version: v1.0.0
group:
default:
group-name: default
api-rule: package
api-rule-resources:
- com.itheima.mp.controller
UserController类
新增用户
package com.itheima.mp.controller;
import cn.hutool.core.bean.BeanUtil;
import com.itheima.mp.domain.dto.UserFormDTO;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags="用户管理接口")
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService userService;
@ApiOperation("新增用户接口")
@PostMapping
//往往会传送json格式数据,所以加@RequestBody
public void saveUseer(@RequestBody UserFormDTO userFormDTO) {
//把DTO拷贝到po
User user = BeanUtil.toBean(userFormDTO, User.class);
//新增
userService.save(user);
}
}
删除用户
@ApiOperation("删除用户接口")
@DeleteMapping("{id}")
//往往会传送json格式数据,所以加@RequestBody
public void deleteUserById(@ApiParam("用户id") @PathVariable("id") Long id) {
userService.removeById(id);
}
根据id查询用户接口
@ApiOperation("根据id查询用户")
@GetMapping("{id}")
public UserVO getUserById(@ApiParam("用户id") @PathVariable("id") Long id) {
//查询用户
User user = userService.getById(id);
//把po拷贝到vo
UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);
return userVO;
}
根据id批量查询用户
@ApiOperation("根据id批量查询用户")
@GetMapping
public List<UserVO> queryUserByIds(@ApiParam("用户id集合 ") @RequestParam("ids") List<Long> ids) {
//查询用户
List<User> users = userService.listByIds(ids);
//把PO拷贝到VO
List<UserVO> userVOS = BeanUtil.copyToList(users, UserVO.class);
return userVOS;
}
Iservice接口复杂业务
根据id扣减用户余额
@ApiOperation("根据id扣除余额")
@PutMapping("/{id}/deduction/{money}")
public void deductMoneyById(
@ApiParam("用户id") @PathVariable("id") Long id,
@ApiParam("扣减的金额") @PathVariable("money") Integer money
){
userService.deductBalance(id,money);
}
IUserService接口
public interface IUserService extends IService<User> {
void deductBalance(Long id,Integer money);
}
UserServiceImpl类
package com.itheima.mp.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.mapper.UserMapper;
import com.itheima.mp.service.IUserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
@Override
public void deductBalance(Long id, Integer money) {
//查询用户
User user = this.getById(id);
//校验用户状态
if(user==null || user.getStatus() == 2){
throw new RuntimeException("用户状态异常");
}
//校验余额是否充足
if(user.getBalance() < money){
throw new RuntimeException("用户余额不足!");
}
//扣减余额
baseMapper.deductBalance(id,money);
}
}
userMapperr类
@Update("update user set balance = balance - #{money} where id = id")
void deductBalance(@Param("id")Long id,@Param("money")Integer money);
通过localhost:8080/doc.html就可以访问接口文档
IService的Lambda方法
<select id="queryUsers" resultType="com.itheima.mp.domain.po.UserSELECT *
FROM tb_user
<where>
<if test="name != null">
AND username LIKE #{name]</if><if test="status != null">
ANDstatus`=#{status}
</if>
<if test="minBalance != null and maxBalance != null">
AND balance BETWEEN #{minBalance}AND #{maxBalance}
</if>
</where>
</select>
UserController类
@ApiOperation("根据复杂条件查询用户接口")
@GetMapping("/list")
public List<UserVO> queryUsers(UserQuery userQuery) {
//查询用户po
List<User> users = userService.queryUsers(userQuery.getName(),userQuery.getStatus(),userQuery.getMinBalance(),userQuery.getMaxBalance());
List<UserVO> userVOS = BeanUtil.copyToList(users, UserVO.class);
return userVOS;
}
IService接口
List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance);
UserServiceImpl实现类
@Override
public List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {
List<User> users = lambdaQuery()
.like(name != null, User::getUsername, name)
.eq(status != null, User::getStatus, status)
.ge(minBalance != null, User::getBalance, minBalance)
.le(maxBalance != null, User::getBalance, maxBalance)
.list();
return users;
}
@Override
public void deductBalance(Long id, Integer money) {
//查询用户
User user = this.getById(id);
//校验用户状态
if(user==null || user.getStatus() == 2){
throw new RuntimeException("用户状态异常");
}
//校验余额是否充足
if(user.getBalance() < money){
throw new RuntimeException("用户余额不足!");
}
//余额
int remain = user.getBalance() - money;
lambdaUpdate().set(User::getBalance, remain)
.set(remain == 0, User::getStatus, 2)
.eq(User::getId, id)
//防止多线程引发
.eq(User::getBalance, user.getBalance())
.update();
}
IService的批量新增
@Test
void testSaveBatch(){
long b = System.currentTimeMillis();
//每次批量处理1000条
List<User> list = new ArrayList<>(1000);
for(int i = 1;i <= 100000;i++){
list.add(buildUser(i));
if(i % 10000 == 0){
//每1000条批量处理一次
userService.saveBatch(list);
list.clear();
}
}
long e = System.currentTimeMillis();
System.out.println("耗时:"+(e - b));
}
在application.yml文件中加入rewriteBatchedStatements=true
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
总结
通过本文的讲解,我们深入探讨了 MyBatis-Plus 中 IService
接口的多种常见用法。首先,IService
的基本业务方法简化了常见的 CRUD 操作,开发者无需编写冗长的 SQL 语句,便能实现数据库的增、删、改、查等操作。其次,借助 MyBatis-Plus 强大的 Lambda 功能,开发者可以更加灵活和简洁地构建查询条件,避免了传统 SQL 中条件拼接的复杂性。接着,我们介绍了如何通过 IService
实现复杂业务逻辑,尤其是多表操作的处理,进一步增强了应用的可扩展性和灵活性。最后,批量操作作为大数据量处理中的一项重要优化方法,saveBatch
使得批量插入变得更加简单高效,减少了数据库访问的次数。
通过充分掌握 IService
接口的使用,你可以大幅提升开发效率,减少代码重复度,并且能够灵活应对各种复杂的业务场景。希望本文所介绍的内容能够帮助你更好地理解并应用 MyBatis-Plus 的强大功能,提升你的开发水平与应用性能。