ดึงชื่อคอลัมน์จาก java.sql.ResultSet


233

ด้วยjava.sql.ResultSetจะมีวิธีที่จะได้รับชื่อคอลัมน์ที่เป็นได้Stringโดยใช้ดัชนีคอลัมน์? ฉันได้ดู API เอกสาร แต่ไม่พบอะไรเลย

คำตอบ:


372

คุณสามารถรับข้อมูลนี้ได้จาก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()คุณจะได้รับชื่อป้ายที่ดึงมาด้วย


22
ดูrsmd.getColumnLabelถ้าคุณดึงคอลัมน์ที่มีป้ายกำกับ (เช่นSELECT columnName AS ColumnLabel
T30

15
คุณอาจประหลาดใจเมื่อฉันเห็นการนับคอลัมน์เริ่มต้นที่ 1 คุณสามารถวนซ้ำผ่านชื่อคอลัมน์ด้วยfor (int i = 1; i <= rsmd.getColumnCount(); i++) String name = rsmd.getColumnName(i);
Alphaaa

ไม่getColumnName()กลับชื่อคอลัมน์ต้นฉบับในกรณีที่ไม่ได้ใช้ASนามแฝงตั้งชื่อ?
membersound

2
@membersound ใช่ตามที่ระบุไว้ในJavadoc : "หากASไม่ได้ระบุSQL ค่าที่ส่งคืนจากgetColumnLabelจะเป็นค่าเดียวกับค่าที่ส่งคืนโดยgetColumnNameวิธีการ" . ในเกือบทุกกรณีคุณควรใช้getColumnLabelgetColumnNameแทน
Mark Rotteveel

1
สิ่งนี้จะล้มเหลวหากตารางว่างเปล่า
andronix

140

นอกเหนือจากคำตอบข้างต้นหากคุณทำงานกับแบบสอบถามแบบไดนามิกและคุณต้องการชื่อคอลัมน์ แต่ไม่ทราบว่ามีกี่คอลัมน์คุณสามารถใช้ออบเจ็กต์ ResultSetMetaData เพื่อรับจำนวนคอลัมน์ก่อนจากนั้นจึงวนรอบ .

การแก้ไขโค้ดของ 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
}

ไม่ถูกต้องใช่ไหม สำหรับ (int i = 1; i <= columnCount + 1; i ++) {... }
Martin

3
@ มาร์ตินไม่เพราะจะพยายามรับคอลัมน์ n + 1 ที่ไม่มีอยู่ i <= columnCountถ้าคุณต้องการที่จะกระชับอย่างแล้วมันจะเป็น
Cyntech

21

คุณสามารถใช้ออบเจ็กต์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);

1
ขอบคุณมันช่วยฉัน ... ฉันใช้มันเป็น: resultSet.getString (resultSet.findColumn ("fullname"))
C Sharper

จำกัด เร็กคอร์ดที่ดึงข้อมูลมาที่ 1 ไม่เช่นนั้นหากตารางมีขนาดใหญ่เกินไป เช่นสำหรับฐานข้อมูล: ใช้แบบสอบถาม "SELECT * จากตารางตัวอย่าง 1"
josepainumkal

11

คำถามนี้เก่าและเป็นคำตอบก่อนหน้านี้ที่ถูกต้อง แต่สิ่งที่ฉันกำลังมองหาเมื่อฉันพบว่าหัวข้อนี้เป็นอะไรที่เหมือนวิธีแก้ปัญหานี้ หวังว่ามันจะช่วยให้ใครบางคน

// 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] [TeraJDBC 16.20.00.02] [ข้อผิดพลาด 9719] [SQLState HY000] คุณลักษณะ QVCI ถูกปิดใช้งาน"
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);
        }
    }
}

ชื่อตาราง: person ฟิลด์ DataType id VARCHAR cname VARCHAR dob DATE


1

เมื่อคุณต้องการชื่อคอลัมน์ แต่ไม่ต้องการคว้ารายการ:

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 เท่านั้น


1
สิ่งนี้ใช้ได้สำหรับฉันเท่านั้น !! ต้องลงมาเพื่อสิ่งนี้ ไม่แน่ใจว่าทำไม getColumnName (i) & getColumnLabel (i) ดึงข้อมูลแปลก ๆ ที่ไม่คาดคิดมาให้ฉัน ขอบคุณมาก!
VipiN Negi

ดีใจที่ได้ช่วยคุณ!
ฮันเตอร์ S

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

6
โปรดคุณช่วยขยายคำตอบของคุณพร้อมคำอธิบายที่ละเอียดยิ่งขึ้นได้ไหม มันจะมีประโยชน์มากสำหรับการทำความเข้าใจ ขอบคุณ!
vezunchik

1

คำสั่ง 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);

0

@Cyntech ถูกต้อง

ในกรณีที่โต๊ะของคุณว่างเปล่าและคุณยังจำเป็นต้องได้รับชื่อคอลัมน์ตารางคุณสามารถรับคอลัมน์ของคุณเป็นประเภทเวกเตอร์ดูที่ต่อไปนี้:

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

หากคุณต้องการใช้สปริง 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
            }
        }
    });

0

คุณสามารถรับชื่อคอลัมน์และค่าจาก 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;

0

ฉันรู้ว่าคำถามนี้มีคำตอบแล้ว แต่อาจมีคนอย่างฉันที่ต้องการเข้าถึงชื่อคอลัมน์จาก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");
        }
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.