eternal403 2011-01-07 16:08
浏览 337
已采纳

怎么从ResultSet的结果自动构建JavaBean

我有元数据表,
比如该表为A,现在该表有十条记录,比如是下面的样子。

id cn_name en_name data_type
1 搜索代码 search_code xxxx
2 名称 cname yyy
3 审核状态 audit_status ccc
4
5
.....

这就是该表类似的记录。改变的数据是会增加的。现在我想将该表的记录封装成一个javabean,至于原因,是因为该表的记录是元数据,他会是另外表的表结构的字段,这样我方便处理数据。

这个javabean类似这样
[code="java"]
public class 表名{
private String(全部都是String类型的,业务上这样)searchCode(就是表的记录的en_name);
private String cname;
private String auditStatus;
......
......
......
}
[/code]

javabean就是类似上面的样子,我现在的情况的这样,使用jdbc得出ResultSet,然后根据java反射机制一个字段一个字段的构造属性,getter和setter方法。有没有更加简洁和优雅的方法呢?

PS:由于项目的关系,没有使用hibernate,so别问我为什么不用这不用那的.谢谢

  • 写回答

1条回答

  • ageofnodoubt 2011-01-07 16:52
    关注

    基本上就两种方式:
    1、自己new 一个Bean,循环后自己逐个对应set进去
    2、使用反射机制
    对查询出来的字段动态添加前缀set,并将首字段改为大写,这样就可以调用到指定Bean指定字段的set方法

    印象中没有更方便的方法了

    [code="java"]
    /**
    * 从ResultSet绑定到JavaBean
    *

    * @param ResultSet
    * @param DTO(JavaBean)
    * @return DTO
    */
    public static DTO bindDataToDTO(ResultSet rs, DTO dto) throws Exception {

        //取得Method方法 
        Method[] methods = dto.getClass().getMethods();
    
        //取得ResultSet的列名 
        ResultSetMetaData rsmd = rs.getMetaData(); 
        int columnsCount = rsmd.getColumnCount(); 
        String[] columnNames = new String[columnsCount]; 
        for (int i = 0; i < columnsCount; i++) { 
            columnNames[i] = rsmd.getColumnLabel(i + 1); 
        }
    
        //遍历ResultSet 
        while (rs.next()) { 
            //反射, 从ResultSet绑定到JavaBean 
            for (int i = 0; i < columnNames.length; i++) { 
                //取得Set方法 
                String setMethodName = "set" + columnNames[i]; 
                //遍历Method 
                for (int j = 0; j < methods.length; j++) { 
                    if (methods[j].getName().equalsIgnoreCase(setMethodName)) { 
                        setMethodName = methods[j].getName(); 
                        Object value = rs.getObject(columnNames[i]);
    
                        //实行Set方法 
                        try { 
                            //JavaBean内部属性和ResultSet中一致时候 
                            Method setMethod = dto.getClass().getMethod( 
                                    setMethodName, value.getClass()); 
                            setMethod.invoke(dto, value); 
                        } catch (Exception e) { 
                            //JavaBean内部属性和ResultSet中不一致时候,使用String来输入值。 
                            Method setMethod = dto.getClass().getMethod( 
                                    setMethodName, String.class); 
                            setMethod.invoke(dto, value.toString()); 
                        } 
                    } 
                } 
            } 
        }
    
        return dto; 
    }
    

    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?