試想這樣乙個業務需求:有一張合同表,由於合同涉及內容比較多所以此表比較龐大,大概有120多個字段。現在合同每一次變更時都需要對合同原始資訊進行歸檔一次,版本號依次遞增。那麼我們就要新建一張合同歷史表,欄位跟原合同表一模一樣,此外多了乙個 合同版本號 字段。在歸檔時如何把原始合同資訊插入到合同歷史表呢?
很容易就能想到的一種解決方法:
insert into 合同歷史表(欄位1,欄位2,欄位3…………欄位120,版本號) select 欄位1,欄位2,欄位3…………欄位120,0 as 版本號 from 合同表 where 合同id=『******x』
這樣當然是能實現我們的功能的,但是看到了嗎?由於表的字段太多,導致sql看起來很不優雅,而且字段之間的對應很容易出問題。聯想起之前看過的 利用反射給model賦值的例子想出來下面的乙個解決方法:
現在假設兩個實體class1、class2,class2只比class1多乙個欄位newid,其它字段一模一樣。簡單定義如下:
[csharp]view plain
copy
print?
class
class1
set}
private
string
name;
public
string
name
set}
private
intage;
public
intage
set}
private
intnum;
public
intnum
set}
}
[csharp]view plain
copy
print?
class
class2
set}
private
string
id;
public
string
id
set}
private
string
name;
public
string
name
set}
private
intage;
public
intage
set}
private
intnum;
public
intnum
set}
}
下面我們給class1賦值,然後通過反射獲取class2的屬性,迴圈把class1對應的值賦給class2,遇到class2多出的字段我們手功處理後跳過。簡單**如下:
[csharp]view plain
copy
print?
class1 c1 =
newclass1();
c1.id = "001"
; c1.name = "ben.jiang"
; c1.num = 712104195;
c1.age = 24;
class2 c2 = new
class2();
type t2 = typeof
(class2);
propertyinfo propertys2 = t2.getproperties();
type t1 = typeof
(class1);
propertyinfo propertys1 = t1.getproperties();
foreach
(propertyinfo pi
inpropertys2)
object
value=t1.getproperty(name).getvalue(c1,
null
);
t2.getproperty(name).setvalue(c2,value ,null
);
}
這樣**看起來稍微優雅了一些,而且針對不同的字段我們處理起來也方便。
利用反射例項化實體
根據swagger apimodelproperty 註解類的 example 例項化 實體 param clazz 實體類 param 返回例項化的資料 return 返回例項化的資料 public static t mockexamplemodel classclazz return map2b...
利用BeanUtils工具快速給乙個類賦值
1.所需要導的包 2.新建乙個你要賦值的類,alt shift s r快速新增set和get方法 3.在建乙個測試類,建乙個map物件,新增一些資料,key值一定要和student物件裡面的屬性值相對應,這個工具類通過反射,找到student中相應的方法,進行賦值。直接呼叫beanutils.pop...
利用反射自動封裝成實體物件
利用此方法的時候需要傳遞的引數的名稱,必須以行號結尾,去掉行號就是屬性名稱,比如頁面傳遞name rowno,那麼實體物件的屬性名應該為name。如下 獲取頁面資料,自動封裝成bean物件 public list getobjectlist class clazz,string rownos thr...