MybatisPlus-13.扩展功能-DB静态工具

一.DB静态工具

我们来看mp提供的第二个扩展功能——DB静态工具。首先我们来看Db类中都提供了哪些静态方法。

MybatisPlus-13.扩展功能-DB静态工具_第1张图片

其中save方法用来新增,update方法用来更新,remove用来删除,list用来查询(批量),count用来计数,get用来查询(ById:根据id查询,One:查一个),page分页查询,lambdaQuery查询,lambdaUpdate更新。

由于这些都是静态方法,这就导致在方法的实现上还是有区别的。Service接口是非静态的,需要自定义接口并实现。继承的过程中要指定泛型。

但是Db由于是静态工具,类上不可能有泛型,静态的方法不可能读取到泛型。因此没办法直到实体类类型,无法直到表信息,无法增删改查。因此这些方法都要传一个class字节码,这样才能通过反射拿到实体类信息,进一步拿到表名和字段名信息。只有两个方法例外:save和update,因为这两个方法要直接传一个对象,因此不用指定。

二.为什么需要静态工具

我们先来看一个案例:

MybatisPlus-13.扩展功能-DB静态工具_第2张图片

我们可以发现先在查user信息的同时还要查address信息,那么查address最便捷的方式就是注入address的service(不是mapper是因为mapper没有service功能强大)。那么我们就要在userService中注入addresService。

再来看需求三,需求三要在根据id查询收货地址功能,但是要验证用户状态,那么就意味着要在address的service中注入userService。这样的话就形成了循环依赖。Spring默认是不开启循环依赖的,因为这样IOC容器会不知道注入的先后顺序。

为了避免出现循环依赖问题,MybatisPlus提供一个静态工具类:Db,其中的一些静态方法与IService中方法签名基本一致,也可以帮助我们实现CRUD功能:

使用Db,我们可以避免依赖注入,从而解决循环依赖问题。

示例:

@Test
void testDbGet() {
    User user = Db.getById(1L, User.class);
    System.out.println(user);
}

@Test
void testDbList() {
    // 利用Db实现复杂条件查询
    List list = Db.lambdaQuery(User.class)
            .like(User::getUsername, "o")
            .ge(User::getBalance, 1000)
            .list();
    list.forEach(System.out::println);
}

@Test
void testDbUpdate() {
    Db.lambdaUpdate(User.class)
            .set(User::getBalance, 2000)
            .eq(User::getUsername, "Rose");
}

需求:改造根据id用户查询的接口,查询用户的同时返回用户收货地址列表

首先,我们要添加一个收货地址的VO对象:

package com.itheima.mp.domain.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel(description = "收货地址VO")
public class AddressVO{

    @ApiModelProperty("id")
    private Long id;

    @ApiModelProperty("用户ID")
    private Long userId;

    @ApiModelProperty("省")
    private String province;

    @ApiModelProperty("市")
    private String city;

    @ApiModelProperty("县/区")
    private String town;

    @ApiModelProperty("手机")
    private String mobile;

    @ApiModelProperty("详细地址")
    private String street;

    @ApiModelProperty("联系人")
    private String contact;

    @ApiModelProperty("是否是默认 1默认 0否")
    private Boolean isDefault;

    @ApiModelProperty("备注")
    private String notes;
}

然后,改造原来的UserVO,添加一个地址属性:

MybatisPlus-13.扩展功能-DB静态工具_第3张图片

接下来,修改UserController中根据id查询用户的业务接口:

@GetMapping("/{id}")
@ApiOperation("根据id查询用户")
public UserVO queryUserById(@PathVariable("id") Long userId){
    // 基于自定义service方法查询
    return userService.queryUserAndAddressById(userId);
}

由于查询业务复杂,所以要在service层来实现。首先在IUserService中定义方法:

package com.itheima.mp.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.vo.UserVO;

public interface IUserService extends IService {
    void deduct(Long id, Integer money);

    UserVO queryUserAndAddressById(Long userId);
}

然后,在UserServiceImpl中实现该方法:

@Override
public UserVO queryUserAndAddressById(Long userId) {
    // 1.查询用户
    User user = getById(userId);
    if (user == null) {
        return null;
    }
    // 2.查询收货地址
    List
addresses = Db.lambdaQuery(Address.class) .eq(Address::getUserId, userId) .list(); // 3.处理vo UserVO userVO = BeanUtil.copyProperties(user, UserVO.class); userVO.setAddresses(BeanUtil.copyToList(addresses, AddressVO.class)); return userVO; }

        

你可能感兴趣的:(微服务,数据库,mybatisplus,微服务,springboot,java)