【问题标题】:Retrieve column names from java.sql.ResultSet从 java.sql.ResultSet 中检索列名
【发布时间】:2010-10-16 08:33:16
【问题描述】:

对于java.sql.ResultSet,有没有办法通过使用列的索引将列的名称作为String?我浏览了 API 文档,但找不到任何东西。

【问题讨论】:

    标签: java jdbc


    【解决方案1】:

    您可以从ResultSet 元数据中获取此信息。见ResultSetMetaData

    例如

     ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
     ResultSetMetaData rsmd = rs.getMetaData();
     String name = rsmd.getColumnName(1);
    

    您可以从那里获取列名。如果你这样做了

    select x as y from table
    

    然后rsmd.getColumnLabel() 也会为您获取检索到的标签名称。

    【讨论】:

    • 如果您检索带有标签的列(例如SELECT columnName AS ColumnLabel,另请参阅rsmd.getColumnLabel
    • 当我看到列数从 1 开始时,您可能会感到惊讶。您可以使用 for (int i = 1; i <= rsmd.getColumnCount(); i++) String name = rsmd.getColumnName(i); 遍历列名
    • 如果不使用AS别名命名,getColumnName()是否返回原始列名?
    • @membersound 是,如its Javadoc 中所述:"如果未指定 SQL AS,则从 getColumnLabel 返回的值将与getColumnName 方法。”。在几乎所有情况下,您都应该使用getColumnLabel 而不是getColumnName
    • 如果表为空,这将失败。
    【解决方案2】:

    除了上面的答案之外,如果您正在使用动态查询并且想要列名但不知道有多少列,您可以使用 ResultSetMetaData 对象先获取列数,然后循环浏览它们。

    修改布赖恩的代码:

    ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
    ResultSetMetaData rsmd = rs.getMetaData();
    int columnCount = rsmd.getColumnCount();
    
    // The column count starts from 1
    for (int i = 1; i <= columnCount; i++ ) {
      String name = rsmd.getColumnName(i);
      // Do stuff with name
    }
    

    【讨论】:

    • 这不是吗? for (int i = 1; i
    • @Martin 否,因为这将尝试获取不存在的列 n + 1。如果你想绝对简洁,那就是i &lt;= columnCount
    【解决方案3】:

    您可以为此使用 ResultSetMetaData (http://java.sun.com/javase/6/docs/api/java/sql/ResultSetMetaData.html) 对象,如下所示:

    ResultSet rs = stmt.executeQuery("SELECT * FROM table");
    ResultSetMetaData rsmd = rs.getMetaData();
    String firstColumnName = rsmd.getColumnName(1);
    

    【讨论】:

    • 感谢它帮助了我...我将其用作:resultSet.getString(resultSet.findColumn("fullname"))
    • 将获取的记录限制为1。否则如果表太大,则会产生不必要的开销。例如,对于 teradatabase:使用查询“SELECT * FROM table SAMPLE 1”
    【解决方案4】:

    这个问题很老,以前的正确答案也是如此。但是当我发现这个主题时,我一直在寻找类似这个解决方案的东西。希望它可以帮助某人。

    // Loading required libraries    
    import java.util.*;
    import java.sql.*;
    
    public class MySQLExample {
      public void run(String sql) {
        // JDBC driver name and database URL
        String JDBC_DRIVER = "com.mysql.jdbc.Driver";
        String DB_URL = "jdbc:mysql://localhost/demo";
    
        // Database credentials
        String USER = "someuser"; // Fake of course.
        String PASS = "somepass"; // This too!
    
        Statement stmt = null;
        ResultSet rs = null;
        Connection conn = null;
        Vector<String> columnNames = new Vector<String>();
    
        try {
          // Register JDBC driver
          Class.forName(JDBC_DRIVER);
    
          // Open a connection
          conn = DriverManager.getConnection(DB_URL, USER, PASS);
    
          // Execute SQL query
          stmt = conn.createStatement();
          rs = stmt.executeQuery(sql);
          if (rs != null) {
            ResultSetMetaData columns = rs.getMetaData();
            int i = 0;
            while (i < columns.getColumnCount()) {
              i++;
              System.out.print(columns.getColumnName(i) + "\t");
              columnNames.add(columns.getColumnName(i));
            }
            System.out.print("\n");
    
            while (rs.next()) {
              for (i = 0; i < columnNames.size(); i++) {
                System.out.print(rs.getString(columnNames.get(i))
                    + "\t");
    
              }
              System.out.print("\n");
            }
    
          }
        } catch (Exception e) {
          System.out.println("Exception: " + e.toString());
        }
    
        finally {
          try {
            if (rs != null) {
              rs.close();
            }
            if (stmt != null) {
              stmt.close();
            }
            if (conn != null) {
              conn.close();
            }
          } catch (Exception mysqlEx) {
            System.out.println(mysqlEx.toString());
          }
    
        }
      }
    }
    

    【讨论】:

      【解决方案5】:

      SQLite 3

      使用 getMetaData();

      DatabaseMetaData md = conn.getMetaData();
      ResultSet rset = md.getColumns(null, null, "your_table_name", null);
      
      System.out.println("your_table_name");
      while (rset.next())
      {
          System.out.println("\t" + rset.getString(4));
      }
      

      编辑:这也适用于 PostgreSQL

      【讨论】:

      • 在 teradata 数据库上尝试,得到错误“[Teradata Database] [TeraJDBC 16.20.00.02] [Error 9719] [SQLState HY000] QVCI 功能已禁用。”
      【解决方案6】:
      import java.sql.*;
      
      public class JdbcGetColumnNames {
      
          public static void main(String args[]) {
              Connection con = null;
              Statement st = null;
              ResultSet rs = null;
      
              try {
                  Class.forName("com.mysql.jdbc.Driver");
                  con = DriverManager.getConnection(
                          "jdbc:mysql://localhost:3306/komal", "root", "root");
      
                  st = con.createStatement();
      
                  String sql = "select * from person";
                  rs = st.executeQuery(sql);
                  ResultSetMetaData metaData = rs.getMetaData();
      
                  int rowCount = metaData.getColumnCount();
      
                  System.out.println("Table Name : " + metaData.getTableName(2));
                  System.out.println("Field  \tDataType");
      
                  for (int i = 0; i < rowCount; i++) {
                      System.out.print(metaData.getColumnName(i + 1) + "  \t");
                      System.out.println(metaData.getColumnTypeName(i + 1));
                  }
              } catch (Exception e) {
                  System.out.println(e);
              }
          }
      }
      

      表名:人 字段数据类型 id VARCHAR cname VARCHAR 出生日期

      【讨论】:

        【解决方案7】:
        while (rs.next()) {
           for (int j = 1; j < columncount; j++) {
               System.out.println( rsd.getColumnName(j) + "::" + rs.getString(j));      
           }
        }
        

        【讨论】:

        • 拜托,你能用更详细的解释来扩展你的答案吗?这对理解非常有用。谢谢!
        【解决方案8】:

        当你需要列名,但又不想抓取条目时:

        PreparedStatement stmt = connection.prepareStatement("SHOW COLUMNS FROM `yourTable`");
        
        ResultSet set = stmt.executeQuery();
        
        //store all of the columns names
        List<String> names = new ArrayList<>();
        while (set.next()) { names.add(set.getString("Field")); }
        

        注意:仅适用于 MySQL

        【讨论】:

        • 只有这个对我有用!!。为此不得不下山。不知道为什么 getColumnName(i) & getColumnLabel(i) 检索到了我意想不到的奇怪数据。非常感谢!
        • 很高兴这对您有所帮助!
        【解决方案9】:

        从数据库查询中读取数据的 SQL 语句在结果集中返回数据。 SELECT 语句是从数据库中选择行并在结果集中查看它们的标准方法。 **java.sql.ResultSet** 接口代表数据库查询的结果集。

        • 获取方法:用于查看当前行各列的数据 被光标指向。

        使用MetaData of a result set to fetch the exact column count

        ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
        ResultSetMetaData rsmd = rs.getMetaData();
        int numberOfColumns = rsmd.getColumnCount();
        boolean b = rsmd.isSearchable(1);
        

        http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSetMetaData.html

        进一步将其绑定到数据模型表

        public static void main(String[] args) {
            Connection conn = null;
            Statement stmt = null;
            try {
                //STEP 2: Register JDBC driver
                Class.forName("com.mysql.jdbc.Driver");
        
                //STEP 3: Open a connection
                System.out.println("Connecting to a selected database...");
                conn = DriverManager.getConnection(DB_URL, USER, PASS);
                System.out.println("Connected database successfully...");
        
                //STEP 4: Execute a query
                System.out.println("Creating statement...");
                stmt = conn.createStatement();
        
                String sql = "SELECT id, first, last, age FROM Registration";
                ResultSet rs = stmt.executeQuery(sql);
                //STEP 5: Extract data from result set
                while(rs.next()){
                    //Retrieve by column name
                    int id  = rs.getInt("id");
                    int age = rs.getInt("age");
                    String first = rs.getString("first");
                    String last = rs.getString("last");
        
                    //Display values
                    System.out.print("ID: " + id);
                    System.out.print(", Age: " + age);
                    System.out.print(", First: " + first);
                    System.out.println(", Last: " + last);
                }
                rs.close();
            } catch(SQLException se) {
                //Handle errors for JDBC
                se.printStackTrace();
            } catch(Exception e) {
                //Handle errors for Class.forName
                e.printStackTrace();
            } finally {
                //finally block used to close resources
                try {
                    if(stmt!=null)
                        conn.close();
                } catch(SQLException se) {
                } // do nothing
                try {
                    if(conn!=null)
                        conn.close();
                } catch(SQLException se) {
                    se.printStackTrace();
                } //end finally try
            }//end try
            System.out.println("Goodbye!");
        }//end main
        //end JDBCExample
        

        这里的教程非常好:http://www.tutorialspoint.com/jdbc/

        ResultSetMetaData meta = resultset.getMetaData();  // for a valid resultset object after executing query
        
        Integer columncount = meta.getColumnCount();
        
        int count = 1 ; // start counting from 1 always
        
        String[] columnNames = null;
        
        while(columncount <=count) {
            columnNames [i] = meta.getColumnName(i);
        }
        
        System.out.println (columnNames.size() ); //see the list and bind it to TableModel object. the to your jtbale.setModel(your_table_model);
        

        【讨论】:

          【解决方案10】:

          @Cyntech 是对的。

          如果您的表格是空的并且您仍然需要获取表格列名,您可以将您的列设为 Vector 类型,请参阅以下内容:

          ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
          ResultSetMetaData rsmd = rs.getMetaData();
          int columnCount = rsmd.getColumnCount();
          
          Vector<Vector<String>>tableVector = new Vector<Vector<String>>(); 
          boolean isTableEmpty = true;
          int col = 0;
          
           while(rs.next())
              {
                isTableEmpty = false;  //set to false since rs.next has data: this means the table is not empty
                 if(col != columnCount)
                    {
                      for(int x = 1;x <= columnCount;x++){
                           Vector<String> tFields = new Vector<String>(); 
                           tFields.add(rsmd.getColumnName(x).toString());
                           tableVector.add(tFields);
                       }
                      col = columnCount;
                    }
               } 
          
          
                //if table is empty then get column names only
            if(isTableEmpty){  
                for(int x=1;x<=colCount;x++){
                     Vector<String> tFields = new Vector<String>(); 
                     tFields.add(rsmd.getColumnName(x).toString());
                     tableVector.add(tFields);
                  }
                }
          
           rs.close();
           stmt.close();
          
           return tableVector; 
          

          【讨论】:

            【解决方案11】:
            ResultSet rsTst = hiSession.connection().prepareStatement(queryStr).executeQuery(); 
            ResultSetMetaData meta = rsTst.getMetaData();
            int columnCount = meta.getColumnCount();
            // The column count starts from 1
            
            String nameValuePair = "";
            while (rsTst.next()) {
                for (int i = 1; i < columnCount + 1; i++ ) {
                    String name = meta.getColumnName(i);
                    // Do stuff with name
            
                    String value = rsTst.getString(i); //.getObject(1);
                    nameValuePair = nameValuePair + name + "=" +value + ",";
                    //nameValuePair = nameValuePair + ", ";
                }
                nameValuePair = nameValuePair+"||" + "\t";
            }
            

            【讨论】:

              【解决方案12】:

              如果你想使用spring jdbctemplate又不想处理连接人员,你可以使用如下:

              jdbcTemplate.query("select * from books", new RowCallbackHandler() {
                      public void processRow(ResultSet resultSet) throws SQLException {
                          ResultSetMetaData rsmd = resultSet.getMetaData();
                          for (int i = 1; i <= rsmd.getColumnCount(); i++ ) {
                              String name = rsmd.getColumnName(i);
                              // Do stuff with name
                          }
                      }
                  });
              

              【讨论】:

                【解决方案13】:

                U 可以从 resultSet.getMetaData() 中获取列名和值; 这段代码对我有用:

                Connection conn = null;
                PreparedStatement preparedStatement = null;
                    try {
                        Class.forName("com.mysql.cj.jdbc.Driver");
                        conn = MySQLJDBCUtil.getConnection();
                        preparedStatement = conn.prepareStatement(sql);
                        if (params != null) {
                            for (int i = 0; i < params.size(); i++) {
                                preparedStatement.setObject(i + 1, params.get(i).getSqlValue());
                            }
                            ResultSet resultSet = preparedStatement.executeQuery();
                            ResultSetMetaData md = resultSet.getMetaData();
                            while (resultSet.next()) {
                                int counter = md.getColumnCount();
                                String colName[] = new String[counter];
                                Map<String, Object> field = new HashMap<>();
                                for (int loop = 1; loop <= counter; loop++) {
                                    int index = loop - 1;
                                    colName[index] = md.getColumnLabel(loop);
                                    field.put(colName[index], resultSet.getObject(colName[index]));
                                }
                                rows.add(field);
                            }
                        }
                    } catch (SQLException e) {
                        e.printStackTrace();
                    } finally {
                        if (preparedStatement != null) {
                            try {
                                preparedStatement.close();
                            }catch (Exception e1) {
                                e1.printStackTrace();
                            }
                        }
                        if (conn != null) {
                            try {
                                conn.close();
                            } catch (SQLException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                    return rows;
                

                【讨论】:

                  【解决方案14】:

                  我知道,这个问题已经得到解答,但可能像我这样的人需要通过标签而不是索引从 DatabaseMetaData 访问列名:

                  ResultSet resultSet = null;
                  DatabaseMetaData metaData = null;
                  
                      try {
                          metaData  = connection.getMetaData();
                          resultSet = metaData.getColumns(null, null, tableName, null);
                  
                          while (resultSet.next()){
                              String name = resultSet.getString("COLUMN_NAME");
                          }
                      }
                  

                  【讨论】:

                    猜你喜欢
                    • 2017-08-14
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-09-13
                    • 2017-08-21
                    • 1970-01-01
                    • 2014-01-06
                    • 1970-01-01
                    相关资源
                    最近更新 更多