Mybatis-Plus

Service接口

  1. 新增用户
复制代码
@ApiOperation("新增用户")
@PostMapping
public void saveUser(@RequestBody UserFormDTO userFormDTO) {
    User user = new User();
    BeanUtils.copyProperties(userFormDTO,user);
    user.setCreateTime(LocalDateTime.now());
    user.setUpdateTime(LocalDateTime.now());

    userService.save(user);
}

2.删除用户

复制代码
@ApiOperation("删除用户")
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
    userService.removeById(id);
}

@ApiOperation("根据id查询用户")
@GetMapping("/{id}")
public UserVO getUserById(@PathVariable Long id){
    User user=userService.getById(id);
    UserVO userVO=new UserVO();
    BeanUtils.copyProperties(user,userVO);
    return userVO;
}

3.根据id查询用户

复制代码
@ApiOperation("根据id查询用户")
@GetMapping("/{id}")
public UserVO getUserById(@PathVariable Long id){
    User user=userService.getById(id);
    UserVO userVO=new UserVO();
    BeanUtils.copyProperties(user,userVO);
    return userVO;
}

4.根据id批量查询

复制代码
@ApiOperation("根据id批量查询")
@GetMapping
public List<UserVO> getByIds(@RequestParam List<Long> ids){
    List<User>users = userService.listByIds(ids);
    return BeanUtil.copyToList(users,UserVO.class);
}

5.根据id查询用户

Controller:

复制代码
@ApiOperation("根据id扣减余额")
@PutMapping("/{id}/deduction/{money}")
public void deductionBalanceById(@PathVariable("id") Long id,@PathVariable("money") int money){
    userService.deductBalance(id,money);
}

Service

复制代码
@Autowired
private UserMapper userMapper;

@Override
public void deductBalance(Long id, int 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);

}

Controller:

复制代码
@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:

复制代码
@Override
public List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<User>()
            .like(name!=null,User::getUsername,name)
            .eq(status!=null,User::getStatus,status)
            .gt(minBalance!=null,User::getBalance,minBalance)
            .lt(maxBalance!=null,User::getBalance,maxBalance);

    return userMapper.selectList(queryWrapper);
}
复制代码
@Override
public void deductBalance(Long id, int money) {
    User user = getById(id);

    if(user==null||user.getStatus()==2){
        throw new RuntimeException("账户被冻结");
    }

    if (user.getBalance() < money) {
        throw new RuntimeException("余额不足");
    }

    int remainBalance = user.getBalance() - money;

    lambdaUpdate()
            .set(User::getBalance, user.getBalance() - money)
            .set(remainBalance==0,User::getStatus,2)
            .eq(User::getId,id)
            .update();

}

逻辑删除:

逻辑删除就是基于代码逻辑模拟删除效果,但并不会真正删除数据。

思路如下

  1. 在表中添加一个字段标记数据是否被删除

  2. 当删除数据时把标记置为1

  3. 查询时只查询标记为0的数据

例如逻辑删除字段为deleted:

删除操作

update user set deleted = 1 where id = 1 and deleted = 0

查询操作:

select * from user where deleted = 0

但是我们发现,每次update 和 select 都会有逻辑字段,那mp是不是不能用了

mp提供解决方法

mybatis-plus:

global-config:

db-config:

logic-delete-field: flag # 全局逻辑删除的字段实体字段名,字段类型可以是boolean,integer

logic-delete-value: #逻辑已删除值(默认为1)

logic-not-delete-value: #逻辑未删除值(默认为0)
注意:

逻辑删除本身存在问题,比如:

1.会导致数据库表垃圾数据越来越多,影响查询效率

2.SQL中全部需要对逻辑删除字段做判断,影响查询效率

因此,不太推荐逻辑删除,如果数据不能删除,可以采用把数据迁移到其他表的办法

枚举处理器:

每次假如状态这个字段,我们每次都等于数字,当数字多的时候就会很混乱降低可读性。

我们在往数据库存的时候是数字,所以我们需要

@EnumValue 来指定那个属性是向数据库存的

@JsonValue: 则是前端返回那个字段,不加则是枚举,加了之后,加在哪,返回什么样的数据类型

在application.yml配置全局枚举处理器:

mybatis-plus:

configuration:

default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

JSON处理器

  1. 给JSON类型对应的Java字段定义一个实体

  2. 给表的自动映射开启,实先Java与JSON之间的相互转换

分页查询

@Configuration

public class MybatisConfig{

@Bean

public MybatisPlusInterceptor mybatisPlusInterceptor(){

// 1 . 初始化核心插件

MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

// 2 . 添加分页查询

PaginationInnerInceptor pageInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);

pageInterceptor.setMaxLimit(1000L); //设置分页上限

interceptor.addInnerInterceptor(pageInterceptor);

return interceptor

}

}

page.of(页码,每页数量)

addOrder 添加排序

userService.page 返回的Page<User>p p.getTotal总条数,p.getPages 总页数

p.getRecords 分页数据

复制代码
@Override
public PageDTO<UserVO> queryUsersPage(UserQuery query) {
    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(query.getName()!= null,User::getUsername,query.getName())
           .eq(query.getStatus()!= null,User::getStatus,query.getStatus())
           .lt(query.getMinBalance()!=null,User::getBalance,query.getMinBalance())
           .gt(query.getMaxBalance()!=null,User::getBalance,query.getMaxBalance())
           .page(page);
    PageDTO<UserVO> pageDTO = new PageDTO<>();

    pageDTO.setTotal(p.getTotal());
    pageDTO.setPages(p.getPages());

    List<User>records = p.getRecords();

    if(CollUtil.isEmpty(records)){
        pageDTO.setList(Collections.emptyList());
        return pageDTO;
    }

    List<UserVO> vos = BeanUtil.copyToList(records, UserVO.class);

    pageDTO.setList(vos);

    return pageDTO;
}
相关推荐
OtIo TALL1 天前
Java进阶(ElasticSearch的安装与使用)
java·elasticsearch·jenkins
LeocenaY1 天前
C语言面试题总结
c语言·开发语言·数据结构
一 乐1 天前
交通感知与车路协同系统|基于springboot + vue交通感知与车路协同系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·交通感知与车路协同系统
Java面试题总结1 天前
FVG3 构建系统 MinGW 配置问题排查文档
java
乐之者v1 天前
游标分批查询,提高查询性能
java
城管不管1 天前
嵌入模型Embedding Model
java·开发语言·python·embedding·嵌入模型
斯维赤1 天前
每天学习一个小算法:选择排序
java·学习·算法
Rust研习社1 天前
Rust Pin 解析:核心原理与异步编程实践
开发语言·后端·rust
book123_0_991 天前
Spring Boot 条件注解:@ConditionalOnProperty 完全解析
java·spring boot·后端
Drone_xjw1 天前
解决 Qt 程序在 Kylin(麒麟)系统下表头“白屏”的问题
开发语言·qt·kylin