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

 IService接口里面的方法都是非静态的,而DB是静态工具,所以里面的方法都是静态的。我们的Iservice接口是非静态的,所以我们需要自定义接口并且继承它继承的过程中还要去指定泛型。泛型就是实体类的类型,因为它要通过反射得到实体类字节码,才能知道表信息,才能实现增删改查。而静态工具它由于是静态的,类上是不可能有泛型的,或者说静态的方法是没有办法读取到类上的泛型的。因此DB上面是没有泛型的,这就导致了它没有办法知道实体类的类型,无法知道表信息,不能去做增删改查。所以它的方法都需要传一个额外的参数,比如说removeById方法,除了传一个id以外还需要传一个class字节码文件,这个字节码其实就是实体类的字节码,因为只有传了这个,它才能利用反射拿到这个实体类的相关信息,从而得到注解上面的一些类名、表名等等这些信息才能实现增删改查。

这就意味着在addressService里要注入userService,现在出现了一种情况,我们在实现有些业务的时候,我们需要在userService里实现但是需要去查address表,所以需要注入addressService,而有些业务在addressService里面但是要查user表,所以需要注入userService。于是两个service需要相互注入,就出现了循环依赖的情况,为了解决这个循环依赖的情况,我们就可以用DB静态工具去解决。我们在userService里调addressService的时候,直接调静态工具来查询,可以达到相同效果,而且不需要去注入,这样就避免了循环依赖。

package com.itheima.mp.domain.vo;

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

import java.util.List;

@Data
@ApiModel(description = "用户VO实体")
public class UserVO {

    @ApiModelProperty("用户id")
    private Long id;

    @ApiModelProperty("用户名")
    private String username;

    @ApiModelProperty("详细信息")
    private String info;

    @ApiModelProperty("使用状态(1正常 2冻结)")
    private Integer status;

    @ApiModelProperty("账户余额")
    private Integer balance;

    @ApiModelProperty("用户的收货地址")
    private List<AddressVO> address;
}
package com.itheima.mp.domain.vo;

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

/**
 * <p>
 * 
 * </p>
 *
 * @author 虎哥
 * @since 2023-07-01
 */
@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;
}

·测试

总结

我们在开发业务的时候,有的时候会出现一种场景就是多个service之间会相互调用,如果我们采用传统的方式也就是@Autowired去注入的方式,那service之间相互注入就会出现循环依赖,这就给我们开发带来很大的麻烦,因此我们的建议是一旦出现service相互调用,可以使用DB静态工具去调用。DB静态工具里的方法跟IService的方法几乎一样,调的时候需要指定字节码,这样既方便又可以避免循环依赖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值