下面的代码显示了特定表的元组。如何将其转换为动态代码?因此,用户将输入表的名称,然后显示除表格内容之外的行和列名称。
*请记住,res.getInt和res.getString需要按原样指定。在动态模型中,我不需要知道列的数量,类型和名称。 *
public void displayTableA()
{
//Connection already established
Statement st = conn.createStatement();
ResultSet res = st.executeQuery("SELECT * FROM A");
System.out.println("A_code: " + "\t" + "A_name: ");
while (res.next()) {
int r = res.getInt("A_code");
String s = res.getString("A_name");
System.out.println(r + "\t\t" + s);
}
conn.close();
}
答案 0 :(得分:0)
public void displayTable(String table)
{
//Connection already established
Statement st = conn.createStatement();
ResultSet res = st.executeQuery("SELECT * FROM " + table);
ResultSetMetaData rsmd = res.getMetaData();
while (res.next()) {
for(int ii = 1; ii <= rsmd.getColumnCount(); ii++) {
// get type
int type = rsmt.getColumnType(ii);
String value = null;
switch (type) {
case Types.VARCHAR: value = res.getString(ii); break;
}
// print value.
System.out.print(rsmd.getColumnName(ii) + ": " + value);
}
}
conn.close();
}
答案 1 :(得分:0)
直接回答:查询只是一个字符串。您可以从用户输入构建它。就像把表的名称读成一个变量,比如“String tablename”,然后是
String query="select * from " + tablename;
然后运行查询以获取结果集:
ResultSet rs=st.executeQuery(query);
然后获取结果集的元数据:
ResultSetMetaData meta=rs.getMetaData();
然后遍历获取其名称的列:
for (int x=1;x<=meta.getColumnCount();++x)
{
String columnName=meta.getColumnName(x);
... do whatever you want with this column name ...
}
(请注意,列从1开始编号,而不是0。)
对于数据本身,如果您只是将其转储出来,则无需知道该类型。只需对所有内容执行getString。每种数据类型都可以转换为字符串。好吧,如果你有斑点或图像,你可能想检查那些。有一个ResultSetMetaData函数来获取列类型,我认为它是getType或类似的东西。检查javadocs。
那说,你为什么要这样做?如果你正在构建某种工具供开发人员用来进行即席查询,那好吧。但是对于向最终用户公开这样的东西我会非常谨慎。 (a)他们不太可能理解数据,(b)你将创建一个巨大的安全漏洞,用户可以看到系统中的任何数据。您可以将其包装在支票中以限制用户使用他们有权查看的内容,但要做到这一点还有很多工作要做。说“这是你可以看到的东西”然后试着说“这是你不允许看到的东西”要容易得多。
答案 2 :(得分:0)
如果您想在动态查询中打印ResultSet
,请转换ResultSet
中String
的实例:
public static String toString(ResultSet rs) throws SQLException {
StringBuilder sb = new StringBuilder();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
Map<Integer, Integer> sizeMap = new HashMap<>();
for (int column = 1; column <= columnCount; column++) {
int size = Math.max(metaData.getColumnDisplaySize(column), metaData.getColumnName(column).length());
sizeMap.put(column, size);
sb.append(StringUtils.rightPad(metaData.getColumnName(column), size));
sb.append(' ');
sb.append(' ');
}
sb.append('\n');
for (int column = 1; column <= columnCount; column++) {
sb.append(StringUtils.rightPad("", sizeMap.get(column), '-'));
sb.append(' ');
sb.append(' ');
}
while(rs.next()) {
sb.append('\n');
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
String str = rs.getString(columnIndex);
if (str == null) {
str = "(null)";
}
sb.append(StringUtils.rightPad(str, sizeMap.get(columnIndex)));
sb.append(' ');
sb.append(' ');
}
}
return sb.toString();
}
用于打印类似的东西:
user_id user_code date_update
------------ -------------------- -------------------
01006393 00989573 2011-09-29 19:23:46
00984742 20192498 2011-12-21 00:00:00
此方法使用Commons Lang 3
注意:您应小心使用它以避免内存错误。您可以使用sb.append
或System.out.print
System.out.println