使用反射查询数据

来源:互联网 发布:卷积运算公式矩阵 编辑:程序博客网 时间:2024/05/19 18:39

1、使用反射调用实体类的set方法

public static <T> List<T> selectDb(Connection con, String sql, Class<T> cls, Object ...objects) throws Exception{if(con==null||sql==null||sql.trim().length()==0||cls==null){return null;}PreparedStatement pstmt = con.prepareStatement(sql);for(int i = 0; i < objects.length; i++){pstmt.setObject(i+1, objects[i]);}ResultSet rs = pstmt.executeQuery();List<T> list = new LinkedList<T>();while(rs.next()){ResultSetMetaData rsmd = rs.getMetaData();T t = cls.newInstance();for(int i = 0; i < rsmd.getColumnCount();i++){Object o = rs.getObject(rsmd.getColumnLabel(i+1));if(o==null){continue;}String columnName = rsmd.getColumnLabel(i+1);String methodName = "set"+columnName.replaceFirst(columnName.charAt(0)+"", (columnName.charAt(0)+"").toUpperCase());Method method = cls.getMethod(methodName,cls.getDeclaredField(columnName).getType());method.invoke(t, o);}list.add(t);}return list;}

2、使用反射调用preparedstantment的get方法

public static <T> List<T> put(ResultSet rs,Class<T> cls) throws Exception{List<T> list = new ArrayList<T>();Field[]  fields = cls.getDeclaredFields();Class<? extends ResultSet> rsclass = ResultSet.class;while(rs.next()){T t = cls.newInstance();for(int i = 0; i < fields.length; i++){String fieldTypeName = fields[i].getType().getSimpleName();String setParaMethodName = "set"+fields[i].getName().substring(0, 1).toUpperCase()+fields[i].getName().substring(1);String rsMethodName = "get"+fieldTypeName.substring(0, 1).toUpperCase()+fieldTypeName.substring(1);Method rsMethod = rsclass.getDeclaredMethod(rsMethodName, String.class);Object obj = rsMethod.invoke(rs, fields[i].getName());Method setParaMethod = cls.getDeclaredMethod(setParaMethodName, fields[i].getType());setParaMethod.invoke(t, obj);}list.add(t);}return list;}


原创粉丝点击