jdbc獲取所有表和表內列
jdbc的metadata有gettables和gettablecolumns方法,只是這兩個方法用起來需要小心設置參數(shù)。
獲取所有用戶表:
var metaData = conn.getMetaData();
var itbl = metaData.getTables(conn.getCatlog(), null, "%", new String[] {"TABLE"});
第一個參數(shù)catlog限定范圍為所連接的數(shù)據(jù)庫,但是不一定奏效,據(jù)deepseek,好像有的數(shù)據(jù)庫,getcatlog返回null。
最后一個參數(shù)限定表的類型,普通表的類型就是"TABLE",這個比較穩(wěn)能過濾掉系統(tǒng)表。
獲取表內所有列:
var metaData = conn.getMetaData();
ResultSet rs = metaData.getColumns(conn.getCatlog(), null, tblName, null);
這個只能通過catlog限制范圍了,在mysql里奏效。否則有一個用戶表叫user就會跟系統(tǒng)表user重名,讀出來一大堆不相關的列。
以下是完整工具類實現(xiàn),其中的jTemplate參數(shù)在new的時候手動傳入。
package com.example.hibernate;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
public class JDBCExtra {
private JdbcTemplate mJTemplate;
private DataSource mDS;
//private DatabaseMetaData mMetaData;
JDBCExtra(JdbcTemplate jTemplate){
mJTemplate = jTemplate;
mDS = mJTemplate.getDataSource();
}
public String getCatlog() {
try (Connection conn = mDS.getConnection()) {
String catlog = conn.getCatalog();
//double check before we return
//據(jù)deepseek,有寫數(shù)據(jù)庫getcatlog返回null,例如postresql
var md = conn.getMetaData();
var url = md.getURL();
var segs = url.split("/");
var dbname = segs[segs.length-1];
if(!catlog.equals(dbname)) throw new Error("unrecognized catlog name");
return catlog;
}
catch(Exception e) {
throw new Error(e);
}
}
public ArrayList<String> getAllTableNames(){
ArrayList<String> retlst = new ArrayList<String>();
try (Connection conn = mDS.getConnection()) {
DatabaseMetaData metaData = conn.getMetaData();
var catlog = this.getCatlog();
var itbl = metaData.getTables(catlog, null, "%", new String[] {"TABLE"});
while(itbl.next()) {
String tblname = itbl.getString("TABLE_NAME");
//二次檢查,table schema必須是"TABLE"才是用戶表
var tbltype = itbl.getString("TABLE_TYPE");
//System.out.println("tblname:"+tblname+", tbltype:"+ tbltype);
if(!tbltype.equals("TABLE")) throw new Error("bad,"+tbltype);
retlst.add(tblname);
}
}
catch(Exception e) {
throw new Error(e);
}
return retlst;
}
public ArrayList<String> getTableColumnNames(String tblName) {
ArrayList<String> columns = new ArrayList<>();
try (Connection conn = mDS.getConnection()) {
DatabaseMetaData metaData = conn.getMetaData();
var connCat = conn.getCatalog();
ResultSet rs = metaData.getColumns(connCat, null, tblName, null);
// 遍歷結果集,獲取列名
while (rs.next()) {
String columnName = rs.getString("COLUMN_NAME");
columns.add(columnName);
/*
System.out.println("tblschm:"+rs.getString("TABLE_SCHEM")
+", tblcat:"+rs.getString("TABLE_CAT")
+ ", tblname: "+rs.getString("TABLE_NAME")
+ ", colname: "+columnName);
*/
}
} catch (Exception e) {
throw new Error(e);
// e.printStackTrace();
}
return columns;
}
}

浙公網(wǎng)安備 33010602011771號