环境说明:
Win10
Java
MySQL 5.7
利用MySQL数据库做数据统计,有如下代码用于获取指定表名各列的名称:
public List<String> getTableColumns(String tableName) throws SQLException {
ResultSet rs = conn.getMetaData().getColumns(null, null, tableName, null);
List<String> cols = new ArrayList<>();
while (rs.next()) {
cols.add(rs.getString("COLUMN_NAME"));
}
close(rs);
return cols;
}
之前一直正常,直到遇到了tableName
中包含.
时,发现导出的数据为空。经检查发现getColumns
返回为空,怀疑是.
号引起的。尝试将.
替换为\.
发现正常。因此将代码改为如下:
public String escape(String name){
return name.replace(".", stringEscape + ".");
}
public List<String> getTableColumns(String tableName) throws SQLException {
ResultSet rs = conn.getMetaData().getColumns(null, null, escape(tableName), null);
List<String> cols = new ArrayList<>();
while (rs.next()) {
cols.add(rs.getString("COLUMN_NAME"));
}
close(rs);
return cols;
}
其中stringEscape
在与数据建立连接后通过DatabaseMetaData .getSearchStringEscape
方法获取,其代码如下:
this.dbName = dbName;
this.url = DBConfig.getDbUrl(dbName);
try {
this.conn = DriverManager.getConnection(url, user, password);// 获取连接
DatabaseMetaData dbMetaData = conn.getMetaData();
this.stringEscape = dbMetaData.getSearchStringEscape();
} catch (SQLException e) {
throw new IllegalStateException(e);
}
参考: