【问题标题】:How can I print the column names from 3 tables joining JDBC? [duplicate]如何打印加入 JDBC 的 3 个表中的列名? [复制]
【发布时间】: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 应该会有所帮助:stackoverflow.com/questions/696782/…
  • 您已经将列名传递给您的println() 调用。所以也打印这些字符串。

标签: java jdbc relational-database


【解决方案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://stackoverflow.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);
        ...
      }
      

      【讨论】:

        猜你喜欢
        • 2017-04-16
        • 1970-01-01
        • 1970-01-01
        • 2020-04-12
        • 2014-05-20
        • 2021-02-13
        • 1970-01-01
        • 2017-12-23
        • 2015-06-12
        相关资源
        最近更新 更多