MybatisPlus处理四种表与实体的映射及id自增策略分析
在MybatisPlus中,我们一般有四种表与实体的映射方式,即普通表、自动填充表、防篡改表和树形表。每种表都要根据不同的情况处理其中的id自增策略。本攻略将介绍如何处理这些表与实体的映射关系及id自增策略。
普通表的映射及id自增策略
普通表是最简单的映射关系。对于普通表,我们只需要在实体类上加上@TableName
注解指定表名即可。
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
}
在上面的代码中,@TableName
指定了该实体类对应的表名为"user"。@TableId
指定了id的类型为自增类型(IdType.AUTO)。
自动填充表的映射及id自增策略
自动填充表是在插入或更新数据时自动填充某些字段的表。比如,我们希望在插入数据时自动填充创建时间和创建人,或者在更新数据时自动填充更新时间和更新人。对于自动填充表,我们需要在实体类上加上@TableName
注解指定表名,并在对应的字段上加上@TableField
注解指定该字段需要自动填充,同时在MetaObjectHandler
中实现自动填充的逻辑。
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT)
private Long creatorId;
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
@TableField(fill = FieldFill.UPDATE)
private Long updaterId;
}
在上面的代码中,@TableField
指定了需要自动填充的字段及填充策略。在MetaObjectHandler
中实现自动填充的逻辑。
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
this.strictInsertFill(metaObject, "creatorId", Long.class, getCurrentUserId());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
this.strictUpdateFill(metaObject, "updaterId", Long.class, getCurrentUserId());
}
}
在上面的代码中,insertFill
方法实现了插入数据时的自动填充逻辑,updateFill
方法实现了更新数据时的自动填充逻辑。
防篡改表的映射及id自增策略
防篡改表是在插入或更新数据时自动填充校验字段的表。这个校验字段一般是由数据拼接某些数据再进行加密后生成的一个值,我们将该值称为“校验码”。插入或更新数据时,插入的数据将会自动与该数据的校验码比对,如果校验通过,则可以执行操作,否则将会抛出异常。对于防篡改表,我们需要在实体类上加上@TableName
注解指定表名,并在对应的字段上加上@TableField
注解指定该字段需要自动填充,同时实现校验方法。
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT)
private Long creatorId;
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
@TableField(fill = FieldFill.UPDATE)
private Long updaterId;
private String checkCode;
public void generateCheckCode() {
this.checkCode = DigestUtils.md5Hex(this.id + "-" + this.name + "-" + this.age);
}
public void validateCheckCode() {
String generateCode = DigestUtils.md5Hex(this.id + "-" + this.name + "-" + this.age);
if (!this.checkCode.equals(generateCode)) {
throw new RuntimeException("Invalid check code.");
}
}
}
在上面的代码中,@TableField
指定了需要自动填充的字段及填充策略。generateCheckCode
方法实现了根据id、name和age生成校验码的逻辑,validateCheckCode
方法实现了校验校验码的逻辑。
树形表的映射及id自增策略
树形表是用来存储树形结构的表。树形表有一个特殊的字段parent_id
,用来存储该节点的父节点。对于树形表,我们需要在实体类上加上@TableName
注解指定表名,并在对应的字段上加上@TableField
注解指定该字段需要自动填充。同时,我们需要实现查询子节点的递归方法。
@Data
@TableName("department")
public class Department {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
@TableField("parent_id")
private Long parentId;
@TableField(exist = false)
private List<Department> children;
public void addChild(Department child) {
if (this.children == null) {
this.children = new ArrayList<>();
}
this.children.add(child);
}
public void recursivelyFindChildren(List<Department> departmentList) {
for (Department department : departmentList) {
if (this.id.equals(department.getParentId())) {
this.addChild(department);
department.recursivelyFindChildren(departmentList);
}
}
}
}
在上面的代码中,@TableField
指定了需要自动填充的字段。addChild
方法实现了添加子节点的逻辑,recursivelyFindChildren
方法实现了递归查询子节点的逻辑。
示例说明1:树形表的查询子节点
假设我们有以下的部门树形结构:
1. 公司总部
2. 技术部
3. 研发一组
4. 研发二组
5. 管理部
6. 人力资源部
7. 财务部
我们想要查询编号为2的部门及其所有子部门的信息,我们可以使用以下代码实现:
Department department = departmentService.getById(2L);
List<Department> departmentList = departmentService.list();
department.recursivelyFindChildren(departmentList);
System.out.println(department);
在上面的代码中,我们首先通过getById
方法获取编号为2的部门信息,然后通过list
方法获取所有部门的信息。接着,我们调用recursivelyFindChildren
方法递归查询子节点的信息,最后输出部门信息及其所有子节点的信息。
示例说明2:自动填充表的插入数据
假设我们有以下的用户信息:
User user = new User();
user.setName("test");
user.setAge(18);
我们想要将该用户信息插入到数据库中,并自动填充创建时间和创建人的信息。我们可以使用以下代码实现:
userMapper.insert(user);
在上面的代码中,由于我们已经在实体类上加上了@TableField
注解并在MetaObjectHandler
中实现了自动填充的逻辑,因此插入数据时会自动填充创建时间和创建人的信息,并将数据插入到数据库中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MybatisPlus处理四种表与实体的映射及id自增策略分析 - Python技术站