ด้วยjava.sql.ResultSet
จะมีวิธีที่จะได้รับชื่อคอลัมน์ที่เป็นได้String
โดยใช้ดัชนีคอลัมน์? ฉันได้ดู API เอกสาร แต่ไม่พบอะไรเลย
ด้วยjava.sql.ResultSet
จะมีวิธีที่จะได้รับชื่อคอลัมน์ที่เป็นได้String
โดยใช้ดัชนีคอลัมน์? ฉันได้ดู API เอกสาร แต่ไม่พบอะไรเลย
คำตอบ:
คุณสามารถรับข้อมูลนี้ได้จาก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()
คุณจะได้รับชื่อป้ายที่ดึงมาด้วย
for (int i = 1; i <= rsmd.getColumnCount(); i++) String name = rsmd.getColumnName(i);
getColumnName()
กลับชื่อคอลัมน์ต้นฉบับในกรณีที่ไม่ได้ใช้AS
นามแฝงตั้งชื่อ?
AS
ไม่ได้ระบุSQL ค่าที่ส่งคืนจากgetColumnLabel
จะเป็นค่าเดียวกับค่าที่ส่งคืนโดยgetColumnName
วิธีการ" . ในเกือบทุกกรณีคุณควรใช้getColumnLabel
getColumnName
แทน
นอกเหนือจากคำตอบข้างต้นหากคุณทำงานกับแบบสอบถามแบบไดนามิกและคุณต้องการชื่อคอลัมน์ แต่ไม่ทราบว่ามีกี่คอลัมน์คุณสามารถใช้ออบเจ็กต์ 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
}
i <= columnCount
ถ้าคุณต้องการที่จะกระชับอย่างแล้วมันจะเป็น
คุณสามารถใช้ออบเจ็กต์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);
คำถามนี้เก่าและเป็นคำตอบก่อนหน้านี้ที่ถูกต้อง แต่สิ่งที่ฉันกำลังมองหาเมื่อฉันพบว่าหัวข้อนี้เป็นอะไรที่เหมือนวิธีแก้ปัญหานี้ หวังว่ามันจะช่วยให้ใครบางคน
// 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());
}
}
}
}
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 เช่นกัน
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
เมื่อคุณต้องการชื่อคอลัมน์ แต่ไม่ต้องการคว้ารายการ:
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 เท่านั้น
while (rs.next()) {
for (int j = 1; j < columncount; j++) {
System.out.println( rsd.getColumnName(j) + "::" + rs.getString(j));
}
}
คำสั่ง 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);
@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;
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";
}
หากคุณต้องการใช้สปริง 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
}
}
});
คุณสามารถรับชื่อคอลัมน์และค่าจาก 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;
ฉันรู้ว่าคำถามนี้มีคำตอบแล้ว แต่อาจมีคนอย่างฉันที่ต้องการเข้าถึงชื่อคอลัมน์จาก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");
}
}
rsmd.getColumnLabel
ถ้าคุณดึงคอลัมน์ที่มีป้ายกำกับ (เช่นSELECT columnName AS ColumnLabel