"ResultSet"はArrayListと見なされますか?私はjdbcについて話している。いいえの場合、どのようにしてDBから取得した情報を
while (result.next()) {
....
}
hotelResultのようなものと呼ばれるArrayListへの構文?
理解できたといいですね。
いいえ、ResultSetはArrayListではなくテーブルと見なされます。たとえば、hotelResultのタイプが文字列の場合、このコードをリストに入力できます(ResultSetの列が文字列の場合)。
while(result.next()) {
hotelResult.add(result.getString("Enter the columnname here");
}
データ型ごとに、ResultSetから値を取得するメソッドがあります。さまざまな種類のメソッドについては、Java APIを参照してください。
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 = rs.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++));
}
}
注:この例では、ホテル名など、クエリで単一の文字列が返されることを前提としています。各ホテルに関する複数のデータを保持したい場合があります。その場合は、「ホテル」オブジェクトを作成してから、Arrayオブジェクトをホテルオブジェクトのリストとして作成します。行マッパーを使用して、各ホテルオブジェクトに関連データを入力できます。
さらに、一般的なJDBCフレームワークの1つを使用して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メソッドを記述するだけです。
arrayList hotelsは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;
}
}
}
私のリストに追加されたデータベースの値を取得する方法を尋ねている場合、以下の解決策があります
pom.xmlファイルは依存関係のスニペットの下に追加します
_<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
_
メインプログラムからメソッドを呼び出します。
_List output = readRows(rs);
_
ここでrs
はResultSet
オブジェクト、readRows()
はメソッドです
以下は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();
}
_
最初の質問に答えるために、HotelDataクラスは本当に必要ありません。このクラスが行う唯一のことは、(特定のホテルごとに)1つのオブジェクトにデータを適切に保持することです。
それを自分の方法で実装する場合、uがhotelInfoリストにアイテムを格納する前に、すべての値を最初に文字列にキャストする必要があります(それらに文字列値が含まれていない場合)。これは、hotelInfoリストにString型があるためです。私の実装では、これも必要ありません(キャスト)。1つのString値と1つのint値を持つコンストラクターを作成したためです。
あなたの例を機能させたい場合は、次のように実装してください:
これではない:hotelInfo.add(result.getString( "hotelNo"));
しかし、このように:hotelInfo.add( "" + result.getInt( "hotelNo")); //ここのキャストに注意してください!