问题描述
我有元数据表,比如该表为A,现在该表有十条记录,比如是下面的样子。id cn_name en_name data_type1 搜索代码 search_code xxxx2 名称 cname yyy3 审核状态 audit_status ccc45.....这就是该表类似的记录。改变的数据是会增加的。现在我想将该表的记录封装成一个javabean,至于原因,是因为该表的记录是元数据,他会是另外表的表结构的字段,这样我方便处理数据。这个javabean类似这样public class 表名{ private String(全部都是String类型的,业务上这样)searchCode(就是表的记录的en_name); private String cname; private String auditStatus; ...... ...... ......}javabean就是类似上面的样子,我现在的情况的这样,使用jdbc得出ResultSet,然后根据java反射机制一个字段一个字段的构造属性,getter和setter方法。有没有更加简洁和优雅的方法呢?PS:由于项目的关系,没有使用hibernate,so别问我为什么不用这不用那的.谢谢
解决方案
基本上就两种方式:1、自己new 一个Bean,循环后自己逐个对应set进去2、使用反射机制对查询出来的字段动态添加前缀set,并将首字段改为大写,这样就可以调用到指定Bean指定字段的set方法印象中没有更方便的方法了/** * 从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; }