Ambil nama kolom dari java.sql.ResultSet


233

Dengan java.sql.ResultSetapakah ada cara untuk mendapatkan nama kolom sebagai Stringdengan menggunakan indeks kolom? Saya telah melihat melalui API API tetapi saya tidak dapat menemukan apa pun.

Jawaban:


372

Anda bisa mendapatkan info ini dari ResultSetmetadata. Lihat ResultSetMetaData

misalnya

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

dan Anda bisa mendapatkan nama kolom dari sana. Jika kamu melakukan

select x as y from table

kemudian rsmd.getColumnLabel()akan memberi Anda nama label yang diambil juga.


22
Lihat juga rsmd.getColumnLabeljika Anda mengambil kolom dengan label (misalnyaSELECT columnName AS ColumnLabel
T30

15
Anda mungkin terkejut ketika saya melihat jumlah kolom mulai dari 1. Anda dapat beralih melalui nama kolom denganfor (int i = 1; i <= rsmd.getColumnCount(); i++) String name = rsmd.getColumnName(i);
Alphaaa

Apakah getColumnName()mengembalikan nama kolom asli jika tidak menggunakan ASpenamaan alias?
membersound

2
@ anggota Ya, seperti yang didokumentasikan dalam Javadoc-nya : "Jika SQL AStidak ditentukan, nilai yang dikembalikan dari getColumnLabelakan sama dengan nilai yang dikembalikan oleh getColumnNamemetode." . Dalam hampir semua kasus, Anda harus menggunakan getColumnLabelbukan getColumnName.
Mark Rotteveel

1
Ini akan gagal jika tabel kosong.
andronix

140

Selain jawaban di atas, jika Anda bekerja dengan kueri dinamis dan Anda menginginkan nama kolom tetapi tidak tahu berapa banyak kolom, Anda bisa menggunakan objek ResultSetMetaData untuk mendapatkan jumlah kolom terlebih dahulu dan kemudian menggilirnya .

Mengubah kode 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
}

bukankah ini benar? untuk (int i = 1; i <= columnCount + 1; i ++) {...}
Martin

3
@ Martin Tidak, karena itu akan berusaha mendapatkan Kolom n +1 yang tidak ada. Jika Anda ingin benar-benar ringkas, maka itu akan menjadi i <= columnCount.
Cyntech

21

Anda dapat menggunakan objek ResultSetMetaData ( http://java.sun.com/javase/6/docs/api/java/sql/ResultSetMetaData.html ) untuk itu, seperti ini:

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

1
thanx itu membantu saya ... saya menggunakannya sebagai: resultSet.getString (resultSet.findColumn ("nama lengkap"))
C Sharper

Batasi rekaman yang diambil menjadi 1. Jika tidak, jika tabel terlalu besar, maka overhead yang tidak perlu. Misalnya untuk teradatabase: gunakan kueri "SELECT * FROM table SAMPLE 1"
josepainumkal

11

Pertanyaan ini sudah tua dan begitu juga jawaban yang benar sebelumnya. Tetapi apa yang saya cari ketika saya menemukan topik ini adalah sesuatu seperti solusi ini. Semoga ini membantu seseorang.

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

Menggunakan 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: Ini berfungsi dengan PostgreSQL juga


Mencobanya pada basis data teradata dan mendapatkan kesalahan "[Database Teradata] [TeraJDBC 16.20.00.02] [Kesalahan 9719] [SQLState HY000] fitur QVCI dinonaktifkan."
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);
        }
    }
}

Nama Tabel: orang Field DataType id VARCHAR cname VARCHAR dob DATE


1

Saat Anda membutuhkan nama kolom, tetapi tidak ingin mengambil entri:

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

CATATAN: Hanya berfungsi dengan MySQL


1
Hanya ini yang bekerja untuk saya !!. Harus turun untuk ini. Tidak yakin mengapa getColumnName (i) & getColumnLabel (i), mengambil saya data aneh yang tidak terduga. Terimakasih banyak!
Membalas Negi

Senang ini membantu Anda!
Hunter S

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

6
Tolong, bisakah Anda memperluas jawaban Anda dengan penjelasan yang lebih rinci? Ini akan sangat berguna untuk pengertian. Terima kasih!
vezunchik

1

Pernyataan SQL yang membaca data dari kueri basis data mengembalikan data dalam kumpulan hasil. Pernyataan SELECT adalah cara standar untuk memilih baris dari basis data dan melihatnya dalam kumpulan hasil. The **java.sql.ResultSet**antarmuka merupakan hasil set query database.

  • Dapatkan metode: digunakan untuk melihat data di kolom baris saat ini yang diarahkan oleh kursor.

Menggunakan 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

dan lebih jauh lagi untuk mengikatnya ke tabel model data

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

tutorial yang sangat bagus di sini: 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 benar.

Jika meja Anda kosong dan Anda masih perlu mendapatkan nama kolom tabel, Anda bisa mendapatkan kolom Anda sebagai tipe Vector, lihat yang berikut:

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

Jika Anda ingin menggunakan spring jdbctemplate dan tidak ingin berurusan dengan staf koneksi, Anda dapat menggunakan yang berikut:

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

U bisa mendapatkan nama kolom dan nilai dari resultSet.getMetaData (); Kode ini berfungsi untuk saya:

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

Saya tahu, pertanyaan ini sudah dijawab tetapi mungkin orang seperti saya perlu mengakses nama kolom dari DatabaseMetaDatalabel bukan indeks:

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");
        }
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.