如何打印加入 JDBC 的 3 个表中的列名? [复制]

Posted

技术标签:

【中文标题】如何打印加入 JDBC 的 3 个表中的列名? [复制]【英文标题】:How can I print the column names from 3 tables joining JDBC? [duplicate] 【发布时间】:2020-03-25 04:01:03 【问题描述】:

我已经加入了 3 个表,此查询执行并打印出表数据。

try 
    Connection conn = DriverManager.getConnection(DB_URL, USERNAME, PASSWORD);
    System.out.println("Connected");
    Statement st = conn.createStatement();

    String query = "SELECT s.*, sup.name as supplierName , p.name as partName "+
                    "FROM supplies s "+
                    "INNER JOIN supplier sup on s.supplierNum = sup.supplierNum "+
                    "INNER JOIN parts p on s.partNum = p.partNum";

    ResultSet rs = st.executeQuery(query);

    while(rs.next()) 
        System.out.println(rs.getString("supplierNum"));
        System.out.println(rs.getString("partNum"));
        System.out.println(rs.getString("quantity"));
        System.out.println(rs.getString("supplierName"));
        System.out.println(rs.getString("partName"));
        space();
    

 catch(Exception ex) 
    System.out.println(ex);

但我试图添加列名,而不是控制台打印:

它会打印级联的列名

供应商编号:S1

零件编号:P1

数量:300

姓名:史密斯

零件:螺母

【问题讨论】:

您可以尝试从 ResultSet 中读取列名:这个 Thread 应该会有所帮助:***.com/questions/696782/… 您已经将列名传递给您的println() 调用。所以也打印这些字符串。 【参考方案1】:
while(rs.next()) 
    System.out.println("Supplier Name " + rs.getString("supplierNum"));
    System.out.println("Part Name "+rs.getString("partNum"));
    System.out.println("Quantity "+ rs.getString("quantity"));
    System.out.println("SupplierName "+rs.getString("supplierName"));
    System.out.println("PartName "+rs.getString("partName"));
    space();
    

【讨论】:

【参考方案2】:

正如https://***.com/a/696794/11226302中所建议的那样

您需要获取 ResultSet 元数据才能以编程方式从 db 中获取列名。

否则,您可以按照其他答案中的建议手动输入名称。

【讨论】:

【参考方案3】:

您当然可以对列名进行硬编码,因为您已经知道它们。

如果您想以编程方式获取它们,请使用类似于此的ResultSetMetaData

Connection connection = ...

try (PreparedStatement ps = connection.prepareStatement(QUERY)) 
    ResultSet resultSet = ps.executeQuery();
    // get the meta data from the result set
    ResultSetMetaData rsMeta = resultSet.getMetaData();
    // receive the column count
    int columnCount = rsMeta.getColumnCount();

    // iterate them (their indexes start at 1, I think)
    for (int i = 1; i < columnCount + 1; i++) 
        // and print the column name, the type and the type name
        System.out.println(rsMeta.getColumnName(i) 
                + " (" 
                + rsMeta.getColumnType(i)
                + ", "
                + rsMeta.getColumnTypeName(i)
                + ")");
    
 catch ...
    ...

如果你想直接输出while循环中的列,那么在循环之前获取元数据

ResultSetMetaData rsMeta = rs.getMetaData();

然后,在循环内部做

System.out.println(rsMeta.getColumnName(1) + ": " + rs.getString("supplierNum"));
System.out.println(rsMeta.getColumnName(2) + ": " + rs.getString("partNum"));
System.out.println(rsMeta.getColumnName(3) + ": " + rs.getString("quantity"));
System.out.println(rsMeta.getColumnName(4) + ": " + rs.getString("supplierName"));
System.out.println(rsMeta.getColumnName(5) + ": " + rs.getString("partName"));

【讨论】:

@ArvindKumarAvinash 确定这样没有意义,但它展示了如何使用ResultMetaData... 我认为人们会定期循环遍历列名。【参考方案4】:

您可以从结果集中选择他的元数据

ResultSetMetaData meta = rs.getMetaData();
int cols = meta.getColumnCount();
for (int i = 1; i <= cols; i++) 
  String colName = meta.getColumnName(i);
  System.out.printf("%s=%s\n", colName, rs.getString(i);
  ...

【讨论】:

以上是关于如何打印加入 JDBC 的 3 个表中的列名? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

BIGQUERY - 查询所有具有唯一 SSN 和 DOB 值的 UUID,基于 UUID 列加入 2 个表

如何加入没有公共列的第四个表

大查询:加入第二个表中的单个最新行

在几个表中搜索列名,而不是整个数据库 SQL

加入3个表,在其他表中有多个值

如何在不指定列名的情况下从另一个表更新一个表?