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

yizhihongxing

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日

相关文章

  • C语言入门篇–变量[定义,初始化赋值,外部声明]

    C语言入门篇–变量[定义,初始化赋值,外部声明] 1. 变量定义 变量是C语言中非常重要的概念,变量定义指的是声明一个变量来存储特定类型的数据,并为该变量分配内存空间。 //一般形式为:数据类型 变量名; int num; char ch; float f; double d; C语言中支持多种基本数据类型,包括整型、字符型、浮点型、双精度型等。其中,in…

    other 2023年6月20日
    00
  • mysql大文本类型

    MySQL大文本类型 在MySQL中,有一些数据类型可以用来存储不同大小和类型的数据。其中一个重要的数据类型是大文本类型,可以用来存储长字符串和二进制数据。 在下面的文章中,我们将讨论以下内容: MySQL大文本类型的定义和用途 MySQL大文本类型的种类 如何使用MySQL大文本类型 1. MySQL大文本类型的定义和用途 MySQL中的大文本类型可以存储…

    其他 2023年3月28日
    00
  • 辐射4力量系perk技能点详细介绍

    辐射4力量系Perk技能点详细介绍 引言 在《辐射4》这个 RPG 游戏中,Perk 技能点可以让你的角色变得更加强大。本文将详细介绍力量系Perk技能点,帮助你在游戏中更好地利用这些技能点。 力量系Perk技能点 以下是力量系Perk技能点的列表: 重击 (Big Leagues) 类型:通用 Perk 级别:4 格斗武器伤害增加20%/40%/60%/8…

    other 2023年6月27日
    00
  • PHP常用函数之获取汉字首字母功能示例

    当然!下面是关于\”PHP常用函数之获取汉字首字母功能示例\”的完整攻略: PHP常用函数之获取汉字首字母功能示例 在PHP中,我们可以使用一些常用函数来获取汉字的首字母。下面是一些关于获取汉字首字母的详细步骤和示例说明: 步骤1:使用mb_substr函数获取汉字首字母 PHP提供了mb_substr函数来获取字符串的子串。我们可以使用该函数获取汉字的首字…

    other 2023年8月19日
    00
  • python中的type,元类,类,对象用法

    Python中的type、元类、类、对象用法详解 type 在Python中,type是一个内置函数,用于获取对象的类型。它可以用于判断对象的类型,也可以用于动态创建类。 示例1:判断对象的类型 x = 5 print(type(x)) # 输出:<class ‘int’> y = \"Hello\" print(type(y…

    other 2023年10月15日
    00
  • Vue封装全局过滤器Filters的步骤

    下面是Vue封装全局过滤器Filters的步骤的详细讲解。 步骤一:在Vue中定义全局过滤器 在Vue中定义全局过滤器的操作比较简单,我们只需要在Vue实例的filters属性中定义一个函数,然后在模板中使用{{ 表达式 | 过滤器名 }}的方式进行调用。 示例一 下面是一个将数字金额转换为万元的全局过滤器的例子: Vue.filter(‘toWanYuan…

    other 2023年6月25日
    00
  • PHP使用递归生成文章树

    下面是关于“PHP使用递归生成文章树”的完整攻略。 什么是递归 递归是指一个函数在调用自身的过程中,不断地将问题分解为规模更小的子问题并计算解答的过程。 如何使用递归生成文章树 步骤一:获取数据库中的所有文章列表 首先,我们需要从数据库中获取所有文章的列表。假设我们已经用PHP连接了MySQL数据库,可以使用如下代码获取文章列表: // 连接数据库 $db …

    other 2023年6月27日
    00
  • 一条SQL语句修改多表多字段的信息的具体实现

    要修改多个表中多个字段的信息,需要使用SQL语句连接多个表,并使用UPDATE语句进行修改。 示例1:修改两个表中的信息 我们有一个学生表(students)和一个成绩表(grades),其中学生表中有学号、姓名等信息,成绩表中有学号、科目、成绩等信息。现在需要将学号为1001的学生的数学成绩由80修改为85,并将学生姓名由“张三”修改为“李四”。 UPDA…

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