若依BaseEntity

本文介绍了在Java开发中如何使用BaseEntity来避免代码冗余,提高可维护性。BaseEntity包含了常见的数据库字段如创建者、创建时间等,并实现了序列化接口。此外,还详细说明了searchValue字段在前端查询中的作用,以及Map类型的params参数在接收和处理请求参数时的灵活性。同时,提到了@JsonFormat注解在日期格式化中的应用以及序列化与反序列化的重要性。
摘要由CSDN通过智能技术生成

一、为什么要使用BaseEntity

我们在看若依的数据库表中,有一些表字段是每个表都有,如createBy、createTime、updateBy、updateTime、remark等等,还有一些公共方法,如搜索值searchValue,前端传来的请求参数params ,大部分实体类可能需要,在若依新建POJO对象时 如果你每个对象都定义会造成大量冗余代码,不利于维护,把它们抽取出来定义一个通用的实体类BaseEntity。让新建pojo继承它们。有点类似AOP,子类继承了父类,也继承了父类的属性和方法,这样可以简化代码,灵活多变。

public class BaseEntity implements Serializable
{
//    反序列化
    private static final long serialVersionUID = 1L;

    /** 搜索值 */
    private String searchValue;

    /** 创建者 */
    private String createBy;

    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /** 更新者 */
    private String updateBy;

    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    /** 备注 */
    private String remark;

    /** 请求参数 */
    //当一些没有这些字段的时候,可以存在map
    private Map<String, Object> params;

    public String getSearchValue()
    {
        return searchValue;
    }

    public void setSearchValue(String searchValue)
    {
        this.searchValue = searchValue;
    }

    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;
    }

    public String getRemark()
    {
        return remark;
    }

    public void setRemark(String remark)
    {
        this.remark = remark;
    }

    public Map<String, Object> getParams()
    {
        if (params == null)
        {
            params = new HashMap<>();
        }
        return params;
    }

    public void setParams(Map<String, Object> params)
    {
        this.params = params;
    }
}

2、序列化和反序列化

在BaseEntity中实现了序列化和反序列化。

什么是序列化和反序列化呢

序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。就通过从存储区中读取或反序列化对象的状态,重新创建该对象。在计算机中文本、图片、音频、视频都是以二进制序列的形式存储和传输,序列化可简单理解为将对象转变为二进制序列存储传输的一种方法。序列化可以说成Java中的对象或者数据结构转换成二进制的过程。而反序列化是与其相反,将二进制恢复到Java中对象或者数据结构的过程。

序列化就是对实例对象的状态(State 对象属性而不包括对象方法)进行通用编码(如格式化的字码)并保存,以保证对象的完整性和可传递性。简而言之:序列化,就是为了在不同时间或不同平台的JVM之间共享实例对象

public class BaseEntity implements Serializable

而反序列化就是Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

    private static final long serialVersionUID = 1L;

搜索值

   /** 搜索值 */
    private String searchValue;
searchValue这个字段在数据库中是没有的,但是在大多数查询的情况下,都是要用来搜索值,主要是用来前端搜索出传来的值,在ry.js可以发现
     // 查询条件
            queryParams: function(params) {
                table.set();
                var curParams = {
                    // 传递参数查询参数
                    pageSize:       params.limit,
                    pageNum:        params.offset / params.limit + 1,
                    searchValue:    params.search,
                    orderByColumn:  params.sort,
                    isAsc:          params.order
                };
                var currentId = $.common.isEmpty(table.options.formId) ? $('form').attr('id') : table.options.formId;
                return $.extend(curParams, $.common.formToJSON(currentId)); 
            },

@JsonFormat 在加了该注解就会在以yyyy-MM-dd HH:mm:ss的形式返回给前端

    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

 Map<String, Object> params;接收post请求传递过来的条件查询params参数,而不需要另外创建Vo。

    private Map<String, Object> params;

如在mapper.xml中进行的切面编程,因为某些场景下需要多表关联进行数据权限的过滤,此时可以用 Map<String, Object> params进行拼接

<if test="deptId != null and deptId != 0">
			AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE FIND_IN_SET (#{deptId},ancestors) ))
		</if>
		<!-- 数据范围过滤  与注解DataScope相对应-->
		${params.dataScope}

 在DataScopeAspect切面类进行使用,主要是进行权限查询的拼接。因为不同的用户对应得dept和role不同,他们有不同的权限。

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Ruoyi工程中添加RabbitMQ,可以按照以下步骤进行操作: 1. 首先,确保你的Ruoyi工程已经配置好了Maven依赖。在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 在Ruoyi工程的配置文件(application.yml或application.properties)中添加RabbitMQ的相关配置信息,包括主机名、端口号、用户名、密码等。例如: ```yaml spring: rabbitmq: host: localhost port: 5672 username: guest password: guest ``` 3. 在Ruoyi工程中创建一个消息发送者(Producer)和一个消息接收者(Consumer)。 - 创建消息发送者: ```java import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class RabbitMQSender { @Autowired private AmqpTemplate rabbitTemplate; public void send(String message) { rabbitTemplate.convertAndSend("exchangeName", "routingKey", message); } } ``` - 创建消息接收者: ```java import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class RabbitMQReceiver { @RabbitListener(queues = "queueName") public void receive(String message) { System.out.println("Received message: " + message); } } ``` 4. 在Ruoyi工程中使用消息发送者发送消息,以及使用消息接收者接收消息。 - 在需要发送消息的地方调用消息发送者的send方法: ```java @Autowired private RabbitMQSender rabbitMQSender; public void sendMessage() { rabbitMQSender.send("Hello RabbitMQ!"); } ``` - 在消息接收者中处理接收到的消息: ```java @Autowired private RabbitMQReceiver rabbitMQReceiver; @PostConstruct public void init() { rabbitMQReceiver.receive(); } ``` 这样,你就成功地在Ruoyi工程中添加了RabbitMQ。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值