Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据ResultSetMetaData中的列数在Setter中设置值_Java - Fatal编程技术网

Java 根据ResultSetMetaData中的列数在Setter中设置值

Java 根据ResultSetMetaData中的列数在Setter中设置值,java,Java,我正在寻找动态方法,以便在setter方法中设置值,在该方法中,我从ResultSetMetaData获取列总数,基于这些结果,我希望在相应的setter方法中设置值。我已经在我的实用程序类中准备了这个代码段 public Integer extractData(ResultSet rs) throws SQLException, DataAccessException { ResultSetMetaData rsmd = rs.getMetaData(); int column

我正在寻找动态方法,以便在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;
}
这似乎是非常糟糕的方法,因为支付代码可以根据客户的请求增加或减少

因此,我正在寻找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.
    
    
            }
        }
    }