【问题标题】:ResultSet how to put it into a ArrayListResultSet如何放入ArrayList
【发布时间】:2014-11-25 11:07:43
【问题描述】:

“ResultSet”是否被认为是一个 ArrayList?我说的是jdbc。如果没有,那么 如何使用

放置从数据库中获取的信息
while (result.next()) {
....

}

将语法转换为类似于 hotelResult 的 ArrayList?

我希望这是可以理解的。

【问题讨论】:

  • 你辛苦了:手工打造
  • 只需迭代您的 ResultSet 并将所有元素添加到您的 ArrayList。
  • 嗯...我不确定它是如何完成的。我是java的新手。假设我想将hotelNo 添加到我的ArrayList 中。我使用什么语法?我真的不知道:/感谢您的快速回答! :)
  • documentation 可能会有所帮助。列出的唯一超级接口是AutocloseableWrapper,而ArrayList 具有完全不同的接口列表。 (查看ArrayList.add)换句话说,不,ResultSet 不是数组列表。这是reasonable example
  • 如果您询问添加到数组列表的语法:hotelResult.add()

标签: java jdbc resultset


【解决方案1】:

ResultSet 不是 ArrayList。相反,它是一个特殊对象(接口),用于保存通过 JDBC 连接查询检索到的数据。

ResultSet 对象无法更新,只能向前遍历...不能向后遍历。默认情况下,您只能从第一行到最后一行迭代一次(尽管通过一些编码,您可以生成一个可以双向编辑和遍历的 ResultSet 对象)。

存储在 ResultSet 对象中的记录可以很容易地放在 ArrayList 中。这是一个关于如何做到这一点的示例:

Connection con = ... ;
Statement stmt = ... ;
ResultSet results = stmt.executeQuery("..."); 

//Stores properties of a ResultSet object, including column count
ResultSetMetaData rsmd = results.getMetaData(); 
int columnCount = rsmd.getColumnCount();

ArrayList<String> hotelResultList = new ArrayList<>(columnCount); 
while (results.next()) {              
   int i = 1;
   while(i <= columnCount) {
        hotelResultList.add(results.getString(i++));
   }
}

注意:此示例假定查询中返回单个字符串,例如酒店名称。您可能希望保存有关每个酒店的多条数据,在这种情况下,您将创建一个“Hotel”对象,然后将 ArrayList 创建为 Hotel 对象的 List。通过使用行映射器,可以使用关联数据填充每个酒店对象。

此外,使用流行的 JDBC 框架之一来处理 JDBC 连接、查询和结果集可以进一步简化流程。

【讨论】:

  • 谢谢,这正是我想要的。
【解决方案2】:

我会帮助你的:)! 在类中创建所需的变量,请参阅我的示例 :)

public class HotelData {
    private String hotelName = null;
    private int hotelTelephone = 0;

    public HotelData(String hotelName, int hotelTelephone) {
    this.hotelName = hotelName;
    this.hotelTelephone = hotelTelephone;
    }
}

现在创建 ArrayList:

public ArrayList<HotelData> hotelResult = new ArrayList<HotelData>();

现在使用 while 方法:

while(result.next()) {
    hotelResult.add(new HotelData(result.getString("Enter columnname"), result.getInt("Enter colummname")));
}

希望这会帮助你哥们:)!如果您需要从 ArrayList 中获取数据,您可以简单地在 HotelData 类中编写自己的 get 方法!

【讨论】:

  • 啊可爱。非常感谢!只有一个问题:我让它在没有 hotelData 类的情况下工作?为什么我们需要它?我这样做了: ArrayList<string> hotelInfo = new ArrayList<string>(); while(result.next()) {hotelInfo.add(result.getString("hotelNo")); // 当它是一个 INT 而不是一个 STRING 时它是如何工作的? hotelInfo.add(result.getString("hotelName")); hotelInfo.add(result.getString("city")); System.out.println(hotelInfo); } </string></string> 再次编辑:对不起。我不知道如何格式化代码,所以这里看起来不错
  • 查看我在这个主题中的新帖子 ;)
【解决方案3】:

不,ResultSet 不被视为 ArrayList,而是一个表。 例如,如果 hotelResult 具有 String 类型,您可以用这段代码填充列表(如果 ResultSet 中的列是 String)。

while(result.next()) {
  hotelResult.add(result.getString("Enter the columnname here");
}

对于每种数据类型,都有一个从 ResultSet 中获取值的方法。 在 Java API 中查找不同类型的方法。

【讨论】:

  • 好的,我想我明白了。好吧..现在我遇到了另一个问题。我的老师指派我将数据库中的一些信息放入 ArrayList。我现在想如果它只是字符串,我知道该怎么做,但就我而言,我有 String、Int 和 (var)Char。我怎么可能把这些信息放到一个 Arraylist 中?
  • @AdemÖkmen 为信息创建一个具有属性的对象,为ResultSet 中的一行创建一个对象,并将其添加到列表中。
  • 是的,正如 Mark Rotteveel 所说。创建一个名为HotelData 的类,在HotelData 类中创建String 和int 变量。据我所知,varchar 与 String 相同 :)!
  • @AdemÖkmen 在 Michael M 的帖子下查看我的帖子。
【解决方案4】:

我相信这将清除 - ArrayList 酒店持有 HotelDtos 的对象

public class HotelDto {
private String hotelName;
private String hotelAddress;

private int hotelRank;

public String getHotelName() {
    return hotelName;
}

public void setHotelName(String hotelName) {
    this.hotelName = hotelName;
}

public String getHotelAddress() {
    return hotelAddress;
}

public void setHotelAddress(String hotelAddress) {
    this.hotelAddress = hotelAddress;
}

public int getHotelRank() {
    return hotelRank;
}

public void setHotelRank(int hotelRank) {
    this.hotelRank = hotelRank;
}

}

public class HotelDao {

public List<HotelDto> getHotlInfo(String hotelName) {

    List<HotelDto> hotels = new ArrayList<HotelDto>();
    try {

        String query = "SELECT  hotelName, hotelAddress,hotelrank " + "FROM   HOTELS_TABLE "
                + "WHERE hotelName = " + "'" + hotelName + "'" + " ";

        ResultSet resultSet = DBConnection.getDBConnection().createStatement().executeQuery(query);

        int i = 0;

        while (resultSet.next()) {

            HotelDto hDto = new HotelDto();
            hDto.setHotelName(resultSet.getString(1));
            hDto.setHotelAddress(resultSet.getString(2));
            hDto.setHotelrank(resultSet.getInt(3));
            hotels.add(i, hDto);
            i++;
        }

    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        return hotels;
    }

}

}

【讨论】:

    【解决方案5】:

    要回答您的第一个问题,您实际上并不需要 HotelData 类。 这个类所做的唯一一件事就是将数据保存在一个对象中(针对每个特定的酒店)。

    如果您按照自己的方式实现,则必须先将所有值转换为字符串(如果它们不包含字符串值),然后您才能将项目存储在 hotelInfo 列表中。这是因为 hotelInfo 列表具有 String 类型,在我的实现中这也不需要(强制转换),因为我创建了一个具有一个 String 值和一个 int 值的构造函数。

    如果你想让你的例子像这样实现它:

    不是这个:hotelInfo.add(result.getString("hotelNo"));

    但是像这样:hotelInfo.add("" + result.getInt("hotelNo")); //注意这里的演员表!

    【讨论】:

    • 感谢您的所有回复。这对我来说真的很重要:) 好的,所以我尝试了你的方式,包括演员表,但它说“不能从 int 转换为字符串”但是如果我以“我的”方式做,那么我实际上可以打印它全部正确地进入控制台。它甚至包括整数。所以我认为它正在工作(至少现在,这个项目还需要做很多工作)。我不会再打扰你了。我要感谢你的帮助。时间不早了,我得睡觉了。明天可能会带着一个新问题回来,呵呵。
    • Adem,我为你解决了我犯了一个错误:这样做:hotelInfo.add("" + result.getInt("hotelNo"));而不是那个有演员表的!
    • 查看上面的评论,我也用正确的解决方案编辑了我的最后一个答案!
    【解决方案6】:

    如果您问我如何获取添加到列表中的数据库值。以下是解决方案

    1. pom.xml文件在sn-p下面添加依赖

      <dependency>
          <groupId>com.google.guava</groupId>
          <artifactId>guava</artifactId>
          <version>18.0</version>
      </dependency>
      
    2. 从主程序调用方法。

      List output =  readRows(rs);
      

      这里rsResultSet对象,readRows()是方法

    3. 下面是readRows()方法的代码sn-p

      private static List<List<Object>> readRows(ResultSet rs) throws SQLException
      {
          ImmutableList.Builder<List<Object>> rows = ImmutableList.builder();
          int columnCount = rs.getMetaData().getColumnCount();
          while (rs.next()) {
              List<Object> row = new ArrayList<>();
              for (int i = 1; i <= columnCount; i++) {
                  row.add(rs.getObject(i));
              }
              rows.add(row);
          }
          return rows.build();
      }
      

    【讨论】:

      猜你喜欢
      • 2016-08-09
      • 2012-01-13
      • 1970-01-01
      • 2018-09-13
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      相关资源
      最近更新 更多