JSPとSQLの連結したページ

このQ&Aのポイント
  • <%@ page import="java.sql.*" %> パラメータの取得 String keyword = request.getParameter("keyword"); ドライバーのロード Class.forName("com.mysql.jdbc.Driver"); DBに接続 String url = "jdbc:mysql://localhost/java4z?useUnicode=true&characterEncoding=MS932"; String user = "root"; String pass = ""; Connection con = DriverManager.getConnection(url,user,pass); SQL発行先ほど指定したConnection con を利用 Statement stmt = con.createStatement(); String sql = "select * from shop where name like '%" + keyword + "%' or author like '%" + keyword + "%' ; ResultSet rs = stmt.executeQuery(sql);
  • JSPとMySQLの連動したページを作成しています。お使いのJSPファイルでは、指定されたキーワードで商品の名前や著者を検索し、それに一致する商品を表示しています。さらに、価格範囲を指定してデータを検索し、表示することもできます。しかし、"select * from shop where name like '%" + keyword + "%' or author like '%" + keyword + "%' ;"の部分のSQL文をどのように記述すれば良いかわかりません。
  • JSPとSQLを連結して、指定されたキーワードで商品を検索し表示するページを作成しています。さらに、価格範囲を指定してデータを検索する機能も追加しています。しかし、SQL文の一部を記述することができません。
回答を見る
  • ベストアンサー

jspとsqlの連結したページ

<%@ page import="java.sql.*" %> <% //パラメータの取得 String keyword = request.getParameter("keyword"); //ドライバーのロード Class.forName("com.mysql.jdbc.Driver"); //DBに接続 String url = "jdbc:mysql://localhost/java4z?useUnicode=true&characterEncoding=MS932"; String user = "root"; String pass = ""; Connection con = DriverManager.getConnection(url,user,pass); //SQL発行先ほど指定したConnection con を利用 Statement stmt = con.createStatement(); String sql = "select * from shop where name like '%" + keyword + "%' or author like '%" + keyword + "%' ; ResultSet rs = stmt.executeQuery(sql);%> jspとmysqlの連動したページを作っているのですが select count(*) from テーブル名;を使い 件数を表示(XX件目など)させたいのです さらに値段からXX円以上からXX円以下なども データから検索し表示させたいのですが String sql = "select * from shop where name like '%" + keyword + "%' or author like '%" + keyword + "%' ;の部分をどのように記述すればよいか 解かりません! どなたかお願いします☆()

  • MySQL
  • 回答数4
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • sakuhat
  • ベストアンサー率61% (11/18)
回答No.2

取得したデータ数を知りたいのですよね? http://www.gimlay.org/~javafaq/S135.html こちらの「java.sql.ResultSetで取得したデータの数を得たいのですが?」で 3通りの方法が紹介されています。

参考URL:
http://www.gimlay.org/~javafaq/S135.html
nilyannko
質問者

補足

Connection con = DriverManager.getConnection(url,user,pass); //SQL発行先ほど指定したConnection con を利用 Statement stmt = con.createStatement(); //String sql = "select * from shop where name like '%" + keyword + "%' or author like '%" + keyword + "%'"; ResultSet rs = stmt.executeQuery("select * from shop where name like '%" + keyword + "%' or author like '%" + keyword + "%'"); rs.next(); // 行数を取得する。 int count = rs.getInt(1); としたのですが java.lang.NumberFormatException: null と言ったエラーが出ます(泣 朝まで粘ってたんですが。力尽きそうです(泣

その他の回答 (3)

  • sakuhat
  • ベストアンサー率61% (11/18)
回答No.4

beforeFirstでResultSetのカーソルを元に戻さないとダメです。

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/sql/ResultSet.html
nilyannko
質問者

お礼

sakuhatさんありがとうございます!! できました☆ こんな便利なメソッドがあったとは。。 全く違う方法でやろうとしてました(泣 本当に感謝しています! ありがとうございました。

  • sakuhat
  • ベストアンサー率61% (11/18)
回答No.3

2番目の方法を使っているようですが 2番目はSQL文でCOUNTを使わなければなりませんし、 この方法は行数だけしか取得できません。 while文使って数えるか、last()で最終行まで行ってgetRow()で 現在何行目か取得する方法でいけると思います。

nilyannko
質問者

補足

できました!!昨日あれだけできなかったのに(笑 ただ、、ひとつだけ問題があるのですwhile(rs.next()) を使うと下に表が表示されないのです。 rsと言う変数を下の表が読み取っていないみたいです どうしたらよいでしょうか? 何度もすみません 自分でも色々試して見ます。 Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); String sql = "select * from shop where name like '%" + keyword + "%' or author like '%" + keyword + "%'"; ResultSet rs = stmt.executeQuery(sql); int count = 0; while(rs.next()) { count++; } %> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> title>書籍検索2</title></head><body> <jsp:include page="header1.html" /> 「<%= keyword %>」の検索結果 「<%= count %>」件見つかりました <table border="1" cellpadding="8"> <tr><th>ID</th><th>イメージ</th><th>書名</th><th>値段</th><th>著者</th><th>出版社</th><th>ジャンル</th><th>カテゴリー</th></tr> <% //結果の表示 while(rs.next()){ //列名を指定してResultSetから値を取得する int id = rs.getInt("id"); String image = rs.getString("image"); String name = rs.getString("name"); int price = rs.getInt("price"); String author = rs.getString("author"); String publish = rs.getString("publish"); String genre = rs.getString("genre"); String kind = rs.getString("kind"); %> <tr> <td><%= id %></td> <td><img src="img/<%= image %>"</td> <td><%= name %></td> <td><%= price %></td> <td><%= author %></td> <td><%= publish %></td> <td><%= genre %></td> <td><%= kind %></td> </tr> <% } con.close(); %> </table> </body> </html>

回答No.1

まずjspとsqlがごっちゃになっているようですね。今回の質問はsqlの質問ですのでjsp云々は関係ありません。mysqlはsqlという文法で書かれた命令を実行します。このsqlをjspで作成しているに過ぎないので、まずは必要なsqlを考えて、それを生成するコードをjspで書く、という流れになります。ここを別けて考えないと後々混乱しますよ。ちなみにjspはわからないのでsqlに関する事だけ。 まず値段に関してですが、low以上high以下をsqlで表現すると'値段フィールド between low and high'になります。これをwhere句に追加して下さい。 件数表示ですが、これはこのsqlを実行した後、マッチしたデータの件数を知りたいという事ですか?これはもしかしたらjspに「直前に実行したsqlの行数を得る」という関数があるんじゃないかな。調べてみて下さい。

nilyannko
質問者

補足

文字数の関係で書けなかったのですが MYSQLにデータは登録してあります。 drop table if exists shop; create table shop ( id   int auto_increment primary key, image varchar(40), name varchar(130), price int, author varchar(30), publish  varchar(30), genre varchar(30), kind varchar(30) ); insert into shop values(null,'~~~.jpg','タイトル~~,2520,'著者~~ ','出版社~~','~~','~~' );と30個くらいデータを入れて、TOMCATを起動してjspファイルを表示させてキーワードを入力して検索ボタンを押すとデータから検索したりできるところまでは完成しています。

関連するQ&A

  • JSPで複数のSQL実行について教えて下さい

    JSPで複数のSQLを実行したいと思い、作ってみましたがページが全く表示されません。 SQL分が違う気がするのですがどこが悪いのか分りません。 ご教示下さいませ。ソースのせます。 <%@page contentType="text/html; charset=Windows-31J"%> <%@page import="java.sql.*"%> <%! // サーブレットのinitメソッドに相当 public void jspInit() { try { // JDBCドライバをロード Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); } catch (Exception e) { e.printStackTrace(); } } %> <HTML> <HEAD> <TITLE>結果</TITLE></HEAD> <BODY> <CENTER> <B>結果</B> <TABLE border="3"> <TR> <TD>年齢</TD> <TD>氏名</TD> </TR> <% // データベースへのアクセス開始 Connection con = null; Statement stmt = null; ResultSet rs = null; try { // データベースに接続するConnectionオブジェクトの取得 con = DriverManager.getConnection("jdbc:sqlserver:ServerName;DatabaseName=Name","ID","PW"); // データベース操作を行うためのStatementオブジェクトの取得 stmt = con.createStatement(); if (request.getParameter("buttonA") != null) { // テキストボックスの値を取得 String paramA = request.getParameter("NamA"); // SQL()を実行して、結果を得る rs = stmt.executeQuery("SELECT * FROM TABLE_A where 年齢='"+ paramA +"'"); rs = stmt.executeQuery("SELECT * FROM TABLE_B where 年齢='"+ paramA +"'"); } if (request.getParameter("buttonB") != null) { // テキストボックスの値を取得 String param = request.getParameter("NamB"); // getParameterの値を文字列へ変換 String paramB = new String(param.getBytes("ISO-8859-1"),"Shift_JIS"); rs = stmt.executeQuery("SELECT * FROM TABLE_A where 氏名 like '%"+ paramB +"%'"); rs = stmt.executeQuery("SELECT * FROM TABLE_B where 氏名 like '%"+ paramB +"%'"); } // 得られた結果をレコードごとに表示 while (rs.next()){ String year = rs.getString("年齢"); String name = rs.getString("氏名"); %> <TR> <FORM method="post" action="Next.jsp"> <TD><%= year %></TD> <TD><%= name %></TD> </form> </TD> </TR> <% } } catch (Exception e) { e.printStackTrace(); // エラー表示プログラム out.write(e.getMessage()); } finally { // データベースとの接続をクローズ try { rs.close(); } catch (Exception e) {} try { stmt.close(); } catch (Exception e) {} try { con.close(); } catch (Exception e) {} } %> </TABLE> </BODY> </HTML>

    • ベストアンサー
    • Java
  • jspのエラー

    <%@ page contentType="text/html; charset=UTF-8" import="java.io.*, java.sql.*" %> <% Class.forName("com.mysql.jdbc.Driver"); Connection con=DriverManager.getConnection("jdbc:mysql://localhost/database1?user=user1&password=password1&useUnicode=true&characterEncoding=UTF-8"); Statement stmt=con.createStatement(); ResultSet result=stmt.executeQuery("select * from table1;"); %> <table> <tr> <th>country</th> <th>city</th> </tr> <% while(result.next()) { %> <tr> <td> <%= result.getString(1) %></td> <td> <%= result.getString(2) %></td> </tr> <% } stmt.close(); con.close(); %> </table> でエラーがでてデータベースに接続できません メッセージは以下の通りです org.apache.jasper.JasperException: Exception in JSP: /gomitable1.jsp:12 11: Class.forName("com.mysql.jdbc.Driver"); 12: Connection con=DriverManager.getConnection("jdbc:mysql://localhost/database1?user=user1&password=password1&useUnicode=true&characterEncoding=UTF-8"); 13: Statement stmt=con.createStatement(); 14: ResultSet result=stmt.executeQuery("select * from table1;"); 15: %> 原因 javax.servlet.ServletException: Error during query: Unexpected Exception: java.io.CharConversionException message given: null このメッセージの意味もわかりません 何が悪いのでしょうか?

    • ベストアンサー
    • Java
  • データ数をカウントしたいのですが

    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(*)"); 実行した結果上手く出来ないのですが、この部分での間違いはありますか?

    • ベストアンサー
    • Java
  • JListに一覧にして表示

    データベースから取得した結果を JListに一覧にして表示させたいのですが、 list.setText(table);の部分の setTextメソッドでシンボルが見つけられないと エラーが出てしまいます。 JListにsetTextを使っているからなのだと思いますが、 APIを探したのですがなかなかわかりません どう対処したらよいでしょうか?? private Connection connect() throws Exception{ Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost/???"; String user = "root"; String pass = ""; Connection con = DriverManager.getConnection(url,user,pass); return con; } Bookmark(){ JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.addTab("表示", createPanel1()); } private JPanel createPanel1(){ JPanel p = new JPanel(); JList list = new JList(); JScrollPane scrollPane = new JScrollPane(); scrollPane.getViewport().setView(list); scrollPane.setPreferredSize(new Dimension(480, 340)); p.add(scrollPane); try{ //DBに接続 Connection con = connect(); //SQL発行先ほど指定したConnection con を利用 Statement stmt = con.createStatement(); String sql ="select * from Browser"; ResultSet rs = stmt.executeQuery(sql); //結果の取得 while(rs.next()){ String name = rs.getString("name"); String address = rs.getString("address"); String table = "<html><table>" + "<td>" + name + "</td>"+ "<td>"+ address +"</td>"+ "</table></html>"; list.setText(table); } //切断 con.close(); } catch(Exception ex) { System.out.println(ex);

    • ベストアンサー
    • Java
  • パッケージ org.gjt.mm.mysqlは存在しません

    いつもお世話になっております。 javaから、sqlを操作するプログラムを作っているのですが、 コンパイル時に「パッケージ org.gjt.mm.mysqlは存在しません」と、 エラーが発生してしまいます。 ソースコード----------------------- import java.sql.*; import org.gjt.mm.mysql.Driver; public class HelloWorldJDBCMySQL { public static void main(String[] args) { String user = "password"; String pass = "password"; try { // ドライバクラスをロード // Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // ODBCの場合 Class.forName("org.gjt.mm.mysql.Driver"); // MySQLの場合 // データベースへ接続 // Connection con = // DriverManager.getConnection("jdbc:odbc:helloworld"); // ODBCの場合 // MySQLの場合 String url = "jdbc:mysql:///hellodb?useUnicode=true&characterEncoding=SJIS"; Connection con = DriverManager.getConnection(url,user,pass); // ステートメントオブジェクトを生成 Statement stmt = con.createStatement(); String sql = "SELECT * FROM test"; // クエリーを実行して結果セットを取得 ResultSet rs = stmt.executeQuery(sql); // 検索された行数分ループ while(rs.next()){ // nameを取得 String no = rs.getString("name"); // addressを取得 String lang = rs.getString("address"); // メッセージを取得 //String msg = rs.getString("MESSAGE"); // 表示 System.out.println(no + " " + lang ); } // データベースから切断 stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } } } ----------------------------------- 環境変数--------------------------- CLASSPATH .;C:\sample4\WEB-INF\lib\mysql-connector-java-5.1.12-bin.jar ----------------------------------- どなたか、ご教授いただけますでしょうか?

    • ベストアンサー
    • Java
  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • SQL キーワード検索にて

    お世話になります。 DBからSQLでキーワードによる検索をかけるときですが、 二つ以上のワードがあるときに、一つのキーワードがほかのキーワードと かぶってしまう場合、例えば゛、『あいうえお』と『いうえ』等で絞り込むと、 結果的に『あいうえお』が含まれるものだけが該当しますが、これを、 『あいうえお』を含み、更にそれ以外にも『いうえ』が含まれるものを 絞り込むには、どうすればよいでしょうか。 つまり、『あいうえお』のみしか含まれないものは該当しないようにする方法です。 現在のSQLは、 (SELECT * FROM xxxx WHERE tablename LIKE '%あいうえお%' AND tablename LIKE '%いうえ%') のような感じです。 使用しているDBは、MySQL、SQLiteです。 何卒よろしくお願いいたします。

  • JSPのIF文を教えて下さい

    こんばんわ。 JSPにてIF文を使ったDBテーブル表示のWEBを作成したのですが クローズの行でエラーが表示されてしまいます。 エラー内容は「型の開始が不正」ですというものです。 知識不足で恐縮ですがご教示願います。 <%@page contentType="text/html; charset=Windows-31J"%> <%@page import="java.sql.*"%> <%! // サーブレットのinitメソッドに相当 public void jspInit() { try { // JDBCドライバをロード Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); } catch (Exception e) { e.printStackTrace(); } } %> <HTML> <HEAD> <TITLE>一覧</TITLE></HEAD> <CENTER> <B>一覧</B> <TABLE border="3" BORDERCOLOR="#9999ff"> <TR> <TD>年齢</TD> <TD>電話番号</TD> </TR> String year = request.getParameter("年齢"); String namber = request.getParameter("電話番号"); <% // データベースへのアクセス開始 Connection con = null; Statement stmt = null; ResultSet rs = null; try { // データベースに接続するConnectionオブジェクトの取得 con = DriverManager.getConnection("jdbc:sqlserver://sqlserverName;DatabaseName=NAME","ID","PW"); // データベース操作を行うためのStatementオブジェクトの取得 stmt = con.createStatement(); if(year.length() >= 0){ %> // SQL()を実行して、結果を得る rs = stmt.executeQuery("SELECT * FROM テーブルA where 年齢='"+ paramA +"'"); rs = stmt.executeQuery("SELECT * FROM テーブルB where 年齢='"+ paramA +"'"); <% } else if(namber.length() >= 0){ %> rs = stmt.executeQuery("SELECT * FROM テーブルA where 電話番号='"+ paramC +"'"); rs = stmt.executeQuery("SELECT * FROM テーブルB where 電話番号='"+ paramC +"'"); <% } %> // 得られた結果をレコードごとに表示 while (rs.next()){ String aa = rs.getString("名前"); String bb = rs.getString("住所"); %> <TR bgcolor="#ccffcc"> <FORM method="post" action="Next.jsp"> <input type="hidden" name="num" value="<%= rs.getString("ID")%>"> <%-- 年齢フィールドの表示 --%> <TD><%= aa %></TD> <%-- 電話番号フィールドの表示 --%> <TD><%= bb %></TD> <TD align="center"> </form> </TD> </TR> <% } } catch (Exception e) { e.printStackTrace(); // エラー表示プログラム out.write(e.getMessage()); } finally { // データベースとの接続をクローズ try { rs.close(); } catch (Exception e) {} try { stmt.close(); } catch (Exception e) {} try { con.close(); } catch (Exception e) {} } %> </TABLE> </BODY> </HTML>

    • ベストアンサー
    • Java
  • 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への接続が出来ません

    まずは、サンプルプログラミングをコピーして実行してみましたが、上手くいきません。 package Connection; import java.sql.*; public class DBtest { public static void main(String[] args) { //java.sql Connection con = null; Statement stmt = null; ResultSet rs = null; String sqlStr; try { //ドライバクラスをロードする Class.forName("org.gjt.mm.mysql.Driver"); //MySQLに接続 con = DriverManager.getConnection("jdbc:mysql://localhost/dbname", "8080", "password"); //ステートメント生成 stmt = con.createStatement(); //SQL文 sqlStr = "SELECT * FROM TABLE"; //SQL文実行 rs = stmt.executeQuery(sqlStr); //検索結果数だけループ while(rs.next()){ //レコードの値 int id = rs.getInt("ID"); String name = rs.getString("NAME"); //表示 System.out.println(id + ":" + name); } //クローズ rs.close(); stmt.close(); con.close(); } catch (Exception ex) { try { //クローズ if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (con != null) con.close(); } catch (Exception e) { } //エラー ex.printStackTrace(); } } } 上記はEclipseでは文法エラーはありません。で実行してみると java.sql.SQLException: Access denied for user '8080'@'localhost' (using password: YES)になります。 サンプルにはDbname、ID,Passとあるので実際のDbnameとパスワードを入れているのですが駄目です。 IDは意味が良くわからないので8080を入れてみました。 どなたか教えて下さい。お願いします。 尚、当方全くの初心者です宜しくお願い致します。

    • ベストアンサー
    • Java