Mybatis-Plus

发布于:2024-05-07 ⋅ 阅读:(24) ⋅ 点赞:(0)

一、什么是MybatisPlus

 二、入门案例

2.1 引入依赖

2.2 定义Mapper

BaseMapper提前封装了许多写好的sql语句

三、常见注解

四、常用配置

五、mybatisPlus使用流程

六、条件构造器

6.1 案例(基于QueryWrapper)的查询

    @Test
    void testQueryWrapper(){
        //1.构建查询条件
        QueryWrapper<User> wapper=new QueryWrapper<User>()
                .select("id","username","info","balance")
                .like("username","o")
                .ge("balance",1000);
        //2.查询
        List<User> users = userMapper.selectList(wapper);
        users.forEach(System.out::println);
    }


//用lamda可以避免硬编码
    @Test
    void testLambdaQueryWrapper(){
        //1.构建查询条件
        LambdaQueryWrapper<User> wapper=new LambdaQueryWrapper<User>()
                .select(User::getId,User::getUsername,User::getInfo,User::getBalance)
                .like(User::getUsername,"o")
                .ge(User::getBalance,1000);
        //2.查询
        List<User> users = userMapper.selectList(wapper);
        users.forEach(System.out::println);
    }


    @Test
    void testUpdateWrapper(){
        //1.要更新的数据
        User user = new User();
        user.setBalance(2000);
        //1.构建更新条件
        QueryWrapper<User> wapper=new QueryWrapper<User>()
                .eq("username","jack");

        //2.更新
        userMapper.update(user,wapper);

    }

    @Test
    void testUpdateWrapper(){
    //1.构建更新条件
       // List<Long> ids=List.of(1L,2L,3L,4L);
        List<Long> ids =new ArrayList<>();
        ids.add(1L);
        ids.add(2L);
        ids.add(4L);
        UpdateWrapper<User> wrapper=new UpdateWrapper<User>()
                .setSql("balance=balance-200")
                .in("id",ids);
        //2.更新
        userMapper.update(null,wrapper);
    }

七、自定义sql

八、Service接口

Service接口继承IService   Service接口的实现类继承IService的实现类(ServiceImpl)

九、案例(基于Restful风格实现下列接口)

9.1 Controller 层

ackage 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.domain.vo.UserVO;
import com.itheima.mp.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@Api(tags = "用户管理")
@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {

    private final IUserService userService;


    @ApiOperation("新增用户接口")
    @PostMapping
    public void saveUser(@RequestBody UserFormDTO userDTO) {
        //1.把DTO拷贝到PO
        User user = new User();
        BeanUtils.copyProperties(userDTO, user);
        //2.新增
        userService.save(user);
    }

    @ApiOperation("删除用户接口")
    @DeleteMapping("{id}")
    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) {
        //1.根据id查询用户
        User user = userService.getById(id);
        //2.把PO拷贝到vo

        return BeanUtil.copyProperties(user, UserVO.class);

    }


    @ApiOperation("根据id批量查询用户接口")
    @GetMapping
    public List<UserVO> QueryUserByIds(@ApiParam("用户id集合") @RequestParam("ids") List<Long> ids) {
        //1.根据id查询用户
        List<User> users = userService.listByIds(ids);
        //2.把PO拷贝到vo
        return BeanUtil.copyToList(users, UserVO.class);
    }

    @ApiOperation("根据id扣减余额")
    @PutMapping("/{id}/deduction/{money}")
    public void deductMoneyByid(
            @ApiParam("用户id") @PathVariable("id") Long id,
            @ApiParam("扣减金额") @PathVariable("money") Integer money) {

        userService.deductBalance(id, money);
    }
}

9.2 Service层

ackage 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.domain.vo.UserVO;
import com.itheima.mp.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@Api(tags = "用户管理")
@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {

    private final IUserService userService;


    @ApiOperation("新增用户接口")
    @PostMapping
    public void saveUser(@RequestBody UserFormDTO userDTO) {
        //1.把DTO拷贝到PO
        User user = new User();
        BeanUtils.copyProperties(userDTO, user);
        //2.新增
        userService.save(user);
    }

    @ApiOperation("删除用户接口")
    @DeleteMapping("{id}")
    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) {
        //1.根据id查询用户
        User user = userService.getById(id);
        //2.把PO拷贝到vo

        return BeanUtil.copyProperties(user, UserVO.class);

    }


    @ApiOperation("根据id批量查询用户接口")
    @GetMapping
    public List<UserVO> QueryUserByIds(@ApiParam("用户id集合") @RequestParam("ids") List<Long> ids) {
        //1.根据id查询用户
        List<User> users = userService.listByIds(ids);
        //2.把PO拷贝到vo
        return BeanUtil.copyToList(users, UserVO.class);
    }

    @ApiOperation("根据id扣减余额")
    @PutMapping("/{id}/deduction/{money}")
    public void deductMoneyByid(
            @ApiParam("用户id") @PathVariable("id") Long id,
            @ApiParam("扣减金额") @PathVariable("money") Integer money) {

        userService.deductBalance(id, money);
    }
}

十、案例 (IService的Lambda查询)

10.1 Controller

    @ApiOperation("根据复杂条件查询用户接口")
    @GetMapping("/list")
    public List<UserVO> QueryUsers(UserQuery userQuery) {
        //1.根据id查询用户
        List<User> users = userService.queryUsers(userQuery.getName(),
                                                  userQuery.getStatus(),
                                                  userQuery.getMinBalance(),
                                                  userQuery.getMaxBalance());
        //2.把PO拷贝到vo
        return BeanUtil.copyToList(users, UserVO.class);
    }
}

10.2 Service层

    @Override
    public List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {
    return     lambdaQuery()
                .like(name!= null,User::getUsername, name)
                .eq(status!= null,User::getStatus, status)
                .gt(minBalance!= null,User::getBalance, minBalance)
                .le(maxBalance!= null,User::getBalance, maxBalance)
                .list();



    }

十一、案例(IService的Lambda更新)

10.1 Service层

    @Override
    @Transactional
    public void deductBalance(Long id, Integer money) {
        //1.查询用户
        User user = this.getById(id);

        //2.校验用户状态
        if (user == null || user.getStatus()==2) {
            throw new RuntimeException("用户不存在或状态异常");
        }
        //3.校验余额是否充足
        if (user.getBalance() < money) {
            throw new RuntimeException("余额不足");
        }
        //4.扣减余额
        int remainBalance = user.getBalance() - money;
        lambdaUpdate()
                .set(User::getBalance, remainBalance)
                .set(remainBalance == 0,User::getStatus,2)
                .eq(User::getId, id)
                .eq(User::getBalance,user.getBalance())//乐观锁
                .update();
    }

十二、IService批量新增

十三、 扩展功能

13.1 代码生成

13.2 静态工具

13.3 逻辑删除

13.4 枚举处理器 

13.5 JOSN处理器

13.6 分页插件