元数据:描述数据的数据,ResultSetMetaData是描述ResultSet的元数据对象,从它可以得到数据集有多少了,每一列的列名。。。
ResultSetMetaData可以通过ResultSet类的getMetaData()获得。
ResultSetMetaData中的方法:
->getColumnCount():获取数据集有多少列
->getColumnLabel(int column):获取指定列的列名,索引从1开始
步骤:
1、利用sql进行查询,得到结果集,查询时应该给出列的别名,别名要和类的对象的属性名对应;
2、利用反射创建实体类的对象;
3、获取结果集的列的别名;
4、再获取结果集中每一列的值,结合步骤3得到一个Map,键为列名,值为对应的值;
5、利用反射给实体对象的属性赋值。
1 public <T> T get(Class<T> clazz, String sql,Object ... args){ 2 T entity = null; 3 Connection connection = null; 4 PreparedStatement preparedStatement = null; 5 ResultSet resultSet = null; 6 7 try { 8 //1、进行sql查询,获取resultSet对象 9 connection = jdbcTools.getConnection(); 10 preparedStatement = connection.prepareStatement(sql); 11 12 for(i=0;i<args.length;i++){ 13 preparedStatement.setObject(i+1,args[i]); 14 } 15 resultSet = preparedStatement.executeQuery(); 16 17 //2、获取数据集元数据,即ResultSetMetaData对象 18 ResultSetMetaData rsmd = resultSet.getMetaData(); 19 20 //3和4,获取列名和值,创建map对象 21 Map<String,Object> values = new HashMap<String,Object>(); 22 23 while(resultSet.next()){ 24 for(int i = 0;i<rsmd.getColumnCount();i++){ 25 26 String columnLabel = rsmd.getColumnLabel(i+1); 27 Object columnValue = resultSet.getObject(columnLabel); 28 values.put(columnLabel,columnValue); 29 30 } 31 } 32 33 //5、创建实例,并通过反射赋值 34 entity = clazz.newInstance(); 35 36 for(Map.Entry<String,Object> entry: values.entrySet()){ 37 String fieldName = entry.getKey(); 38 Object fieldValue = entry.getValue(); 39 ///反射工具类需要自己实现 40 //ReflectUtils.setFieldValue(entity,fieldName,fieldValue); 41 BeanUtils.setProperty(entity,fieldname,fieldValue); 42 } 43 44 45 }catch (Exception e){ 46 e.printStackTrace(); 47 48 }finally { 49 jdbcTools.releaseResource(resultSet,preparedStatement,connection); 50 } 51 return entity; 52 }
上面的方法是返回一个对象,如果需要返回多条记录,则需要重新写一个方法
1 public <T> List<T> getForList(Class<T> clazz, String sql, Object...args) throws Exception{ 2 List<T> list = null; 3 Connection connection = null; 4 PreparedStatement preparedStatement = null; 5 ResultSet resultSet = null; 6 7 try{ 8 connection = jdbcTools.getConnection(); 9 preparedStatement = connection.prepareStatement(sql); 10 for(int i = 0;i<args.length;i++){ 11 preparedStatement.setObject(i+1,args[i]); 12 } 13 14 resultSet = preparedStatement.executeQuery(); 15 ResultSetMetaData rsmd = resultSet.getMetaData(); 16 List<Map<String,Object>> values = new ArrayList<Map<String, Object>>(); 17 18 Map<String,Object> map = null; 19 20 while(resultSet.next()){ 21 map = new HashMap<String, Object>(); 22 for(int i = 0;i< rsmd.getColumnCount();i++){ 23 String fieldName = rsmd.getColumnLabel(i+1); 24 Object object = resultSet.getObject(i+1); 25 map.put(fieldName,object); 26 } 27 values.add(map); 28 } 29 30 T bean = null; 31 if(values != null ){ 32 for(Map<String,Object> m: values){ 33 for(Map.Entry<String,Object> entry : m.entrySet()) { 34 String fieldName = entry.getKey(); 35 Object fieldValue = entry.getValue(); 36 bean = clazz.newInstance(); 37 BeanUtils.setProperty(bean,fieldName,fieldValue); 38 39 } 40 list.add(bean); 41 } 42 } 43 44 45 46 }catch (Exception e){ 47 e.printStackTrace(); 48 }finally { 49 jdbcTools.releaseResource(resultSet,preparedStatement,connection); 50 } 51 52 return list; 53 54 }
浙公网安备 33010602011771号