MybatisPlus如何实现公共字段自动赋值

发布时间:2022-07-05 10:05:35 作者:iii
来源:亿速云 阅读:457

MybatisPlus如何实现公共字段自动赋值

1. 引言

在现代企业级应用开发中,数据库操作是不可或缺的一部分。Mybatis作为一款优秀的持久层框架,极大地简化了数据库操作。然而,随着业务复杂度的增加,手动编写SQL语句和维护数据库字段变得繁琐且容易出错。MybatisPlus作为Mybatis的增强工具,提供了许多便捷的功能,其中公共字段自动赋值功能尤为实用。

公共字段自动赋值是指在插入或更新数据时,自动为某些字段赋值,如创建时间、更新时间、创建人、更新人等。这些字段通常在每个表中都存在,手动赋值不仅增加了开发工作量,还容易遗漏或出错。MybatisPlus通过注解和配置,可以轻松实现这些字段的自动赋值,从而提高开发效率和代码质量。

本文将详细介绍MybatisPlus如何实现公共字段自动赋值,包括基本概念、实现步骤、高级用法以及实际应用案例。通过阅读本文,您将掌握如何利用MybatisPlus简化数据库操作,提升开发效率。

2. MybatisPlus简介

2.1 MybatisPlus概述

MybatisPlus(简称MP)是一款基于Mybatis的增强工具,旨在简化开发、提高效率。它提供了丰富的功能,如通用Mapper、分页插件、性能分析插件等,极大地减少了开发者的工作量。MybatisPlus的核心思想是通过注解和配置,自动生成SQL语句,减少手动编写SQL的繁琐。

2.2 MybatisPlus的核心功能

  1. 通用Mapper:通过继承BaseMapper,无需编写Mapper接口,即可实现基本的CRUD操作。
  2. 分页插件:支持多种数据库的分页查询,简化分页操作。
  3. 性能分析插件:监控SQL执行性能,帮助优化数据库操作。
  4. 自动填充功能:自动为公共字段赋值,如创建时间、更新时间等。
  5. 逻辑删除:通过配置实现逻辑删除,避免物理删除带来的数据丢失风险。

2.3 MybatisPlus的优势

  1. 简化开发:通过注解和配置,减少手动编写SQL的工作量。
  2. 提高效率:自动生成SQL语句,减少出错概率,提高开发效率。
  3. 易于扩展:支持自定义SQL和插件,满足复杂业务需求。
  4. 社区活跃:MybatisPlus拥有活跃的社区和丰富的文档,便于学习和解决问题。

3. 公共字段自动赋值的需求分析

3.1 公共字段的定义

在数据库设计中,通常会有一些公共字段,如创建时间(create_time)、更新时间(update_time)、创建人(create_by)、更新人(update_by)等。这些字段在每个表中都存在,用于记录数据的创建和更新信息。

3.2 手动赋值的弊端

  1. 重复劳动:每次插入或更新数据时,都需要手动为这些字段赋值,增加了开发工作量。
  2. 容易遗漏:在复杂的业务逻辑中,容易遗漏为某些字段赋值,导致数据不一致。
  3. 代码冗余:手动赋值的代码分散在各个业务逻辑中,增加了代码的冗余和维护难度。

3.3 自动赋值的优势

  1. 减少工作量:通过配置和注解,自动为公共字段赋值,减少手动操作。
  2. 提高一致性:确保每个表中的公共字段都能正确赋值,避免遗漏。
  3. 简化代码:将公共字段的赋值逻辑集中管理,减少代码冗余,提高可维护性。

4. MybatisPlus实现公共字段自动赋值的原理

4.1 注解的使用

MybatisPlus通过注解来实现公共字段的自动赋值。常用的注解包括:

4.2 自动填充处理器

MybatisPlus提供了MetaObjectHandler接口,用于实现自动填充逻辑。开发者可以通过实现该接口,自定义字段的填充行为。

4.3 配置文件的设置

在MybatisPlus的配置文件中,可以通过globalConfig配置自动填充处理器,从而实现公共字段的自动赋值。

5. 实现公共字段自动赋值的步骤

5.1 创建实体类

首先,需要在实体类中定义公共字段,并使用@TableField注解指定填充策略。

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.util.Date;

@Data
@TableName("user")
public class User {

    @TableId
    private Long id;

    private String name;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    @TableField(fill = FieldFill.INSERT)
    private String createBy;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;
}

5.2 实现MetaObjectHandler接口

接下来,实现MetaObjectHandler接口,定义字段的填充逻辑。

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "createBy", String.class, "admin");
        this.strictInsertFill(metaObject, "updateBy", String.class, "admin");
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
        this.strictUpdateFill(metaObject, "updateBy", String.class, "admin");
    }
}

5.3 配置自动填充处理器

在MybatisPlus的配置文件中,配置自动填充处理器。

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
    meta-object-handler: com.example.MyMetaObjectHandler

5.4 测试自动赋值功能

最后,编写测试代码,验证自动赋值功能是否生效。

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testInsert() {
        User user = new User();
        user.setName("test");
        userMapper.insert(user);

        List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery().eq(User::getName, "test"));
        users.forEach(System.out::println);
    }

    @Test
    public void testUpdate() {
        User user = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getName, "test"));
        user.setName("test2");
        userMapper.updateById(user);

        List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery().eq(User::getName, "test2"));
        users.forEach(System.out::println);
    }
}

6. 高级用法

6.1 自定义填充策略

在某些场景下,可能需要根据业务逻辑自定义字段的填充策略。可以通过实现MetaObjectHandler接口,自定义填充逻辑。

@Override
public void insertFill(MetaObject metaObject) {
    Object createBy = getFieldValByName("createBy", metaObject);
    if (createBy == null) {
        this.strictInsertFill(metaObject, "createBy", String.class, "customAdmin");
    }
}

6.2 多数据源下的自动填充

在多数据源环境下,可能需要为不同的数据源配置不同的自动填充处理器。可以通过在@Configuration类中配置多个MetaObjectHandler Bean,并在@MapperScan注解中指定对应的处理器。

@Configuration
public class DataSourceConfig {

    @Bean
    public MetaObjectHandler metaObjectHandler1() {
        return new MyMetaObjectHandler1();
    }

    @Bean
    public MetaObjectHandler metaObjectHandler2() {
        return new MyMetaObjectHandler2();
    }
}

@MapperScan(basePackages = "com.example.mapper1", sqlSessionFactoryRef = "sqlSessionFactory1")
public class DataSource1Config {
    // 配置数据源1
}

@MapperScan(basePackages = "com.example.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2")
public class DataSource2Config {
    // 配置数据源2
}

6.3 动态字段填充

在某些场景下,可能需要根据运行时条件动态填充字段。可以通过在MetaObjectHandler中获取当前上下文信息,动态设置字段值。

@Override
public void insertFill(MetaObject metaObject) {
    User currentUser = getCurrentUser();
    if (currentUser != null) {
        this.strictInsertFill(metaObject, "createBy", String.class, currentUser.getUsername());
    }
}

7. 实际应用案例

7.1 电商系统中的订单表

在电商系统中,订单表通常包含创建时间、更新时间、创建人、更新人等字段。通过MybatisPlus的自动填充功能,可以确保这些字段在每次插入或更新订单时自动赋值,减少手动操作。

@Data
@TableName("order")
public class Order {

    @TableId
    private Long id;

    private String orderNo;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    @TableField(fill = FieldFill.INSERT)
    private String createBy;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;
}

7.2 博客系统中的文章表

在博客系统中,文章表通常包含创建时间、更新时间、创建人、更新人等字段。通过MybatisPlus的自动填充功能,可以确保这些字段在每次插入或更新文章时自动赋值,减少手动操作。

@Data
@TableName("article")
public class Article {

    @TableId
    private Long id;

    private String title;

    private String content;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    @TableField(fill = FieldFill.INSERT)
    private String createBy;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;
}

7.3 用户管理系统中的用户表

在用户管理系统中,用户表通常包含创建时间、更新时间、创建人、更新人等字段。通过MybatisPlus的自动填充功能,可以确保这些字段在每次插入或更新用户时自动赋值,减少手动操作。

@Data
@TableName("user")
public class User {

    @TableId
    private Long id;

    private String username;

    private String password;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    @TableField(fill = FieldFill.INSERT)
    private String createBy;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;
}

8. 常见问题与解决方案

8.1 自动填充不生效

问题描述:配置了自动填充处理器,但字段未自动填充。

解决方案: 1. 检查实体类中的字段是否使用了@TableField注解,并指定了正确的填充策略。 2. 检查MetaObjectHandler实现类是否正确实现了insertFillupdateFill方法。 3. 检查配置文件是否正确配置了meta-object-handler

8.2 多数据源下的配置冲突

问题描述:在多数据源环境下,自动填充处理器未生效或配置冲突。

解决方案: 1. 确保每个数据源配置了独立的MetaObjectHandler Bean。 2. 在@MapperScan注解中指定对应的sqlSessionFactoryRefmetaObjectHandler

8.3 动态字段填充的实现

问题描述:需要根据运行时条件动态填充字段,但无法获取上下文信息。

解决方案: 1. 在MetaObjectHandler中通过SecurityContextHolder或其他方式获取当前用户信息。 2. 在填充逻辑中根据获取的信息动态设置字段值。

9. 总结

MybatisPlus的公共字段自动赋值功能极大地简化了数据库操作,减少了开发工作量,提高了代码的一致性和可维护性。通过本文的介绍,您已经掌握了如何利用MybatisPlus实现公共字段的自动赋值,包括基本概念、实现步骤、高级用法以及实际应用案例。希望本文能帮助您在实际开发中更好地应用MybatisPlus,提升开发效率和代码质量。

10. 参考文献

  1. MybatisPlus官方文档:https://baomidou.com/
  2. Mybatis官方文档:https://mybatis.org/mybatis-3/zh/index.html
  3. Spring官方文档:https://spring.io/projects/spring-framework
  4. Java Persistence API (JPA) 官方文档:https://jakarta.ee/specifications/persistence/3.0/
推荐阅读:
  1. 使用MybatisPlus 如何实现自动填充功能
  2. SQL语句中公共字段的自动填充方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mybatisplus

上一篇:基于Python如何制作AI聊天软件

下一篇:LocalStorage如何封装一次

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》