1

フロントエンド -> サーブレット -> データベースで構成される小さな 3 層プログラムを作成しました。

フロントエンド フォームに詳細を入力します。これらはサーブレットに渡され、サーブレットは HTML をレンダリングし、フォームに入力された値を表示すると同時に、クラス DatabaseHelper を呼び出します。その後、DatabaseHelper はこれらの同じ値をテーブルに接続して挿入します。

値が HTML に表示されているため、値がサーブレット クラスに渡されていることはわかっています。したがって、問題は準備されたステートメント内にあるに違いありません。問題は、ステートメント自体に問題が見られないことです。テーブル自体にクエリを実行すると、そこにデータがありません。

準備済みステートメントではなく、ハードコーディングされたステートメントを使用してデータベースに値を挿入できるため、データベース接続は機能します。

ここで、私が使用しているステートメントを見てみましょう。どんなアドバイスでも大歓迎です。

    public void addRegisterDetails(String name, String email, String country, String password, ){
    try{ 
        String driver = "com.mysql.jdbc.Driver";    
        Class.forName(driver).newInstance();
        // Make db connection
        con = DriverManager.getConnection(url, USERNAME, PASSWORD);   
        st  = con.createStatement();


        String query = " INSERT INTO user_information (name, email, country, password)" + " VALUES (?, ?, ?, ?)";
        PreparedStatement preparedStmt = con.prepareStatement(query);
        preparedStmt.setString (1, name);
        preparedStmt.setString (2, email);
        preparedStmt.setString (3, country);
        preparedStmt.setString (4, password);
        preparedStmt.execute();

    }catch(ClassNotFoundException ex) {
        System.out.println(ex);
    }catch(Exception e){
         e.printStackTrace();
    }
}

テーブル定義


id| 名前 | 電子メール | 国 | パスワード

INT 型の id を除くすべての VARCHAR。

4

4 に答える 4

4

executeUpdate()ステートメント オブジェクトでメソッドを呼び出す必要があります。

また、データをコミットするための呼び出し、トランザクション処理も見られません。この質問の目的のためにそのコードをスキップしても問題ありません。それ以外の場合は、非常に重要なステップです (すべてがうまくいけばコミットし、例外シナリオではロールバックします)。

于 2013-01-17T18:35:32.540 に答える
2

executeUpdateデータベースの書き込み操作に使用します。

preparedStmt.executeUpdate();
于 2013-01-17T18:33:51.320 に答える
1

回答: データベース ID が自動インクリメントに設定されていません。何らかの理由で、これにより、データをテーブルに挿入できなくなります。これを指摘してくれた ChadNC に感謝します。

于 2013-01-17T19:27:38.423 に答える
0

また、なぜst = con.createStatement();ですか?

また、クエリの先頭にスペースがあるのはなぜですか?

String query = " INSERT INTO user_information (name, email, country, password)" 
                 + " VALUES (?, ?, ?, ?)";

この先頭のスペースは重要かもしれませんし、そうでないかもしれません...

最後に、try-with-resources または finally ブロックを使用して、接続が完了したら接続を閉じる必要があります。

于 2013-01-17T18:41:05.443 に答える