为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

米脂 2021-10-27 19:01:41
我正在寻找动态方法来设置 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员工,现在总共有 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 中设置值。所以请建议我最好的方法并帮助我实现相同的目标。但是我正在考虑泛型实现,泛型是否有一些魔力,如果是> 那么如何?请建议我。
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

使用此代码:


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 withPayCode.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();

    }

}


查看完整回答
反对 回复 2021-10-27
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

你可以使用反射


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<> 在其中添加所有支付代码。您还可以为每个支付代码实现 gtter 以从 HashMap 中读取。


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.



        }

    }

}


查看完整回答
反对 回复 2021-10-27
  • 2 回答
  • 0 关注
  • 111 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信