扩展RuoYi-Vue-Plus的BaseEntity

前言

提示BaseEntity所在包com.hmkj.common.core.domain.BaseEntity

本文讲的扩展RuoYi-Vue-PlusBaseEntity主要让Entity基类继承MyBatis PlusModel抽象类

说的其实就是MyBatis PlusActiveRecord 模式,如果不了解该模式的话,可以参考我之前写的文章,里面讲解了该模式下的各种CRUD与各种查询条件:

简单来说ActiveRecord模式是一种数据访问模式,它将数据库表映射为一个类,使得通过这个类可以直接进行数据库的CRUD操作,而无需写SQL语句。

但是需要特别注意的是:

必须存在对应的原始mapper并继承baseMapper并且可以使用的前提下才能使用此 AR 模式!!!

这是官方的Model抽象类上的注释,虽然可以直接使用关系映射对象进行CRUD,不用再像以前一样需要引入再Mapper层、Service层来做增删改查,但是对象映射的实体类也必须拥有对应的它的Mapper类,且Mapper类必须继承MyBatis Plus的通用MapperBaseMapper


扩展基类

com.hmkj.common.core.domain.BaseEntity基类中继承MybatisPlusModel,而实体类都继承了BaseEntity,这样一来实体类相当于间接继承了Model,之后就直接可以实现CRUD,但不要忘了创建对应的Mapper

/**
 * Entity基类
 *
 * @author Lion Li
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class BaseEntity<T extends Model<?>> extends Model<T> implements Serializable {
    
    

    private static final long serialVersionUID = 1L;

    /**
     * 搜索值
     */
    @JsonIgnore
    @TableField(exist = false)
    private String searchValue;

    /**
     * 创建者
     */
    @TableField(fill = FieldFill.INSERT)
    private String createBy;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 更新者
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /**
     * 请求参数
     */
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    @TableField(exist = false)
    private Map<String, Object> params = new HashMap<>();

}

由于继承Model抽象类需要填充泛型,需要借助BaseEntity将泛型传递过去,在继承BaseEntity的时候需要填充泛型
(这里以User用户实体类为例)

package com.hmkj.orm.domain;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.hmkj.common.core.domain.BaseEntity;
import lombok.*;

import java.util.Date;

/**
 * 用户对象 t_user
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("t_user")
public class User extends BaseEntity<User> {
    
    

    private static final long serialVersionUID = 1L;

    /**
     * ID
     */
    @TableId(value = "id")
    private Long id;
    /**
     * 头像地址
     */
    private String avatar;
    /**
     * 用户昵称
     */
    private String nickName;
    /**
     * 用户账号
     */
    private String userName;
    /**
     * 密码
     */
    private String password;
    /**
     * 手机号
     */
    private String phonenumber;
    /**
     * 最后登录IP
     */
    private String loginIp;
    /**
     * 最后登录时间
     */
    private Date loginDate;
    /**
     * 帐号状态(0正常 1停用)
     */
    private String status;
    /**
     * 备注
     */
    private String remark;

}

创建对应UserMapper,并继承通用Mapper,由于RuoYi-Vue-Plus框架中封装了一个自己的通用Mapper且继承了BaseMapper,所以此处代码继承的是BaseMapperPlus,间接继承了BaseMapper

public interface UserMapper extends BaseMapperPlus<UserMapper, User, UserVo> {
    
    

}

至此不需要引入MapperService,仅凭一个实体类即可完成基本的CRUD

测试AR模式

创建一个SpringBootTest

import com.hmkj.AppletApplication;
import com.hmkj.orm.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest(classes = {
    
    AppletApplication.class})
public class MyTest {
    
    

    @Test
    void testCRUD() {
    
    
        User.builder().id(1L).avatar("www").nickName("lcz").userName("test").password("111").build().insert();
    }

}

执行结果

最后

点击查看在RuoYi-Vue-Plus框架中继承了BaseEntity的类有很多,在更改BaseEntity可以填充泛型后,以前的代码基础上有很多类并没有填充泛型,但这样并不会影响原来的功能使用

当然也有麻烦的地方,例如框架生成出来的Bo对象会继承BaseEntity,而Bo对象至是用来接收参数的对象,并非关系映射实体类,例如SysOssBo

这将会导致你调用对象的时候出现一堆无法使用的CRUD方法,而使用这个AR模式条件也是有限制的,首先你的实体类得是数据库的关系映射类,其次就是拥有对应的实体Mapper类且继承BaseMapper

如果能接受这个麻烦点,可以直接修改vm模版代码,使其生成的代码可以拿来直接使用,这里直接修改domain实体类的vm模板

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("${tableName}")
public class ${
    
    ClassName} extends ${
    
    Entity}<${
    
    ClassName}> {
    
    

加上泛型即可,喜欢链式调用的话可以加上@Builder注解,这样创建对象的时候可以省去new对象的操作。

猜你喜欢

转载自blog.csdn.net/qq_31762741/article/details/131850824