若依BaseEntity
一、為什么要使用BaseEntity
我們在看若依的數(shù)據(jù)庫表中,有一些表字段是每個表都有,如createBy、createTime、updateBy、updateTime、remark等等,還有一些公共方法,如搜索值searchValue,前端傳來的請求參數(shù)params?,大部分實體類可能需要,在若依新建POJO對象時 如果你每個對象都定義會造成大量冗余代碼,不利于維護,把它們抽取出來定義一個通用的實體類BaseEntity。讓新建pojo繼承它們。有點類似AOP,子類繼承了父類,也繼承了父類的屬性和方法,這樣可以簡化代碼,靈活多變。
public class BaseEntity implements Serializable { // 反序列化private static final long serialVersionUID = 1L;/** 搜索值 */private String searchValue;/** 創(chuàng)建者 */private String createBy;/** 創(chuàng)建時間 */@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;/** 請求參數(shù) *///當一些沒有這些字段的時候,可以存在mapprivate 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中實現(xiàn)了序列化和反序列化。
什么是序列化和反序列化呢
序列化是將對象的狀態(tài)信息轉換為可以存儲或傳輸?shù)男问降倪^程。在序列化期間,對象將其當前狀態(tài)寫入到臨時或持久性存儲區(qū)。就通過從存儲區(qū)中讀取或反序列化對象的狀態(tài),重新創(chuàng)建該對象。在計算機中文本、圖片、音頻、視頻都是以二進制序列的形式存儲和傳輸,序列化可簡單理解為將對象轉變?yōu)槎M制序列存儲傳輸?shù)囊环N方法。序列化可以說成Java中的對象或者數(shù)據(jù)結構轉換成二進制的過程。而反序列化是與其相反,將二進制恢復到Java中對象或者數(shù)據(jù)結構的過程。
序列化就是對實例對象的狀態(tài)(State 對象屬性而不包括對象方法)進行通用編碼(如格式化的字碼)并保存,以保證對象的完整性和可傳遞性。簡而言之:序列化,就是為了在不同時間或不同平臺的JVM之間共享實例對象
public class BaseEntity implements Serializable而反序列化就是Java的序列化機制是通過在運行時判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的字節(jié)流中的serialVersionUID與本地相應實體(類)的serialVersionUID進行比較,如果相同就認為是一致的,可以進行反序列化,否則就會出現(xiàn)序列化版本不一致的異常。
private static final long serialVersionUID = 1L;搜索值
/** 搜索值 */private String searchValue; searchValue這個字段在數(shù)據(jù)庫中是沒有的,但是在大多數(shù)查詢的情況下,都是要用來搜索值,主要是用來前端搜索出傳來的值,在ry.js可以發(fā)現(xiàn) // 查詢條件queryParams: function(params) {table.set();var curParams = {// 傳遞參數(shù)查詢參數(shù)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的形式返回給前端
/** 創(chuàng)建時間 */@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date createTime;?Map<String, Object> params;接收post請求傳遞過來的條件查詢params參數(shù),而不需要另外創(chuàng)建Vo。
private Map<String, Object> params;如在mapper.xml中進行的切面編程,因為某些場景下需要多表關聯(lián)進行數(shù)據(jù)權限的過濾,此時可以用?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><!-- 數(shù)據(jù)范圍過濾 與注解DataScope相對應-->${params.dataScope}?在DataScopeAspect切面類進行使用,主要是進行權限查詢的拼接。因為不同的用戶對應得dept和role不同,他們有不同的權限。
總結
以上是生活随笔為你收集整理的若依BaseEntity的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我国构建物联网基础安全标准体系的时间表确
- 下一篇: 游戏建模中3DMax的那些神技巧