jdbc的metadata有gettables和gettablecolumns方法,只是这两个方法用起来需要小心设置参数。
获取所有用户表:
var metaData = conn.getMetaData();
var itbl = metaData.getTables(conn.getCatlog(), null, "%", new String[] {"TABLE"});
第一个参数catlog限定范围为所连接的数据库,但是不一定奏效,据deepseek,好像有的数据库,getcatlog返回null。
最后一个参数限定表的类型,普通表的类型就是"TABLE",这个比较稳能过滤掉系统表。
获取表内所有列:
var metaData = conn.getMetaData();
ResultSet rs = metaData.getColumns(conn.getCatlog(), null, tblName, null);
这个只能通过catlog限制范围了,在mysql里奏效。否则有一个用户表叫user就会跟系统表user重名,读出来一大堆不相关的列。
以下是完整工具类实现:
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//据deepseek,有写数据库getcatlog返回null,例如postresqlvar 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;}
}