@taxin3922

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

データベースから思っている値を取得できません

現在、独学でJavaのWebアプリ開発を行っているプログラム初心者です。
Seihinchoice.javaサーブレットから入力した値("A200")を以下のコードから
String name = sdao.select(pp1);//問題あり
"A200"と出力されるようにしたいです。
しかし、現状はnullが帰ってきてしまいます。
また、エラーメッセージとして以下のメッセージが帰ってきます。
java.sql.SQLSyntaxErrorException: Unknown column 'A200' in 'where clause'

ProductDAO.javaからmysqlのカラム(ID)から該当する値("A200")を取得したいのですが
何か、問題がありそうな点をご教示頂けないでしょうか?
※初めての作成ということもあり、コードがとても汚いと思います。
 ご了承頂けますと幸いです。

開発環境
java
eclipse
apache-tomcat-9.0
mysql

自分で試したこと

1、データベースのパスが通ていなかったためクラスパスを通しました。
2、エラーの場所を特定するため、Seihinchoice.javaの変数のデータを一つずつ確認しました。//値問題なしとコメントしております。
3、javaのString型とmysqlのVARCHAR型の関係をネットで調べました。

発生している問題・エラー


java.sql.SQLSyntaxErrorException: Unknown column 'A200' in 'where clause'

Seihinchoice.java


import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import syoppingsaito.EtcNo;
import syoppingsaito.Product;

/**
 * Servlet implementation class Seihinchoice
 */
@WebServlet("/Seihin-choice")
public class Seihinchoice extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//レスポンスのコンテンツタイプおよびエンコーディング方式を指定
		request.setCharacterEncoding("UTF-8");
	    response.setContentType("text/html; charset=UTF-8");
	    String a =request.getParameter("idx1");//"入力は問題なし"
	    
	    //オブジェクト作成
	    Product ppp = new Product();
	    EtcNo etc = new EtcNo();
	    PorductDAO sdao = new PorductDAO();
	    
		//"A100が該当する数値を取得"
	    int ab = etc.etc(a);//値問題なし
        String pp1 = ppp.returnId(ab);//値問題なし
	    
	    //データベースのデータと比較
	    String name = sdao.select(pp1);//問題あり
	    String pp2 = ppp.Judg(name,ab); 
	    
	    //後で削除(テスト用)
	    PrintWriter out = response.getWriter();//[7]
	    out.println("<html><head></head><body>");//[8]
        out.println("<p>入力された項目を表示します。</p>");//[9]
        out.println("<p>入力項目1:" + name + "</p>");//[10]
        out.println("</body></html>");
	      
        // セッションオブジェクト取得
		HttpSession session = request.getSession();
		session.setAttribute("pp2", pp2);
		
	}

}






ProductDAO.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class PorductDAO {
  private final String URL = "jdbc:mysql://localhost/product";
  private final String USER = "root";
  private final String PASS = "pass";
  private Connection con = null;
  
public String select(String pp1) {
    Statement stmt = null;
    ResultSet rs = null;
    String result = null;
    String sql = "SELECT ID FROM Product WHERE ID = " + pp1;
    try{
     //①DBに接続
    	Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection(URL, USER, PASS);
      //②ステートメントを生成
        stmt =con.createStatement();
      //③SQLを実行
        rs = stmt.executeQuery(sql);
      //④検索結果の処理
        result = rs.getString("ID");
    } catch(Exception e){
      e.printStackTrace();
    } finally {
      try{
        if(rs != null) rs.close();
        if(stmt != null) stmt.close();
      } catch(Exception e){
        e.printStackTrace();
      }
    }
    return result;
  }

  public void disconnect(){
    try{
      //⑤DBを切断
      if(con != null) con.close();
    } catch(Exception e){
      e.printStackTrace();
    }
  }
}






//データベースmysql
Product
+------+--------------------+-------+
| ID   | NAME               | PRICE |
+------+--------------------+-------+
| A100 | ワイヤレスマウス    |  5000 |
| A200 | デスク             | 13000 |
| A300 | ワイヤレスイヤホン  | 15000 |
| A400 | キーボード      |  8000 |
| A500 | モニター      | 18000 |

ID    VARCHAR(10) primary key
NAME  VARCHAR(10)
PRICE INTEGER


0 likes

1Answer

java.sql.SQLSyntaxErrorException: Unknown column 'A200' in 'where clause'

A200が値ではなく、列名と解釈されていませんか。
シングルクォートかダブルクォートで囲って文字列とする必要があるのでは?

0Like

Comments

  1. @taxin3922

    Questioner

    @nak435 さん
    返信が遅くなり申し訳ありません。
    ご確認、ご教示頂きありがとうございます。
    ご教示頂いた通り、ダブルクォートで囲ってみたのですがそれでも改善せず、エラーメッセージも変わりませんでした。
    自分なりに怪しい部分を見つけられたので、そちらを対処してみます。

  2. ご教示頂いた通り、ダブルクォートで囲ってみたのですがそれでも改善せず

    "囲ってみた" 該当部分のコードをコードブロックに貼ってください。

  3. @taxin3922

    Questioner

     String sql = "SELECT ID FROM Product WHERE ID = " + "A200" ;
       
    

    上記のコードになります。
    本来は、A200部分は変数pp1で表したいですが、テストのため直接A200をダブルクオートで囲っています。

  4. @taxin3922

    Questioner

    @nak435さん

    今回の件につきましてはSQLにうまく接続することができていないことが根本の原因でした。
    初めての投稿で少し不安でしたが、ご教示頂きありがとうございました。
    DBについて学習をし直してからもう一度今回の件の対応をします。
    ありがとうございました。

  5. 解決したのでしょうか?

    ちなみに、ですが、

     String sql = "SELECT ID FROM Product WHERE ID = " + "A200" ;   
    

    ↑これは、Java言語として、文字列を示すためのダブルクォートの囲いですが、
    そうではなく、SQL文として文字列にするという意味です。

    上の文で組み立てたSQLは、
    SELECT ID FROM Product WHERE ID = A200 ですよね。A200が文字列になっていないです。
    以下のようにする意味です。

    SELECT ID FROM Product WHERE ID = 'A200'

  6. @taxin3922

    Questioner

    解決しました。
    ありがとうございました。

Your answer might help someone💌