Java 根据ResultSetMetaData中的列数在Setter中设置值
我正在寻找动态方法,以便在setter方法中设置值,在该方法中,我从Java 根据ResultSetMetaData中的列数在Setter中设置值,java,Java,我正在寻找动态方法,以便在setter方法中设置值,在该方法中,我从ResultSetMetaData获取列总数,基于这些结果,我希望在相应的setter方法中设置值。我已经在我的实用程序类中准备了这个代码段 public Integer extractData(ResultSet rs) throws SQLException, DataAccessException { ResultSetMetaData rsmd = rs.getMetaData(); int column
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;
}
这似乎是非常糟糕的方法,因为支付代码可以根据客户的请求增加或减少
因此,我正在寻找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
一起使用,以获取类方法,然后遍历方法名称,搜索包含属性名称的方法。
找到后,使用方法为对象设置值。调用(p,value)
,然后退出循环
如果存储PayCode.class.getDeclaredMethods()
,然后创建一个哈希集,将方法名称作为键,将方法作为值映射,则可以加快速度:
静态地图映射字段(类clazz){
方法[]methods=clazz.getDeclaredMethods();
映射结果=新的HashMap();
用于(方法:方法){
String methodName=method.getName();
if(methodName.indexOf(“set”)==0){
result.put(methodName.substring(3),method);
}
}
返回结果;
}
然后使用它:
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();
}
}
Map fields=mapFields(PayCode.class);
if(字段.容器(名称)){
试一试{
fields.get(name).invoke(p,value);
}捕获(非法访问例外e){
e、 printStackTrace();
}捕获(调用TargetException 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.
}
}
}
package.com.test;
导入java.sql.ResultSet;
导入java.sql.ResultSetMetaData;
导入java.sql.SQLException;
导入java.util.HashMap;
导入java.util.Map;
班级员工{
private Map payCodes=新HashMap();
私有字符串epf;
公共字符串getEsic(){
返回支付代码。获取(“ESIC”);
}
公共字符串getEpf(){
返回支付代码。获取(“EPF”);
}
公共地图getPayCodes(){
返回工资代码;
}
}
公共类动态更好{
公共静态void main(字符串[]args){
}
公共静态整数提取数据(ResultSet rs)引发SQLException、DataAccessException{
while(rs.next()){
员工e=新员工();
Map payCodes=e.getPayCodes();
//在payCodes中设置应用程序paycode,您可以使用列名作为键并从结果集中获取值。
}
}
}
这仅在所有值的类型为字符串时有效。OP应该澄清300多行中更多的列是否都有String
类型。我已经提供了示例,显然开发人员可以根据需要进行修改。是的,这是一个示例。但是,如果OP必须为每种类型编写额外的代码,它仍然是通用的吗?OP说:我正在寻找2-3行动态代码。只是一个提示。非常感谢大家,是的,所有95个工资代码都是字符串。这只适用于所有值的类型为字符串的情况。OP应该澄清300多行中更多的列是否都有类型字符串
。好的解释@user987339,但我想匹配列名,然后根据它生成setter,我已经维护了所有95个支付代码的枚举,我使用它们作为键,并针对每个键在MAP中绑定一个方法,现在我想在查询执行后匹配列名,如果我的列名与Map中的Key匹配,那么将生成相应的setter
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();
}
}
}
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.
}
}
}