• ベストアンサー

JAVA(JDBC)の検索について

noname#3852の回答

  • ベストアンサー
noname#3852
noname#3852
回答No.1

telさん、こんにちは。 話を整理します。HTML うんぬんはとりあえず置いて、検索結果0の判断を先にします。 SQL文の生成はできているようですので、次にDBに問い合わせます。 データベースに接続して、ステートメント(java.sql.Statement のオブジェクト)を取得するところまでは、できていると仮定して(この仮定が成り立っていない場合は、参考URLを参照してください。AccessならODBC接続になるとおもいますが、参考URLページ中程にあるリンク「JDBC-ODBC ブリッジドライバ」を参照した方がいいでしょう)、 クエリー発行は、Statement クラスの executeQuery メソッドを使用します。 このメソッドは、検索結果が0件であろうとなかろうと結果セット(java.sql.ResultSet のオブジェクト)を戻します。 この ResultSet から結果の値を取得するには、 next() メソッドを使って次の行があるか判断して、1レコードずつデータを取得していきます。ResultSet にはカーソルと言う概念があって、最初先頭レコードの手前にあります。next() メソッドが呼び出されるたびに、次の行があるか判断し、あればカーソルを次の行に移動して true を、なければなにもせず false を戻します。 このことから、もし件数が0件の場合、最初の next() メソッド呼び出しで false が戻されるわけです。 ここまでの話をまとめるとこんな感じです。 import java.sql.* ; (中略) Connection con = コネクションの取得 ; // ステートメントを取得 Statement st = con.createStatement( ) ; // クエリー発行、結果セットの取得 ResultSet rs = st.executeQuery( SQL文文字列 ) ; // 件数カウンタ int count = 0 ; while ( rs.next() ) {   count++ ; // カウントアップ   ResultSet のget系メソッドの呼び出し } if ( count == 0 ) {   ヒットなしです } else {   ヒットありです } ここまでで何とか件数が0件か否かまでは分かるとして、次に画面遷移ですが、 HTML の話が出ているの Servlet 上での処理だとします。 doPostメソッドでも、doGetメソッドでもかまわないですが、引数に javax.servlet.http.HttpServletRequest があります。 この HttpServletRequest には(正確には親の javax.servlet.ServletRequest) getRequestDispatcher メソッドがあって、javax.servlet.RequestDispatcher を取得できます(これが何なのかは省略)。 RequestDispatcher にfoward メソッドがあってこれを呼ぶと、あらかじめ指定したパスに遷移します。 こんな感じです。 // doPostメソッドかも protected void doGet(HttpServletRequest req, HttpServletResponse resp)     throws ServletException, java.io.IOException {   (中略)   RequestDispatcher disp = req.getRequestDispatcher( 移動先のパス ) ;   disp.forward( req, resp ) ; } これらを組み合わせるとこんな感じですかね。 protected void doGet(HttpServletRequest req, HttpServletResponse resp)     throws ServletException, java.io.IOException {   (中略)   // クエリー発行、結果セットの取得   ResultSet rs = st.executeQuery( SQL文文字列 ) ;   // 件数カウンタ   int count = 0 ;   while ( rs.next() ) {     count++ ; // カウントアップ     ResultSet のget系メソッドの呼び出し   }   // ヒットなし   if ( count == 0 ) {     RequestDispatcher disp = req.getRequestDispatcher( エラーページ・パス ) ;     disp.forward( req, resp ) ;     return ;   }   以降、通常の処理 } 以上で題意を満たすとは思います。 データベース接続で、例外処理やclose処理を含めていないなど、一部欠けている点はありますが、それは今回の本筋と離れるので省略しています。 詳しくは書籍やwebなどで探ってください。 JDBCに関しては以下のURLが標準的な内容理解にはいいと思います。

参考URL:
http://java.sun.com/j2se/1.3/ja/docs/ja/guide/jdbc/index.html

関連するQ&A

  • Servler検索。

    htmlから検索の値を、Servletで受け止めて、Accessのデータから検索するのですが、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=190832  のログの内容では、 String s ="SELECT * FROM TABLE(テーブル名) WHERE Name(フィールド名)      ='"+htmlvalue(HTMLからの検索の値)+"'"; は、指定された、フィールドの中で検索をしていますが、 では、テーブル全体からの検索で、なおかつ、1文字で検索できるでしょうか? 例えば...  氏 名  | 住 所 ---------------------------------------- 鈴木一郎 | 東京都新宿区×△ー× ---------------------------------------- 山田花子 | 神奈川県川崎市中原区○△ー× ---------------------------------------- 東 太朗 | 神奈川県横浜市中区○×ー△ のような Access のテーブルから、『東』と検索をかけて、 検索結果が、  氏 名  | 住 所 ---------------------------------------- 鈴木一郎 | 東京都新宿区×△ー× ---------------------------------------- 東 太朗 | 神奈川県横浜市中区○×ー△ としたいのです。 結果の受け取り等は、わかるのですが、検索のServletの処理がわかりかねています。 指摘、助言宜しくお願いします。

    • ベストアンサー
    • Java
  • SQL:TIMESTAMPの期間検索を指定するには?

    教えてください。 SQL文で日付期間の検索をしたいです。 フィールド名:tran_dataの値が、 2004/09/01 ~ 2004/09/03 のデータを検索したい。 データはTIMESTAMPで取得されています。 テーブル名:dat_history 【失敗例】 select * from web.dat_history where tran_date = '2004-08-18' 【エラーメッセージ】 日付値のストリング表記が間違っています。

  • MySQL WHERE句のLIKE検索

    初心者ですみません。 MySQL WHERE句のLIKE検索で、引っかかった文字列を 除いた項目を表示させるにはどうしたらいいでしょうか。 例えば、 SELECT * from [テーブル名] where [フィールド名] like '%あ%'; として、「あ」が入っているレコードを検索し、 該当しないレコードを表示させる。 どうか教えてください。よろしくお願いします。

  • アクセス(Access)のサブクエリについて

    したいこと  「test」という変数に格納された社員名から「社員名テーブル」の「s_n」フイールドを検索して対応する「社員ID」を取得します.  当該「社員ID」に一致する「行先情報」テーブルにある「行先」,「帰社予定時刻」フールドを最終的に取得したい 現象 VBでアクセスの下記サブクエリを発行しているのですが,「1つ以上の必要なパラメータの値が設定されていません」というエラーが出てしまいます StrSQL_1 = _ "Select 行先, 帰社予定時刻 From 行先情報 " & _ " Where 社員ID = " & _ "(Select 社員ID from 社員名テーブル where " & test & " = s_n)" SQL文を分割してテストしたところ(select...& test & ...)の部分でのみエラーが発生します,ヘルプなどを調べるとフイールド名が間違っているときに出るエラーとのことなので再確認等してみましたが解決できません,なにが間違っているのかを教えていただけないでしょうか. よろしくお願いいたします.

  • jspでMysql検索で困っています。

    jspでMysql検索で困っています、 コマンド画面で下記の入力をすると条件の検索が出来ます。 select * from kanagawa where fish like '%コイ%'; (8件中検索されるのは1件でそれが表示されます) jspで命令すると、違う結果が返されてきます。 String sql; sql="select * from kanagawa where fish like '%コイ%'"; ResultSet rs=db.executeQuery(sql); 最初は変数でテーブル名等受け取っていたのですがうまくいかなかったので直接検索文を入れたのですが結果は同じく違う物が検索されてしまいます。(fishのフィールド8件中5件が結果としてでます。) 何を調べても間違いなさそうですが・・ どうにもならず困っています、助けてください、お願いします。

  • MySQLで期間指定でキーワード検索するには?

    PHPでMySQLを利用し開発を行っています。 検索ボックスにキーワードを入力して検索をしたいのですが、期間を指定して検索できるようにする方法が分かりません。 さらに1ページに五件ずつ表示するようにしています。 下記はキーワード検索として動いているプログラムです。 例は2つのフィールドから検索しています。 SELECT * FROM テーブル名 WHERE フィールド名1 LIKE '%$search%' OR フィールド名2 LIKE '%$search%' LIMIT 0, 5; これに BETWEEN 期間1 AND 期間2  を追加して完成させようと思っているのですが、 どうも上手くいかないので、どのように書けばよいか教えて下さい。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • アクセス2003で検索条件と検索キーワード検索

    アクセス2003で検索機能を作りたいです。 まずプルダウンで検索条件を選び、さらに検索キーワードを手入力し、その条件に見合ったものを抽出するという形。 検索条件とは、フィールド名。検索キーワードは、フィールドの中にある言葉。 質問 (1)マクロのフィルタの実行のwhere条件式において 〔フィールド名〕like~と入れているのですが、この頭のフィールド名をいじくれば良いのか? (2)ある識者に伺ったところ、次のVBA(イベントビルダ)を教わりましたが、オブジェクトに値を代入できませんと出てきました。 Me.filter=""&Me.![テキスト名1]&"like'"&"*"&Me![テキスト名2]&"*"&"'" Me.filterOn=True このテキスト名1をコンボに変更しました(非連結)。検索条件となるあるテーブルを値ソースとしています。何か自分が間違っていますか? できれば、クエリを使うことなく行きたい。 アクセスのつくりとしては、 基幹となるテーブルAとそれに1対多にあるテーブルBそしてテーブルBと1対1にあるテーブルCの3つをクエリを用いて1つのフォームに表しています。 その中のいくつかのフィールドを選択条件とし(プルダウンで選ぶ)、キーワード入力する。 小職、アクセスを始めたばかりです。どうかよろしくお願いいたします

  • JDBCでテーブルUPDATE後の再検索でエラー

    お世話になります。 ORACLEでUPDATEに失敗(抽出条件に一致するレコード無し)した後、同一テーブルのレコードを再検索するとSQLExceptionが発生してしまいます。原因、対策をご存知の方がおられましたら、ご教授ください。よろしくお願い致します。 (1)table_1からFieldAの値を取得する。(ここでは"001"だったとする) select FieldA from table_1 where FieldB='XXX'; (2)FieldAから取得した値を変更する("001"から"002"に変更) その他諸々の業務処理を行う (3)update table_1 set FieldA='002' where FieldB='XXX' and FieldA='001'; (4)更新がOKだったら処理終了。 (5)同一レコードのFieldAの値を他のプロセスが既に更新済みだった場合、update件数が0となるので、 (1)からリトライを行う。 ⇒この時、(1)の再検索でResultsetのexecuteQueryの後、next()メソッドで「ORA-01002: フェッチ順序が無効です。」となってしまいます。

  • MySQL 複合検索条件

    MySQLでひとつのテーブルの複数フィールドに値を設定してレコードを参照したい。 例えば、key-field-1 >= ??? と key-field-2 >= ???で key-field-1は主キーでkey-field-2は従属キーとし、key-field-1の条件に合うレコードで、次にkey-field-2の条件に合うレコードを見つけ、それ以降の全てのレコードを抽出したい。 select * from table-1 where key-field-1 >= ??? and key-field-2 >= ??? で検索すると 両方の条件を満たすレコードのみ検索される。 アドバイスを待っています。

  • MySQLで日本語検索

    MySQL初心者のものです。 今PHPとMySQLを利用して検索システムを作っています。 しかし日本語検索がどうしてもうまくいきません。 一応「教えてgoo」でも探してみたのですが、解決しませんでした。 MySQLで、 テーブル名 table フィールド名 field とすると、 select * from table where field like '%キーワード%'; のように検索してみたのですが、思うような結果が返ってきません。 ネットで検索すると「senna」をインストールと書かれていましたが、 そういったものをインストールしなければMySQLで日本語検索は出来ないものなのでしょうか? ちなみに MySQL5.0 PHP5.2.1 を利用しています。