首页 > 其他分享 >MyBatis-利用切面实现公有字段自动填充(非MyBatisPlus方式)

MyBatis-利用切面实现公有字段自动填充(非MyBatisPlus方式)

时间:2024-07-01 23:56:51浏览次数:19  
标签:MyBatisPlus String example field 切面 MyBatis import com public

需求:

在MyBatis框架中,如何对createBy,createTime,updateBy等这些公有字段实现自动填充呢?

网上搜了很多,实现的方案全是采用集成MyBatisPlus,利用其封装好的方法来实现的。。。。。

数据准备:

1、准备一张数据库表

CREATE TABLE `user` (
  `id` varchar(36) NOT NULL,
  `username` varchar(64) NOT NULL,
  `password` varchar(64) NOT NULL,
  `create_by` varchar(32) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `update_by` varchar(32) DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

2、新建一个SpringBoot工程

3、引入依赖:

        <dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.5.2</version>
		</dependency>

		<dependency>
			<groupId>com.mysql</groupId>
			<artifactId>mysql-connector-j</artifactId>
			<version>8.0.33</version>
		</dependency>

		<!--切面-->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.9.7</version>
		</dependency>

4、公有字段实体类准备:

自定义注解

package com.example.domain;

import com.example.annoation.createAt;
import com.example.annoation.createDate;
import com.example.annoation.updateAt;
import com.example.annoation.updateDate;

import java.util.Date;

public class BaseEntity {

    @createAt
    private String createBy;

    @createDate
    private Date createTime;

    @updateAt
    private String updateBy;

    @updateDate
    private Date updateTime;


    public String getCreateBy() {
        return createBy;
    }

    public void setCreateBy(String createBy) {
        this.createBy = createBy;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public String getUpdateBy() {
        return updateBy;
    }

    public void setUpdateBy(String updateBy) {
        this.updateBy = updateBy;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }


}
package com.example.domain;

public class User extends BaseEntity{
    private String id;

    private String username;

    private String password;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

切面实现:

1、自定义注解

/**
 * 创建人
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface createAt {
}

/**
 * 创建时间
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface createDate {
}
/**
 * 更新人
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface updateAt {
}
/**
 * 更新时间
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface updateDate {
}

2、利用反射以及切面编程来实现

package com.example.aspect;

import com.example.annoation.createAt;
import com.example.annoation.createDate;
import com.example.annoation.updateAt;
import com.example.annoation.updateDate;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.Date;

@Aspect
@Component
public class SqlAspect {

    @Before("execution(* com.example..*(..)) && args(entity,..)")
    public void beforeSaveOrUpdate(Object entity) throws IllegalAccessException {
        if (entity != null) {
            // 获取所有字段,包括继承的字段
            Class<?> clazz = entity.getClass();
            while (clazz != null) {
                Field[] fields = clazz.getDeclaredFields();
                for (Field field : fields) {
                    field.setAccessible(true); // 设置可访问私有字段
                    if (field.isAnnotationPresent(createAt.class)) {
                        // 当前登录用户ID
                        field.set(entity, "login_user_id");
                    } else if (field.isAnnotationPresent(createDate.class)) {
                        // 当前时间
                        field.set(entity, new Date());
                    } else if (field.isAnnotationPresent(updateAt.class)) {
                        // 当前登录用户ID
                        field.set(entity, "login_user_id");
                    } else if (field.isAnnotationPresent(updateDate.class)) {
                        // 当前时间
                        field.set(entity, new Date());
                    }
                }
                clazz = clazz.getSuperclass();
            }
        }
    }

}

最终效果:

标签:MyBatisPlus,String,example,field,切面,MyBatis,import,com,public
From: https://blog.csdn.net/QQBongBong/article/details/140110331

相关文章

  • MyBatis-Plus 概括
    1.MyBatis-Plus入门    1.1数据库准备DROPTABLEIFEXISTSuser;CREATETABLEuser(  idBIGINT(20)NOTNULLCOMMENT'主键ID',  nameVARCHAR(30)NULLDEFAULTNULLCOMMENT'姓名',  ageINT(11)NULLDEFAULTNULLCOMMENT'年龄'......
  • MyBatis中Where标签:揭秘高效SQL构建的秘密
    哈喽,大家好,我是木头左!理解Where标签的基础概念在MyBatis中,<where>标签是用于构建SQL查询语句中的一个非常重要的元素。它允许你在一个动态的SQL语句中添加WHERE子句,而不需要担心SQL语法错误或额外的逗号和AND/OR关键字。使用<where>标签可以让的SQL语句更加简洁、易读,并且能够......
  • MybatisPlus学习-2
    增删改id生成策略@TableId(Type=IdType.)auto自增noneinput数据库不要自增,代码中需要指定idassign_ID雪花数据库bigint占位1时间戳41机器码(5+5)序列号12assign_UUID全局配置:配置idtypetable-prefix:tb1_save:dao.save(domain)多条删除deletebatchids......
  • MybatisPlus学习-1
    MP入门程序创建配置有MySQL的的springboot项目(不要导入mybatis)添加MPbootstarter依赖3.4.1datasourcedao继承BaseMapperend@testinsert,deletebyid(...L),updata(null不修改),selectbyid,添加lombok依赖@data(包括tostring和hashequal)@Allarg...分页查询配置分页拦......
  • mybatis 查询原理
    mybatis所有操作都会通过sqlSession来完成publicinterfaceSqlSessionextendsCloseable{<T>TselectOne(Stringvar1);<T>TselectOne(Stringvar1,Objectvar2);<E>List<E>selectList(Stringvar1);<E>List<E>......
  • springboot+vue+mybatis农业信息管理_种植员+PPT+论文+讲解+售后
    网络的广泛应用给生活带来了十分的便利。所以把农业信息管理与现在网络相结合,利用java技术建设农业信息管理系统,实现农业信息管理的信息化。则对于进一步提高农业信息管理发展,丰富农业信息管理经验能起到不少的促进作用。农业信息管理系统能够通过互联网得到广泛的、全面的宣......
  • springboot+vue+mybatis奶茶管理系统+PPT+论文+讲解+售后
    由于科学技术的快速发展,人们的生活也与信息时代的发展相关。同时,随着市场化和经济化的发展,国内很多行业已经意识到了这一点,为了提升行业的竞争力,就应当率先把握机会。于是在互联网的默化潜移影响下,餐饮业相关网站就是在这种情况下产生和发展起来的。奶茶在线订购系统是一个面......
  • SSM中Mybatis的配置
    注:数据库连接(此过程不当做本次笔记重点,只做简单概述)1、创建并配置jdbc.properties文件2、通过Druid连接池配置连接数据库3、将数据源(dataSource)注入IOC详细配置一、xml文件与配置类混合配置1、配置logback.xml文件<?xmlversion="1.0"encoding="UTF-8"?><configuration......
  • MyBatisPlus全攻略:轻松掌握高级数据库操作
    文章目录基础操作1.基础操作概念2.基础操作示例分页查询1.分页查询概念2.分页查询示例3.分页查询SQL代码条件构造器1.条件构造器概念2.条件构造器示例3.条件构造器SQL代码自动填充1.自动填充概念2.自动填充示例3.自动填充SQL代码代码生成器1.代码生成器......
  • mybatis #{} 和 ${} 的区别
    在MyBatis中,#{}和${}是两种不同的参数处理方式,它们在SQL语句的动态生成和预编译语句的参数绑定中扮演着不同角色。#{}#{}主要用于预编译语句(PreparedStatement)的参数绑定,它具有以下几个特点:防止SQL注入:#{}能够自动进行字符串的转义,将特殊字符转为SQL字符串,从而......