[英]Set value in Setter according to number of column in ResultSetMetaData
我正在尋找動態方法以便在setter方法中設置值,在該方法中,我從ResultSetMetaData
列的總數,基於這些結果,我想在相應的setter方法中設置值。 我已經在實用程序類中准備了該代碼段。
public Integer extractData(ResultSet rs) throws SQLException, DataAccessException {
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
for(int i = 1 ; i <= columnCount ; i++){
SQLColumn column = new SQLColumn();
String columnName = rsmd.getColumnName(i);
}
return columnCount;
}
現在的場景是我要設置“ Pay_codes
Of Employees”,現在總共有95個支付碼,但是對於雇員來說則有所不同。
例如,正式員工有13個支付代碼,而聯絡員工有6個支付代碼,同樣社會員工有8個支付代碼。
現在,我需要代表員工顯示付款代碼列表。 我通過了EmployeeCode
並得到了結果。
現在的問題
是否在我的RowMapper中設置所有列,如下所示
Paycode pc=new PayCode();
if(rs.getString("ESIC") != null){
pc.setESICCode(rs.getString("ESIC"));
}
if(rs.getString("EPF") != null){
pc.setEPFCode(rs.getString("EPF"));
}
if(rs.getString("Allowance") != null){
pc.setAllowance(rs.getString("Allowance"));
}
and many more columns........till 300+ lines
這似乎是非常糟糕的方法,因為可以根據客戶請求增加或減少Paycode。
因此,我正在尋找2-3行動態代碼,這些代碼將根據“ ResultSetMetaData”中的列名在setter中設置值。因此,請向我提出最佳方法,並幫助我實現最佳方法。
但是我在考慮泛型實現,泛型做了一些魔術,如果是>那怎么做? 請建議我。
使用此代碼:
private void mapFields(PayCode p, String setterName, Object value) {
Method[] methods = PayCode.class.getDeclaredMethods();
for(Method method: methods){
if(method.getName().contains(setterName)){
try {
method.invoke(p, value);
break;
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
因此,您可以將Java反射API與PayCode.class.getDeclaredMethods
一起使用以獲取類方法,然后遍歷方法名稱以搜索包含屬性名稱的方法。 一旦找到它,就可以使用method.invoke(p, value)
將值設置為對象,然后退出循環。
如果存儲PayCode.class.getDeclaredMethods()
,然后使用方法名稱作為鍵,並將方法作為值Map<String, Method>
創建一個哈希集,則可以使事情變得更快:
static Map<String, Method> mapFields(Class clazz) {
Method[] methods = clazz.getDeclaredMethods();
Map<String, Method> result = new HashMap<>();
for(Method method: methods){
String methodName = method.getName();
if(methodName.indexOf("set") == 0){
result.put(methodName.substring(3), method);
}
}
return result;
}
然后使用它:
Map<String, Method> fields = mapFields(PayCode.class);
if(fields.containsKey(name)){
try {
fields.get(name).invoke(p, value);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
您可以使用反射
package com.test; import java.lang.reflect.Method; class PayCode { private String esic; private String epf; public String getEsic() { return esic; } public void setEsic(String esic) { this.esic = esic; } public String getEpf() { return epf; } public void setEpf(String epf) { this.epf = epf; } @Override public String toString() { return "PayCode [esic=" + esic + ", epf=" + epf + "]"; } } public class DynamicSetter { public static void main(String[] args) { PayCode payCode = new PayCode(); try { /** * Here you can take "set" hardcoded and generate suffix "Esic" * dynamically, may be using apache StringUtils or implement using * Substring, based on your class setter methods. */ Method esicMethod = PayCode.class.getMethod("set" + "Esic", String.class); esicMethod.invoke(payCode, "Test Paycode"); System.out.println("Check paycode in object : " + payCode); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
您可以使用HashMap <>在其中添加所有支付代碼。 您還可以為要從HashMap讀取的每個支付代碼實現gtter。
package com.test; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; class Employee { private Map<String, String> payCodes = new HashMap<>(); private String epf; public String getEsic() { return payCodes.get("ESIC"); } public String getEpf() { return payCodes.get("EPF"); } public Map<String, String> getPayCodes() { return payCodes; } } public class DynamicSetter { public static void main(String[] args) { } public static Integer extractData(ResultSet rs) throws SQLException, DataAccessException { while(rs.next()) { Employee e = new Employee(); Map<String, String> payCodes = e.getPayCodes(); //set app paycode in payCodes, you can use column name as key and fetch value from result set. } } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.