扩展RuoYi-Vue-Plus的BaseEntity
本文讲的扩展的BaseEntity主要让Entity基类继承的Model抽象类说的其实就是的模式,如果不了解该模式的话,可以参考我之前写的文章,里面讲解了该模式下的各种CRUDMyBatis-Plus入门之ActiveRecord模式简单来说模式是一种数据访问模式,它将数据库表映射为一个类,使得通过这个类可以直接进行数据库的CRUD操作,而无需写SQL语句。
前言
提示:BaseEntity
所在包com.hmkj.common.core.domain.BaseEntity
本文讲的扩展RuoYi-Vue-Plus
的BaseEntity
主要让Entity
基类继承MyBatis Plus
的Model
抽象类
说的其实就是MyBatis Plus
的ActiveRecord
模式,如果不了解该模式的话,可以参考我之前写的文章,里面讲解了该模式下的各种CRUD
与各种查询条件:
简单来说ActiveRecord
模式是一种数据访问模式,它将数据库表映射为一个类,使得通过这个类可以直接进行数据库的CRUD
操作,而无需写SQL
语句。
但是需要特别注意的是:
必须存在对应的原始mapper并继承baseMapper并且可以使用的前提下才能使用此 AR 模式!!!
这是官方的Model
抽象类上的注释,虽然可以直接使用关系映射对象进行CRUD
,不用再像以前一样需要引入再Mapper
层、Service
层来做增删改查,但是对象映射的实体类也必须拥有对应的它的Mapper
类,且Mapper类必须继承MyBatis Plus
的通用Mapper
即 BaseMapper
扩展基类
在com.hmkj.common.core.domain.BaseEntity
基类中继承MybatisPlus
的Model
,而实体类都继承了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;
}
创建对应User
的Mapper
,并继承通用Mapper
,由于RuoYi-Vue-Plus
框架中封装了一个自己的通用Mapper且继承了BaseMapper
,所以此处代码继承的是BaseMapperPlus
,间接继承了BaseMapper
public interface UserMapper extends BaseMapperPlus<UserMapper, User, UserVo> {
}
至此不需要引入Mapper
和Service
,仅凭一个实体类即可完成基本的CRUD
测试AR模式
创建一个SpringBoot
的Test
类
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
对象的操作。
更多推荐
所有评论(0)