序文
ヒント:BaseEntity
パッケージcom.hmkj.common.core.domain.BaseEntity
この記事でのRuoYi-Vue-Plus
拡張とは、主に基底クラスから継承された抽象クラスのBaseEntity
ことを指しますが、実際にはパターンです。このパターンがわからない場合は、以前の記事でさまざまなクエリ条件を説明しています。このパターン:Entity
MyBatis Plus
Model
MyBatis Plus
ActiveRecord
CRUD
簡単に言うと、モードはデータ アクセス モードであり、データベース テーブルをクラスにマップするため、ステートメントを記述せずにActiveRecord
このクラスを通じてデータベースを直接操作できます。CRUD
SQL
ただし、次の点には特別な注意を払う必要があります。
このARモードは、対応する独自マッパーが存在し、baseMapperを継承して利用できることを前提としてのみ利用可能です!!!
これは公式の抽象クラスについてのコメントですModel
。リレーショナル マッピング オブジェクトを直接使用できますが、CRUD
以前のように追加、削除、変更、確認するためのレイヤーMapper
を導入する必要はありませんが、オブジェクト マッピングのエンティティ クラスは対応するクラスもあり、 Mapper クラスが継承する必要がある一般的な目的は次のとおりです。Service
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
必要があり、継承時にジェネリックスを埋める必要があります(ここではUserユーザーエンティティクラスを例にします)BaseEntity
BaseEntity
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 をカプセル化して継承するMapper
ため、ここでのコードは間接的な継承を継承します。RuoYi-Vue-Plus
BaseMapper
BaseMapperPlus
BaseMapper
public interface UserMapper extends BaseMapperPlus<UserMapper, User, UserVo> {
}
Mapper
これまでのところ、とを導入する必要はなくService
、1 つのエンティティ クラスだけで基本的な処理を完了できます。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