先看下需求背景:
获取某个数据源连接下所有库名,库下所有表名,表中所有字段
1.MySql
先说MySql吧,最简单
1.1获得所有数据库库名
这是一个mysql和sqlserver公用的方法,这里url不用担心数据库问题,他其实用的是ip,端口号,用户名,密码 这些信息就行,但是因为url上没有数据库名字的话无法建立连接,所以url上就不得不带着。
实际上这个方法可以获取到该连接下的所有数据库
jdbc:sqlserver://127.0.0.1:3306;databaseName=master;encrypt=true;trustServerCertificate=truejdbc:mysql://127.0.0.1:3306/test
private static final String TABLE_CAT = "TABLE_CAT";
/**
* 获取连接下所有的数据库名称 mysql和sqlserver可用
*
* @param url
* @param user
* @param password
* @return
*/
public static List<String> getDBNames(String url, String user, String password) {
Connection conn = null;
List<String> list = new ArrayList<>();
try {
conn = DriverManager.getConnection(url, user, password);
DatabaseMetaData metadata = conn.getMetaData();
ResultSet resultSet = metadata.getCatalogs();
while (resultSet.next()) {
String databaseName = resultSet.getString(TABLE_CAT);
list.add(databaseName);
System.out.println(databaseName);
}
return list;
} catch (SQLException e) {
log.error(e.getMessage());
} finally {
//finally中关闭连接
if (Objects.nonNull(conn)) {
try {
conn.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
return list;
}
1.2 获取某个库下所有表名
这个方法也不用替换url中的数据库名,但是需要把数据库名作为参数上传。
因为查询sql中用到了数据库名
SELECT table_name FROM information_schema.tables WHERE table_schema =
private static final String TABLE_NAME = "TABLE_NAME";
/**
* 获取数据库下所有表名 mysql sqlserver使用
*
* @param url
* @param user
* @param password
* @param dbName
* @return
*/
public static List<String> getMysqlTableNames(String url, String user, String password, String dbName) {
Connection conn = null;
Statement statement = null;
ResultSet resultSet = null;
List<String> tableNames = new ArrayList<>();
StringBuilder stringBuilder = new StringBuilder();
String query = stringBuilder.append("SELECT table_name FROM information_schema.tables WHERE table_schema = ").append("'").append(dbName).append("'").toString();
try {
conn = DriverManager.getConnection(url, user, password);
statement = conn.createStatement();
resultSet = statement.executeQuery(query);
while (resultSet.next()) {
String tableName = resultSet.getString(TABLE_NAME);
tableNames.add(tableName);
}
} catch (SQLException e) {
log.error(e.getMessage());
} finally {
//finally中关闭连接
try {
if (Objects.nonNull(conn)) {
conn.close();
}
if (Objects.nonNull(statement)) {
statement.close();
}
if (Objects.nonNull(resultSet)) {
resultSet.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
return tableNames;
}
1.3 获取表中的所有列名
这个很简单,就执行个select * from 就可以
但是注意 url需要替换 现在新选择的库名是什么,那就把url中的databaseName替换为新选择的
这也是一个mysql和sqlserver可以公用的
但是sqlserver有一点需要注意,就是最后一个参数 tableName 需要上传为 模式名.表名
因为对于sql来说正常执行查询sql的时候 也要 模式名.表名 查询
select * from dbo.spt_fallback_db
/**
* 获取表下所有字段 其中url记得把前端新传来库的替换
*
* @param url
* @param user
* @param password
* @param tableName
* @return
* @throws SQLException
*/
public static List<String> getColumns(String url, String user, String password, String tableName) {
//用新的dbName对连接上的dbName进行替换
List<String> columns = new ArrayList<>();
Connection conn = null;
Statement statement = null;
ResultSet resultSet = null;
StringBuilder stringBuilder = new StringBuilder();
String query = stringBuilder.append("select * from ").append(tableName).append(" where 1!=1").toString();
try {
conn = DriverManager.getConnection(url, user, password);
statement = conn.createStatement();
resultSet = statement.executeQuery(query);
ResultSetMetaData metaData = resultSet.getMetaData();
for (int i = 1; i <= metaData.getColumnCount(); i++) {
String columnName = metaData.getColumnName(i);
columns.add(columnName);