質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.53%

SQL サーブレット 簡易チャットのDB接続

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,803

khr0404

score 41

前提・実現したいこと

現在javaを勉強しているものです。
簡易チャットを作成していてDBに接続し
投稿者ID、投稿者名、投稿文、投稿日時をSystemoutで出力するプログラムをつくりたいのですがエラーが出てしまいます。

おそらくDBのSQLが間違っているのかもしれません。

このソースのどこを改善すればよいでしょうか?
ご教授お願い致します。

発生している問題・HTTPステータス404

type ステータスレポート

メッセージ 

説明 The requested resource is not available.

サーブレット

/**
 * Servlet implementation class ChatServlet
 */
@WebServlet("/ChatServlet")
public class ChatServlet extends HttpServlet {


    private static final long serialVersionUID = 1L;


    /**
     * @see HttpServlet#HttpServlet()
     */
    public ChatServlet() {

        super();

    }


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

        this.doPost( request, response );
    }


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

        response.setContentType( "text.html ;charset =UTF-8" );
        request.setCharacterEncoding( "UTF-8" );

        ChatDB cdb = new ChatDB();
        cdb.getCHATdb( 1 );

    }

}

DB

public class ChatDB {


    private final static String DRIVER_NAME = "org.h2.Driver";

    private final static String JDBC_URL = "jdbc:h2:~/test";

    private final static String DB_USER = "Me";

    private final static String DB_PASS = "";


    public static void getCHATdb( int i ) {

        int argument = i;
        Connection conn = null;

        try {
            //データベースへ接続
            Class.forName( DRIVER_NAME );
            conn = DriverManager.getConnection( JDBC_URL, DB_USER, DB_PASS );

            //SELECT文の準備
            String sql = "SELECT * FROM CHATDB WHERE ID =" + argument;

            PreparedStatement pStmt = conn.prepareStatement( sql );

            //INSERT文を実行
            ResultSet result = pStmt.executeQuery();


            int id = 0;
            String title = "";
            String body = "";
            String date = "";
            while ( result.next() ) {
                id = Integer.parseInt( result.getString( "ID" ) );
                title = result.getString( "TITLE" );
                body = result.getString( "BODY" );
                date = result.getString( "DATE" );

                System.out.println( "ID:" + id );
                System.out.println( "TITLE:" + title );
                System.out.println( "BODY:" + body );
                System.out.println( "DATE:" + date );
            }

        } catch ( SQLException e ) {
            e.printStackTrace();
        } catch ( ClassNotFoundException e ) {
            e.printStackTrace();
        } finally {
            try {
                if ( conn != null ) {
                    conn.close(); //データベースの切断
                }
            } catch ( SQLException e ) {
                e.printStackTrace();
            }
        }
    }

}

SQL

ID VARCHAR
TITLE VARCHAR
BODY VARCHAR
DATE TIMESTAMP


でテーブルを作りました。

補足情報(言語/FW/ツール等のバージョンなど)

eclipse  4.3
JDK 1.7
Tomcat 7
H2

追記

DBにID、TITLE,BODYだけ登録して実行するとDATEがnullになり、
systemoutで出力すると
ID:1
TITLE:おはよう
BODY:おはようございます
DATE:null
とでます。

INSERTでデータを追加するときにどのように記述すればよいのでしょうか。。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kaputaros

    2016/05/24 11:31

    ん?最初のエラーは解消されたのですか??また、DBは何を使用しているのですか?

    キャンセル

  • khr0404

    2016/05/24 11:39

    kaputaros様 最初のエラーはDBに上手くデータが入っていないことによるものでした。
    DBha
    H2というフリーのものが指定なのでH2を使っております。

    キャンセル

回答 2

checkベストアンサー

+1

解決されたようなので、よかったです。
取得しようとしているデータがあるかどうかは、まず確認しましょうね(笑

勉強中ということなので、コードでちょっと気になった部分をいくつか。

  • PreparedStatementを使うなら、SQLには?で準備してset○○()(○○はStringとかintとか)を使って指定した方がいいです。

  • この初期化はあまり意味がありません。

 int id = 0;
 String title = "";
 String body = "";
 String date = "";

while()の外で使用しないのであれば、whileの中で変数を宣言し、そのまま代入した方がいいです。
また、オブジェクト型は、必要ない場合はnullで初期化した方がいいです。無駄にインスタンスを作成してしまうので。

  • ここはresult.getInt(String)すればいいのでは?
    (多分できたと思います。できなかったらすいません。)

id = Integer.parseInt( result.getString( "ID" ) );

API: java.sql.ResultSet.getInt(String)
ただし、カラムがVARCHARなので空文字やnullなどの値の場合は例外が発生するので注意です。
(Integer.parseInt()でも同じですね。)

勉強がんばってください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/25 10:19

    kaputarosさん 度々回答ありがとうございます。

    `result.getInt(String)`で試したのですがだめでした...

    無駄なコードも多く初期化を二個してしまったりとエラーがでやすいので気をつけていきます。

    回答有難うございました!

    キャンセル

  • 2016/05/25 10:35

    おっと、ダメでしたか。
    DBの型によるんだっけな・・・?すいません、久しく開発でjavaを使っていないので忘れてしまいました。

    キャンセル

0

テーブル作成
CREATE TABLE ChatDBTest ( 
  ID VARCHAR NOT NULL , 
  TITLE VARCHAR NOT NULL, 
  BODY VARCHAR NOT NULL, 
  DATE TIMESTAMP, 
 );

データ入力
 INSERT INTO CHATDBTEST (ID,TITLE,BODY,DATE) 
 VALUES('1' , '日本' , '帰ってきました' , CURRENT_TIMESTAMP );

 でやったらできました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/24 17:16

    解決されたようですので、解決済みにしちゃっていただけますか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる