prefacio
Consejo : BaseEntity
el paquetecom.hmkj.common.core.domain.BaseEntity
RuoYi-Vue-Plus
La extensión en este artículo BaseEntity
se refiere principalmente a la clase abstracta heredada por Entity
la clase base . De hecho, es el patrón. Si no entiende este patrón, puede consultar mi artículo anterior, que explica varias y diversas condiciones de consulta bajo este patrón:MyBatis Plus
Model
MyBatis Plus
ActiveRecord
CRUD
En pocas palabras, ActiveRecord
un modo es un modo de acceso a datos, que asigna una tabla de base de datos a una clase, de modo que la base de datos se puede operar directamente a través de esta clase CRUD
sin escribir SQL
una declaración.
Pero se debe prestar especial atención a:
¡Este modo AR solo se puede usar bajo la premisa de que el mapeador original correspondiente existe y se hereda de baseMapper y se puede usar! ! !
Este es el comentario sobre la Model
clase abstracta oficial. Aunque puede usar el objeto de mapeo relacional directamente , no necesita introducir capas y capas para agregar, eliminar, modificar y verificar CRUD
como antes , pero la clase de entidad del mapeo de objetos debe también tienen su correspondiente clase . , y el propósito general que debe heredar la clase Mapper esMapper
Service
Mapper
MyBatis Plus
Mapper
BaseMapper
Ampliar clase base
Heredado en com.hmkj.common.core.domain.BaseEntity
la clase base , y la clase de entidad hereda , de modo que la clase de entidad es equivalente a la herencia indirecta , y luego se puede realizar directamente , pero no olvide crear la correspondiente .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<>();
}
Dado que la herencia Model
de clases abstractas debe completarse con genéricos, es necesario pasar BaseEntity
los genéricos al pasado, y BaseEntity
es necesario completar los genéricos al heredar
(aquí, tome la clase de entidad de usuario Usuario como ejemplo)
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;
}
Cree el correspondiente User
y Mapper
herede el general Mapper
. Dado que RuoYi-Vue-Plus
el framework encapsula su propio Mapper general y lo hereda BaseMapper
, el código aquí hereda BaseMapperPlus
la herencia indirectaBaseMapper
public interface UserMapper extends BaseMapperPlus<UserMapper, User, UserVo> {
}
Hasta ahora, no hay necesidad de introducir Mapper
y Service
, solo una clase de entidad puede completar el básicoCRUD
Pruebe el modo AR
Crea una clase SpringBoot
deTest
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();
}
}
Resultados de la
por fin
Haga clic para ver que hay muchas clases RuoYi-Vue-Plus
heredadas en el marco BaseEntity
. Después de cambiar BaseEntity para completar genéricos, hay muchas clases en la base de código anterior que no están llenas de genéricos, pero esto no afectará la función original. Por supuesto, hay son lugares problemáticos
., por ejemplo, los objetos generados por el marco Bo
heredarán BaseEntity
, y el objeto Bo es solo un objeto que se usa para recibir parámetros, no una clase de entidad de mapeo relacional. Por ejemplo, SysOssBo
esto causará un montón de CRUD
métodos inutilizables cuando llame al objeto y use este AR
modo Las condiciones también son limitadas. Primero, su clase de entidad debe ser una clase de mapeo relacional de la base de datos. Segundo, debe tener la clase de entidad correspondiente Mapper
y heredarla BaseMapper
. Si puede aceptar este problema, debe puede modificar directamente vm
el código de la plantilla para que el código generado se pueda usar directamente Use, modifique directamente la plantilla domain
de la clase de entidad aquívm
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("${tableName}")
public class ${
ClassName} extends ${
Entity}<${
ClassName}> {
Simplemente agregue genéricos. Si le gustan las llamadas en cadena, puede agregar anotaciones, de modo que las operaciones de objetos @Builder
se puedan omitir al crear objetos .new