1. 程式人生 > >JAVA 獲取資料庫中表的結構

JAVA 獲取資料庫中表的結構

網上的方法:

	private Connection connection;
	private Statement statement;

	public void initConnection(String driverClass, String dbUrl, String username, String password) throws Exception {
		Class.forName(driverClass);
		this.connection = DriverManager.getConnection(dbUrl, username, password);
		this.statement = this.connection.createStatement();
	}

	public ResultSetMetaData getMetaDataFromTable(String tableName) throws Exception {
		String sql = "SELECT * FROM " + tableName.toUpperCase() + " WHERE 1 != 1";
		ResultSet rs = this.statement.executeQuery(sql);
		return rs.getMetaData();
	}

	public void displayMetaData(ResultSetMetaData metaData) throws Exception {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < metaData.getColumnCount(); i++) {
			sb.append("\n");
			sb.append(metaData.getTableName(i + 1));
			sb.append(".");
			sb.append(metaData.getColumnName(i + 1));
			sb.append("|");
			sb.append(metaData.getColumnType(i + 1));
			sb.append("|");
			sb.append(metaData.getColumnTypeName(i + 1));
			sb.append("|");
			sb.append(metaData.getColumnDisplaySize(i + 1));
			sb.append("|");
		}
		System.out.println(sb.toString());
	}


我的方法,有點小問題就是表中無資料時無法得到結構

import java.sql.*;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

public class TestDatabaseTableName{

 public static void main(String[] args) throws Exception {
  // 驅動
  String driver = "com.mysql.jdbc.Driver";
  // 資料庫連線
  String url = "jdbc:mysql://localhost:4828/xfhex_oa";
  // 使用者名稱
  String user = "root";
  // 資料庫密碼
  String password = "123";
  // 載入驅動
  Class.forName(driver);
  // 獲取連結
  Connection connection = DriverManager
    .getConnection(url, user, password);
  // 建立查詢宣告
  PreparedStatement preparedStatement = connection
    .prepareStatement("from xfhex_user");
  // 獲取結果
  ResultSet resultSet = preparedStatement.executeQuery();
  // 獲取各個列的資訊
  ResultSetMetaData metaData = resultSet.getMetaData();
  // 一條資料儲存在一個Hashtable 將所有Hashtable存放到list
  List<Hashtable<String, Object>> rows = new ArrayList<Hashtable<String, Object>>();
  while (resultSet.next()) {
   Hashtable<String, Object> row = new Hashtable<String, Object>();
   for (int i = 1; i <= metaData.getColumnCount(); i++) {
    // 列印列名
    System.out.println(metaData.getColumnName(i));
    row.put(metaData.getColumnName(i), resultSet.getObject(i));
   }
   rows.add(row);
  }
  resultSet.close();
  preparedStatement.close();
  connection.close();
 }

}

注意:
ResultSetMetaData 物件可以用於查詢 ResultSet 中的列的型別和特性。
方法索引
getCatalogName(int)
獲得列的表的目錄名。
getColumnCount()
獲得 ResultSet 中的列數。
getColumnDisplaySize(int)
獲得列的正常的最大字元寬度。
getColumnLabel(int)
獲得列印輸出和顯示的建議列標題。
getColumnName(int)
獲得列名。
getColumnType(int)
獲得一個列的 SQL 型別。
getColumnTypeName(int)
獲得一個列的資料來源特定的型別名。
getPrecision(int)
獲得一個列的十進位制數字的位數。
getScale(int)
獲得一個列的十進位制小數點右面數字的位數。
getSchemaName(int)
獲得一個列的表的模式。
getTableName(int)
獲得列的表名。
isAutoIncrement(int)
列是否自動計數,因此它是隻讀的。
isCaseSensitive(int)
列是否區分大小寫。
isCurrency(int)
列是否是通用的。
isDefinitelyWritable(int)
對列的寫操作是否一定成功。
isNullable(int)
在該列中是否可以放一個 NULL 值。
isReadOnly(int)
列是否是不可寫的。
isSearchable(int)
該列是否是可以查詢的。
isSigned(int)
該列是否是有符號數。
isWritable(int)
對該列的寫操作是否會成功。