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;
}
相关推荐
LawrenceLan2 小时前
38.Flutter 零基础入门(三十八):网络请求实战 http、dio —— 获取列表与刷新 UI
开发语言·前端·flutter·dart
Predestination王瀞潞2 小时前
缓存机制:一二级缓存
spring·缓存·mybatis
HalvmånEver2 小时前
6.高并发内存池的内存释放全流程
开发语言·c++·项目学习··高并发内存池
杜子不疼.2 小时前
Spring Cloud+AI :实现分布式智能推荐系统
java·人工智能·spring cloud
OxyTheCrack2 小时前
【C++】简述Observer观察者设计模式附样例(C++实现)
开发语言·c++·笔记·设计模式
耶叶2 小时前
kotlin的修饰符
android·开发语言·kotlin
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 基于springBoot微服务架构的老年人社交系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
java1234_小锋2 小时前
Python常见面试题:Python是如何进行内存管理的?
java·jvm·python
Vic101012 小时前
java的分布式协议
java·开发语言·分布式