【最大10000ポイント】当たる!!質問投稿キャンペーン!

現在、javaの勉強中です。
そこで、ResultSetについて質問があります。

私は、今まで主にC#で開発をやっていました。
C#だと、クライアント(WindowsForm) → Webサーバー → APサーバー → DB
という構成で、サーバー間をデータセットでやり取りしていました。

ただ、javaは私のコーディングミスかもしれませんが、DBサーバーで取得した値を
ResultSetに入れて、Connectionやら、StatementをCloseすると、ResultSetも消滅してしまっています。

こういう場合は、取得直後に、なにか別のクラス変数などに移し変えるのが正しいのでしょうか?
ただ、そうなると、私の勝手な考えですが必要な列分の配列変数が必要なのでは?と、思ってしまっていて、
そうなると、ナンセンスだな・・・・と思っています。

ほかに何か良いやり方はあるのでしょうか?

それとも、そもそも、DB接続の専用クラスというものはJavaに必要なのでしょうか?
(上記のC#の考えでいけば、間のWebサーバーとAPサーバーが不要?)

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

ConnectionやStatementをcloseするなら、ResultSetを配列変数に格納するしかないです。

この回答への補足

もし、配列変数に格納したくない場合は、ResultSetを使用したメソッド内で、ResultSet内のデータを使用しないと
いけないんでしょうか?
(finallyでcloseしたいので)

補足日時:2010/11/26 16:37
    • good
    • 1
この回答へのお礼

なんとか、自分で納得できるようになるような構造でresultSetを
使用することが出来ました。
ありがとうございました。

お礼日時:2010/11/29 17:21

Mapは例で書いただけだから


HashMapでも何でも
好きなコレクションを使えば良いわよ。
    • good
    • 0
この回答へのお礼

なんとか、自分で納得できるようになるような構造でresultSetを
使用することが出来ました。
ありがとうございました。

お礼日時:2010/11/29 17:22

>Map recodeMap = new Map();


Mapはインターフェースなのでインスタンス化できません。

Map recodeMap = new HashMap();
とすればいいのではないでしょうか。
    • good
    • 0
この回答へのお礼

なんとか、自分で納得できるようになるような構造でresultSetを
使用することが出来ました。
ありがとうございました。

お礼日時:2010/11/29 17:21

ResultSetはデータベースの検索結果へのマッピングなの。


だからStatementやConnectionをcloseすると
マッピング情報も参照できなくなってしまうのよ。

よくやるのは共通部品で
List resultList = new List();
while(resultSet.next() {
Map recodeMap = new Map();
recodeMap("カラム", resultSet.getObject("カラム");
resultList.add(recodeMap);
}
こんな風にしていったん格納しちゃう方法ね。
各処理で実装するならその検索専用のVOを作ることになるわ。

この回答への補足

試しにコーディングしてみたんですが

Map recodeMap = new Map();

というところで下記のエラーが出てしまいます。
「型 Map のインスタンスを生成できません」

調べてみても良い答えが見つかりませんでした。

何か、解決方法ってありますか?

補足日時:2010/11/26 17:30
    • good
    • 0
この回答へのお礼

なんとか、自分で納得できるようになるような構造でresultSetを
使用することが出来ました。
ありがとうございました。

お礼日時:2010/11/29 17:21

それぞれの言語の考え方なので、JavaのResultSetがいいとか悪いとか言ってもどうしようもないと。


その言語で可能なことをするしかないです。

この回答への補足

すいません。

要は、ActionクラスにSQLを記述してもいいのか?という事なんですが・・・

補足日時:2010/11/26 15:13
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ということは、必要な列分だけ配列変数を作成というのが、javaでのResultSetの中身を保持し続ける方法?ということに
なるんでしょうか?

お礼日時:2010/11/26 14:57

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QResultSet での問題

だいたいのプログラム内容:
login.htmlでログインを試み、そこからメールアドレス、パスワードがerrormsg.jspにパラメータで送られ、errormsg.jspからLoginBean.java(bean)を使いSQLデータに入ってるメールアドレス、パスワードと照らし合わされ、データに登録されていなかったら、エラーメッセージが返され、合っていたらwelcom.htmlページに送られます。
たまたま@ITで似たような内容があったので、基本的には同じように作りました。
でも、うまくデータを照合し分けることができません。パラメータは調べたらきちんと通っており。ResultSetの所に問題があると分かりました。
以下はLoginBean.javaの主な問題コードです。
public boolean confirm(){
try{
//SQLへの接続省略してます
String sql_str = "SELECT email, password FROM customer where email='"+email+"'AND password='"+password+"'";
//ここが問題の部分です。
ResultSet rs = stmt.executeQuery(sql_str);
if(rs!=null){
rs.close();
stmt.close();
connection.close();
return true;
}
else{
rs.close();
stmt.close();
connection.close();
return false;}
}catch(SQLException e) {
return false;
}catch(Exception e){
e.printStackTrace();
return false;}}}
このように、パラメータからきたアドレスパスワードを使い、SQLのSELECTで検索されたものをrsに返し、rsが空でなければ、trueを返します。(このメソッドはerromsg.jspから呼ばれます。)しかしデータに登録さてないものでもrsがnullでないと判断され、trueが帰ってきます。

だいたいのプログラム内容:
login.htmlでログインを試み、そこからメールアドレス、パスワードがerrormsg.jspにパラメータで送られ、errormsg.jspからLoginBean.java(bean)を使いSQLデータに入ってるメールアドレス、パスワードと照らし合わされ、データに登録されていなかったら、エラーメッセージが返され、合っていたらwelcom.htmlページに送られます。
たまたま@ITで似たような内容があったので、基本的には同じように作りました。
でも、うまくデータを照合し分けることができません。パラメータは調べ...続きを読む

Aベストアンサー

 ResultSetオブジェクトは、行が無くてもnullにはなりませぬ。つまり、「結果が1行も無いResultSetオブジェクト」になります。

 Java2 1.4.2 APIを参照しても、Returnsに「never null」と名言されています。

 なので行があるかないかは、ResultSet.next()やResultSet.getRow()で判断します。または
SELECT Count(email) FROM customer where email='"+email+"'AND password='"+password+"'"
というSQL文で、最初の行の最初のフィールドが0であれば存在しないという判断になるかと思います。

Qデータ数をカウントしたいのですが

JAVAのJDBCを使いMySqlを操作しデータ数を取得するプログラムです。自分なりに考えたプログラムは
Connection con = null;
String sql = "select count(*) from テーブル名";

// コネクションを作成する。
con = DriverManager.getConnection(url, user, pass);
Statement st = con.createStatement();

// SQLを実行する。
ResultSet rs = st.executeQuery(sql);
String count = rs.getString("count(*)");

実行した結果上手く出来ないのですが、この部分での間違いはありますか?

Aベストアンサー

どう上手くいかないのかエラーメッセージなどがあると分かりやすいのですが・・・とりあえず、count(*)というカラム名は取得できなかったと思います。

sqlを
select count(*) as cnt from テーブル名
にして、

値を取得する部分を
String coung = rs.getString("cnt");
にしてみてください。
もしくはsqlはそのままで、
rs.getString(1)
で1番目のカラムが取得できます。
(カラム名が固定なら最初のやりかたの方が分かりやすいと思います。)

QgetStringの値がNULLの時の処理

DB:SQL Server 2005
JDBCを使ってデータベースへアクセスし、SQL発行して結果をResultsetに格納、getStringで各項目の値を取得するところまでは確認できています。

外部結合したテーブルを参照していおり、getString()でnullを取得した場合にjava.lang.NullPointerExceptionが返ってエラーとなってしまいます。

回避策はあるのでしょうか?
抜粋したソースを下記に記します。

-- test.jsp --
<%
ResultSet rs = db.executeQuery(sql);
while(rs.next()){
String disp_object = rs.getString("object");
if(disp_object == null) disp_object="---";
}
%>
<tr>Object</tr>
<tr><%=disp_object%></tr>

Aベストアンサー

<%
ResultSet rs = db.executeQuery(sql);
String disp_object = "---";
while(rs.next()){
disp_object = rs.getString("object");
if (disp_object == null) {
disp_object = "---";
}
}
%>
<tr>Object</tr>
<tr><%=disp_object%></tr>

これでどうです?
※ ProKaseifuさんの回答にある記述でも
NullPointerは発生しないような気もしますが・・・?

Qデータベースから取得したデータを配列に格納できません。

jTableにSQL文の結果を表示させようとして結果を以下のように配列に
格納しようとしました。

public String[][] Serch(){

int i=0;
String[][] rowData;
String str = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=helloTable.mdb";

try {
// ドライバクラスをロード
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// データベースへ接続
Connection con = DriverManager.getConnection(str, "", "");
// ステートメントオブジェクトを生成
Statement stmt = con.createStatement();

String sql = "SELECT * FROM ハローテーブル";

ResultSet rs = stmt.executeQuery(sql);

while(rs.next()){

// NOを取得
String no = String.valueOf(rs.getInt("NO"));
// 言語を取得
String lang = rs.getString("言語");
// メッセージを取得
String msg = rs.getString("メッセージ");

rowData[i][0] = no;
rowData[i][1] = lang;
rowData[i][2] = msg;
i++;
}
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return rowData;
}
このメソッドで得た配列を表示させようとすると以下の結果が表示されます。

java.lang.NullPointerException

正常なSQL文の結果は以下の通りです。
1 日本語 こんにちは世界
2 英語 Hello World
3 ドイツ語 Hallo Welt

配列の行数はSQL文の結果の行数に合わせたかったのですがうまくいきません。
どのように直せばSQL文の結果を配列にすべて格納できるでしょうか?

jTableにSQL文の結果を表示させようとして結果を以下のように配列に
格納しようとしました。

public String[][] Serch(){

int i=0;
String[][] rowData;
String str = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=helloTable.mdb";

try {
// ドライバクラスをロード
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// データベースへ接続
Connection con = DriverManager.getConnection(str, "", "");
// ステートメント...続きを読む

Aベストアンサー

rowDataを初期化してください。
VectorやListも使うと楽になるかもしれませんよ。

QResultSetインターフェイスでの next() の使い方

データベースからSQLをつかって受注件数を取得したい時に、なぜ、下記のように next() をしなければいけないのかが分かりません。
初心者なので、出来ましたら詳しく教えてください。
お願いします。

int count = 0 ;
Statement stmt = con.createStatement() ;
String sql = "select count(*) from 受注" ;
ResultSet res = stmt.executeQuery(sql) ;

if (res.next()) {
count = res.getInt(1) ;
}

Aベストアンサー

 このソースのselect文ではたまたまcount()関数の結果を得ていますので、その値は必ず1個の整数になります。

 しかし、条件に合うレコードを抽出するようなselect文では、結果は1個とは限りません。このような場合のためにnext()メソッドが必要になります。(参考URL)

参考URL:http://www.atmarkit.co.jp/fjava/rensai/jdbc02/jdbc02.html

Qservletからjspへオブジェクトの配列情報を送る方法

いつもお世話になっております。echo2002です。

さて、今回は以下のような処理を行いたいのですが、可能なのでしょうか?
”servletで作成したオブジェクトの配列をjspにforwardして表示させる”

こんなような処理を考えています。

構成:FileListServletクラス, FileInfomationクラス, disp.jsp

FileInfomationクラスではファイル名やファイルサイズなどの情報を持ち、
それぞれgetなどのアクセサメソッドを持つとします。

FileListServletクラスでの処理
FileInfomationクラスの配列を作成し、各情報をsetする。
HttpServletRequestにsetAttributeでFileInfomation情報を付加し、
disp.jspへforwardする。

※以下の方法を考えています。
request.setAttribute("fileinfo1", fileinfo[0]);
request.setAttribute("fileinfo2", fileinfo[1]);
request.setAttribute("fileinfo3", fileinfo[2]);
・・・
(配列でsetAttributeできるのかわからなかったので、
 とにかくファイルの数分setAttributeしてみました)

getServletContext().getRequestDispatcher("/disp.jsp").forward(req, res)

わからないこと:
disp.jspでどのようにFileInfomationの情報を取得し、
内容を参照できるのかがよくわからないのです。
jspの暗黙オブジェクトrequestを使用して、request.getParameterをすると、
返ってくる値がStringのようなので、FileInfomationクラスにならないんですよね?

突っ込みどころ満載の質問かと思いますが、何かアドバイス頂ければと思います。
オブジェクトの配列をsetAttributeしてjspで読み出せる方法があれば、
それもご教授いただけますでしょうか。
よろしくお願いいたします。jsp難しいです・・・。

いつもお世話になっております。echo2002です。

さて、今回は以下のような処理を行いたいのですが、可能なのでしょうか?
”servletで作成したオブジェクトの配列をjspにforwardして表示させる”

こんなような処理を考えています。

構成:FileListServletクラス, FileInfomationクラス, disp.jsp

FileInfomationクラスではファイル名やファイルサイズなどの情報を持ち、
それぞれgetなどのアクセサメソッドを持つとします。

FileListServletクラスでの処理
FileInfomationクラスの配列を作成し、...続きを読む

Aベストアンサー

setなんちゃらメソッドで値を設定したら、getなんちゃらメソッドを呼べば良かったのです。つまり、set/get以下が同名のメソッド同士をセットで使えば良いのです。
今回の場合は、getAttributeメソッドですね。
戻り値はObjectですがこれはキャストすれば良いのです。
FileInfomation 変数 = (FileInfomation)request.getAttribute("fileinfo1");
てな具合です。

なお、getParameterメソッドは、クライアント(ブラウザ)から送信されたパラメータを取得するメソッドです。

さて、話を次の段階に進めて、配列を受け渡しできるか?となりますが、、できます。
サーブレット側で、
request.setAttribute("キー文字列", fileinfo);
として、JSP側で、
FileInfomation[] 変数 = (FileInfomation[])request.getAttribute("キー文字列");
とすれば、良いのです。

QEclipseでのJDBCドライバについて

Eclipse3.1でデータベース(mysql)にアクセスするプログラムを作ったのですが下記のエラーが出ます。

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

これはJDBCドライバのセットアップがうまく出来ていないからなのでしょうか?
またEclipseでは、~.jarというファイルをプロジェクトのWEB-INFのlibフォルダに入れれば使える印象があるのですが、参考書(EclipseのではなくJAVAなどの)などにあるようにTomcatのインストールフォルダ以下common/libに入れて環境変数を変更しないといけないのでしょうか?

ご存知の方教えてください、よろしくお願いします。

Aベストアンサー

WEB-INF以下に入れると実行はできるのですが、エクリプスが.javaファイルをコンパイルすることができません。projectの一覧を右クリックしてpropertyを選択し、ダイアログ右側からJava Build Pathを選択し、タグからLibrariesを選び、Add JARsボタンをおして.jarファイルを登録して下さい。
たぶんこれでコンパイルできるはずです。

Qequalsの逆

javaで、文字列の場合は比較演算子の「==」は用いずに

if ((str1.getText()).equals(str2)){
(※…str1,2は文字列)

と書きますよね?
この逆で、文字列str1とstr2は等しくないとき、にはif以下の条件文をどのように書けばよいでしょうか?

Aベストアンサー

>if !((str1.getText()).equals(str2)){

あくまで
if(){
}


!(str1.getText()).equals(str2)
が入っているので
if !((str1.getText()).equals(str2)){
じゃなくて
if (!(str1.getText()).equals(str2)){
こう。

Qレコード件数の表示

夜分失礼します。
上記内容について教えてください。
今JAVAを用いてレコード件数(200件)を表示させようとしています。
しかし、レコードセットの表示方法しか知らず、またレコード件数をPHPで表示させる方法くらいしか検索できませんでした。どこがいけないか指摘してください。
以下にコア部分を書きます。

// ドライバクラスをロード
Class.forName("org.gjt.mm.mysql.Driver");
// データベースへ接続
String url = "jdbc:mysql://localhost:3306/db";
con = DriverManager.getConnection(url,"root","**********")
stmt2 = con.createStatement();
strQuery2 = " select count(*) AS RecordNums from ********** ";
ResultSet rs2 = stmt2.executeQuery( strQuery2 );
SumNo = rs2.getFetchSize();

どうしてもSumNo=0となってしまいます。

夜分失礼します。
上記内容について教えてください。
今JAVAを用いてレコード件数(200件)を表示させようとしています。
しかし、レコードセットの表示方法しか知らず、またレコード件数をPHPで表示させる方法くらいしか検索できませんでした。どこがいけないか指摘してください。
以下にコア部分を書きます。

// ドライバクラスをロード
Class.forName("org.gjt.mm.mysql.Driver");
// データベースへ接続
String url = "jdbc:mysql://localhost:3306/db";
con = DriverManager.getConnect...続きを読む

Aベストアンサー

>「java.sql.SQLException: Before start of result set SQL 」
>というエラーが出ました。
>このエラーは何を表しているのでしょうか??(・_・?)

ResultSetのURLを見てもらうと書いていますが、「初期状態では、カーソルは~」という理由で
getInt(int columnIndex) メソッドを呼び出す前に
next() メソッドを呼び出す必要があります。

つまり、

Connection con =DriverManager.getConnection(~);
Statement stmt = con.createStatement();
String sql="";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
int int_a = rs.getInt(~);
String str_a = rs.getString(~);
String str_b = rs.getString(~);
}
stmt.close();
con.close();

という使い方がDBへアクセスするときのひとつの流れです。(select文の結果を全て表示したいときですが)



>「public int getInt(int columnIndex)」
>この宣言はするべきなのでしょうか?
>これを追加すると(public int getInt;)ここがエラーになります。
どのクラスに定義しようとしていて、どんなエラーが出たのかよくわからないのでなんともいえませんが、インターフェースResultSetにはこのメソッドがすでに定義されているので、あなたがResultSetをimplementsしたクラスを作ろうとしているのならともかく、ResultSetをimplementsしたクラスを使うだけならこのメソッドを定義する必要はありません。


ところで、改行の問題はうまくいったんですか?

>「java.sql.SQLException: Before start of result set SQL 」
>というエラーが出ました。
>このエラーは何を表しているのでしょうか??(・_・?)

ResultSetのURLを見てもらうと書いていますが、「初期状態では、カーソルは~」という理由で
getInt(int columnIndex) メソッドを呼び出す前に
next() メソッドを呼び出す必要があります。

つまり、

Connection con =DriverManager.getConnection(~);
Statement stmt = con.createStatement();
String sql="";
ResultSet rs = stmt.executeQ...続きを読む

Qデータベースに変数の値を挿入

 HTMLのフォームから、getParameterで取得した値(id,name,club)をデータベースに挿入したいのですが、
String sql="insert into test_table values(id,name,club)";
 と記述してもその文字列がそのままテーブルに反映されてしまいます。
 もちろん、
String sql="insert into test_table values('12','●田○郎','野球部')";
とあらかじめ記述しておけばこのデータがテーブルに挿入されるのですが・・・。
 PHPでは確かvalues('{$id}','{$name}','{$club}')のように記述すればできたので戸惑っています。
 JAVAでSQL文に変数を含める場合、どのように記述すればいいのでしょうか?

Aベストアンサー

String sql="insert into test_table values(" + id + "," + name + "," + club + ")";

でいけます。
""で括られている中は文字列なので、変数として扱いたければ文字列の外に出せば良いだけです。
id、name、clubが文字型であるなら、↓のようにシングルクォートで括りましょう。

String sql="insert into test_table values('" + id + "','" + name + "','" + club + "')";


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング