Lấy tên cột từ java.sql.ResultSet


233

java.sql.ResultSetcách nào để lấy tên của một cột Stringbằng cách sử dụng chỉ mục của cột không? Tôi đã xem qua tài liệu API nhưng tôi không thể tìm thấy gì.

Câu trả lời:


371

Bạn có thể lấy thông tin này từ ResultSetsiêu dữ liệu. Xem SetMetaData

ví dụ

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

và bạn có thể lấy tên cột từ đó. Nếu bạn làm

select x as y from table

sau đó rsmd.getColumnLabel()sẽ giúp bạn lấy tên nhãn lấy.


22
Xem thêm rsmd.getColumnLabelnếu bạn truy xuất các cột có nhãn (ví dụSELECT columnName AS ColumnLabel
T30

15
Bạn có thể ngạc nhiên khi tôi thấy số cột bắt đầu từ 1. Bạn có thể lặp qua các tên cột vớifor (int i = 1; i <= rsmd.getColumnCount(); i++) String name = rsmd.getColumnName(i);
Alphaaa

getColumnName()trả lại tên cột ban đầu nếu không sử dụng ASđặt tên bí danh không?
viên

2
@membersound Có, như được ghi trong Javadoc của nó : "Nếu SQL ASkhông được chỉ định, giá trị được trả về getColumnLabelsẽ giống với giá trị được getColumnNamephương thức trả về ." . Trong hầu hết các trường hợp, bạn nên sử dụng getColumnLabelthay vì getColumnName.
Mark Rotteveel

1
Điều này sẽ thất bại nếu bảng trống.
andronix

140

Ngoài các câu trả lời ở trên, nếu bạn đang làm việc với một truy vấn động và bạn muốn các tên cột nhưng không biết có bao nhiêu cột, bạn có thể sử dụng đối tượng resultInMetaData để lấy số cột trước và sau đó quay vòng qua chúng .

Sửa đổi mã của Brian:

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
}

Điều này có đúng không? for (int i = 1; i <= cộtCount + 1; i ++) {...}
Martin

3
@Martin Không, vì điều đó sẽ cố lấy Cột n + 1 không tồn tại. Nếu bạn muốn hoàn toàn súc tích, thì nó sẽ như vậy i <= columnCount.
Cyntech

21

Bạn có thể sử dụng đối tượng resultInMetaData ( http://java.sun.com/javase/6/docs/api/java/sql/ResultSetMetaData.html ) cho điều đó, như thế này:

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

1
thanx nó đã giúp tôi ... tôi đã sử dụng nó như: resultset.getString (resultset.findColumn ("tên đầy đủ"))
C Sharper

Giới hạn các bản ghi được tìm nạp xuống 1. Nếu không, nếu bảng quá lớn, thì không cần thiết. Ví dụ: cho teradatabase: sử dụng truy vấn "CHỌN * TỪ bảng MẪU 1"
josepainumkal

11

Câu hỏi này đã cũ và các câu trả lời trước đây cũng đúng. Nhưng những gì tôi đang tìm kiếm khi tôi tìm thấy chủ đề này là một cái gì đó giống như giải pháp này. Hy vọng nó sẽ giúp được ai đó.

// 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

Sử dụng 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));
}

EDIT: Điều này cũng hoạt động với PostgreSQL


Đã thử nó trên cơ sở dữ liệu teradata và gặp lỗi "[Cơ sở dữ liệu Teradata] [TeraJDBC 16.20.00.02] [Error 9719] [SQLState HY000] Tính năng QVCI bị tắt."
josepainumkal

2
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);
        }
    }
}

Tên bảng: person Trường DataType id VARCHAR cname VARCHAR dob DATE


1

Khi bạn cần tên cột, nhưng không muốn lấy các mục:

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")); }

LƯU Ý: Chỉ hoạt động với MySQL


1
Chỉ điều này làm việc cho tôi !! Phải đi xuống cho điều này. Không chắc chắn tại sao getColumnName (i) & getColumnLabel (i), đã truy xuất cho tôi dữ liệu lạ bất ngờ. Cảm ơn nhiều!
VipiN Negi

Vui mừng điều này đã giúp bạn!
Hunter S

1
while (rs.next()) {
   for (int j = 1; j < columncount; j++) {
       System.out.println( rsd.getColumnName(j) + "::" + rs.getString(j));      
   }
}

6
Xin vui lòng, bạn có thể mở rộng câu trả lời của bạn với lời giải thích chi tiết hơn? Điều này sẽ rất hữu ích cho sự hiểu biết. Cảm ơn bạn!
vezunchik

1

Các câu lệnh SQL đọc dữ liệu từ truy vấn cơ sở dữ liệu trả về dữ liệu trong tập kết quả. Câu lệnh SELECT là cách tiêu chuẩn để chọn các hàng từ cơ sở dữ liệu và xem chúng trong tập kết quả. Các **java.sql.ResultSet**giao diện đại diện cho tập kết quả của một truy vấn cơ sở dữ liệu.

  • Nhận phương thức: được sử dụng để xem dữ liệu trong các cột của hàng hiện tại được trỏ bởi con trỏ.

Sử dụng 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

và hơn nữa để liên kết nó với bảng mô hình dữ liệu

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

hướng dẫn rất hay ở đây: 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);

0

@Cyntech nói đúng.

Trong trường hợp bảng của bạn trống và bạn vẫn cần lấy tên cột của bảng, bạn có thể lấy cột của mình dưới dạng Vector, xem phần sau:

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; 

0
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";
}

0

Nếu bạn muốn sử dụng spring jdbctemplate và không muốn giao dịch với nhân viên kết nối, bạn có thể sử dụng như sau:

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
            }
        }
    });

0

Bạn có thể nhận được tên và giá trị của cột từ resultset.getMetaData (); Mã này hoạt động với tôi:

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;

0

Tôi biết, câu hỏi này đã được trả lời nhưng có lẽ ai đó như tôi cần truy cập vào một tên cột từ DatabaseMetaDatanhãn thay vì chỉ mục:

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");
        }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.