MybatisPlus处理四种表与实体的映射及id自增策略分析

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技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • ntrun怎么使用?nTrun快速启动工具使用技巧分享

    ntrun怎么使用? 1. ntrun是什么? ntrun是一款快速启动工具,可以帮助用户快速启动Windows系统中的各种程序和命令。使用ntrun可以提高用户的工作效率,特别是经常需要使用命令行工具的用户。 2. 如何使用ntrun? 2.1 下载并安装ntrun ntrun可以在官方网站上下载。下载完成后,按照提示进行安装即可。 2.2 启动ntrun…

    other 2023年6月27日
    00
  • MySql索引和事务定义到使用全面涵盖

    下面就讲解一下“MySql索引和事务”的完整攻略。 一、MySql索引 1. 索引的概念 索引是一种数据结构,用于提高数据库的查询效率,它通过将某个列或多个列的值进行排列组合,生成一个与之对应的数据结构,使得查询时可以快速定位数据行,提高检索的效率和准确性。 2. 索引类型 MySql支持多种索引类型,常见的有BTree索引、Hash索引、Full-text…

    other 2023年6月27日
    00
  • 安装vmtools失败的三类解决方法(windows、linux、macos

    当然,我很乐意为您提供有关“安装vmtools失败的三类解决方法(windows、linux、macos)”的完整攻略。以下是详细的步骤和两个示例: 1 安装vmtools失败的三类解决方法 在使用VMware虚机时,有时会遇到安装vmtools失败的情况。以下是三种解决方法: 1.1 Windows 1.1.1 禁用防病毒软件 有时,防病毒软件可能会阻止v…

    other 2023年5月6日
    00
  • Java8中Optional类的使用说明

    下面就是Java 8中Optional类的使用说明的详细攻略。 什么是Java 8中的Optional类 Java 8中的Optional类是一个容器类,它可以保存一个值不为null的对象,也可以为空。Optional类被设计用来解决空指针异常问题,它可以帮助我们有效地处理null值问题,同时也可以使代码更加清晰易懂。 Optional类的常见用法 创建Op…

    other 2023年6月26日
    00
  • 浅谈vue的几种绑定变量的值 防止其改变的方法

    浅谈Vue的几种绑定变量的值 防止其改变的方法 在Vue中,我们可以使用不同的方式来绑定变量的值,并且有时候我们希望防止这些绑定的值被改变。下面是几种常见的方法: 1. 使用v-once指令 v-once指令可以将绑定的值设置为只读,这意味着一旦值被渲染到视图中,它将不会再被更新。这对于一些静态的数据非常有用。 示例: <template> &l…

    other 2023年7月29日
    00
  • iPhone7如何删除软件 苹果iPhone7手机删除软件图文教程

    iPhone7如何删除软件 – 苹果iPhone7手机删除软件图文教程 1. 通过主屏幕删除应用 在主屏幕上找到您想要删除的应用程序图标,轻轻按住它(不要松开手),直到图标开始摇晃或震动 点击应用程序图标上出现的”X”符号,确认是否要删除该应用程序 点击“删除”以删除应用,或者点击“取消”放弃删除 示例说明: 假设你要删除手机上的“Instagram”,首先…

    other 2023年6月25日
    00
  • Java进阶教程之String类

    Java进阶教程之String类完整攻略 1. String类简介 String类是Java中的一个常用类,用于处理字符串操作。它的实现方式采用了不可变的字符序列,即一旦String对象被创建后,它的值就不能被修改。由于字符串类型的变量在Java中非常常见,因此学习String类的使用具有重要意义。 2. String类的常用方法 length()方法 该方…

    other 2023年6月20日
    00
  • C语言数据结构系列篇二叉树的概念及满二叉树与完全二叉树

    C语言数据结构系列篇:二叉树的概念及满二叉树与完全二叉树 一、二叉树的概念 二叉树是一种特殊的树型结构,它的每个节点最多有两个子节点,称为左子节点和右子节点。二叉树可以为空树,也可以是非空树。二叉树的每个节点保存着某种数据,可以是整数、浮点数、字符串等。 下图是一个简单的二叉树示例: 1 / \ 2 3 / \ 4 5 其中,数字表示节点保存的数据。根节点是…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部