一、为什么要使用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不同,他们有不同的权限。