ResultSet如何将其放入ArrayList



"ResultSet"是否被视为ArrayList?我说的是jdbc。如果没有,那么如何使用将从数据库中获得的信息放入

while (result.next()) {
....
}

语法转换为一个名为hotelResult的ArrayList?

我希望这是可以理解的。

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++));
   }
}

注意:本例假定在查询中返回一个String,例如Hotel名称。您可能希望保存每个酒店的多条数据,在这种情况下,您将创建一个"hotel"对象,然后将ArrayList创建为hotel对象列表。通过使用行映射器,可以用关联的数据填充每个酒店对象。

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

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

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方法!

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

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

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

我相信这会清除-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;
    }
}

}

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

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

如果你想让你的例子发挥作用,可以这样实现:

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

但如下所示:hotelInfo.add("+result.getInt("hotelNo"))//注意这里的演员阵容!

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

  1. pom.xml文件添加到依赖的以下片段

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

    List output =  readRows(rs);
    

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

  3. 以下是readRows()方法的代码片段

    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();
    }
    

我想用性能调整建议来完成上述技术解决方案。

当用Java(适用于任何编程语言)将整个SELECT输出存储到程序级变量中时,每个人都没有提到性能影响。

商业数据库的大小可以很容易地增长到1TB,单个表的大小通常为300GB。512GB的iPhone 14今天也可以使用,以防您认为SELECT语句的输出不太可能有300GB的数据。

考虑到1TB的表大小,将整个SELECT输出存储到简单的变量数组中,将间接消耗1TB的RAM。在Java中,这就是Java堆内存。

当然,他们是建议将数据存储在HotelDao类的数组中的成员,该数组包含setHotelName()、getHotelName()等。这可能会使其Java内部内存使用量从1TB增加一倍到2TB。

在运行任何Java应用程序时,都必须在应用程序启动期间使用Java参数-Xmx指定其堆内存(假设只涉及堆内存)。如果您在J2EE中托管它,那么它可能是Apache Tomcat启动、IBM WebSphere Application Server启动、JBoss等。如果您是通过报告服务器(例如Cognos、Informatica)进行的,那么它们有自己的配置来定义-Xmx参数。

其次,多用户、多实例、并发访问是当今技术中的规范。如果GUI触发多个用户请求同时运行同一SELECT语句,例如航班预订系统、报告,那么同一SELECT的多个实例的表大小为1TB,Java堆内存中的Java数组变量大小最小为1TB。想象一下,10个并发用户,如Expedia,将轻松创建10个这样的数组变量,每个变量1TB。如果整个程序中只有一个这样的SELECT Array设计,那么总的可变大小将是10TB。

这里的问题是,在Java应用程序启动期间定义2TB的Java堆内存是不切实际的。配置10TB Java堆内存远远超出了当今RAM最大大小的硬件限制,除非您正在寻找对操作系统交换内存区域的大量分页。

Eclipse Temurin和Oracle Java 19都不再记录默认的最大堆大小(-Xmx),而是Eclipse Java 9(https://www.eclipse.org/openj9/docs/openj9_defaults/)表示默认为25%的RAM大小。换句话说,128GB的RAM机器将分配32GB。任何一个值都不适合1TB,一旦整个Java应用程序完全用完32GB(默认值)或整个RAM(128GB),就会立即崩溃。

当然,Windows管理员会告诉你,Windows会根据需要自动调整其页面文件。我的问题是,当在Expedia找到一家酒店需要几分钟的时间时,商务用户的体验会有多差。即使Windows允许分配10TB的页面文件,我们也必须考虑整体应用程序性能(最终用户体验)的下降,并权衡操作系统对磁盘的分页;由于Java应用程序程序员将整个SELECT输出存储在本地变量中,如果存储为Java类对象,则会更大。

在整个StackOverflow.com中,成员在设计JDBC应用程序时往往不考虑应用程序性能,而考虑卷大小。最新的Intel工作站单插槽CPU只能容纳128GB RAM DDR4(参考Xeon E-2388G)。我没有看到任何程序员能够访问1TB RAM高端服务器,即使是因为这种设计而无法处理需要10TB RAM的Java应用程序

注:最新的英特尔台式机CPU酷睿i9第14代,今天(2022-10)支持DDR5-最大RAM大小128GB RAM。参考www.crucial.com

相关内容

  • 没有找到相关文章

最新更新