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

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

ただいまの
回答率

90.32%

java SQL 構文について

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 885

khr0404

score 41

前提・実現したいこと

簡単なチャットを作成しているのですが表示画面に表示される一件目のデータがDBから得た情報ではなく入力された情報を表示してしまい、

DBでは文字数やnullを制限しているのに最初の投稿ボタン押下後では表示されてしまい、
再び投稿ボタン押下か再読み込みをすると消えるという現象が起きています。
データを表示する時にcontributionのgetでとってきているのですがどのように訂正すればよいでしょうか?

ご教授尾お願い致します。

DBは

CREATE TABLE CHAT ( 
  ID VARCHAR (8)NOT NULL , 
  TITLE VARCHAR(20) NOT NULL, 
  BODY VARCHAR (100)NOT NULL, 
  DATE VARCHAR (20) NOT NULL, 
 );

で作りました。

投稿データをDBから取得するクラス

public class ChatDataDAO_CHAT implements ChatDataDAO {


    ArrayList<Contribution> dataList = new ArrayList();

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

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

    private final String DB_USER = "Me";

    private final String DB_PASS = "";


    public ChatDataDAO_CHAT() {


        Connection conn = null;

        try {
            //データベースへ接続
            Class.forName( DRIVER_NAME );//JDBCドライバーダウンロード

            conn = DriverManager.getConnection( JDBC_URL, DB_USER, DB_PASS );//データベース接続

            String sql = "SELECT * FROM CHAT"; //SELECT文の準備

            PreparedStatement pStmt = conn.prepareStatement( sql );//preparedstatement作成

            ResultSet result = pStmt.executeQuery();


            String id = "";
            String title = "";
            String body = "";
            String datetime = "";

            while ( result.next() ) {
                id = result.getString( "ID" );
                title = result.getString( "TITLE" );
                body = result.getString( "BODY" );
                datetime = result.getString( "DATE" );

                dataList.add( new Contribution( id, title, body, datetime ) );


            }


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


                }
            } catch ( SQLException e ) {
                e.printStackTrace();
            }
        }
    }


    //投稿情報をdataListメンバに追加し、DBへ保存する
    @Override
    public void addContribution( Contribution c ) {


        dataList.add( c );

        Connection conn = null;

        try {
            //データベースへ接続
            Class.forName( DRIVER_NAME );//JDBCドライバーダウンロード

            conn = DriverManager.getConnection( JDBC_URL, DB_USER, DB_PASS );//データベース接続

            String sql = "INSERT INTO CHAT VALUES(? , ? , ? ,? )"; //INSERT文の準備

            PreparedStatement pStmt = conn.prepareStatement( sql );//preparedstatement作成


            pStmt.setString( 1, c.getId() );
            pStmt.setString( 2, c.getTitle() );
            pStmt.setString( 3, c.getBody() );

            pStmt.setString( 4, c.getDatetime() );

            int result = pStmt.executeUpdate();


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


                }
            } catch ( SQLException e ) {
                e.printStackTrace();
            }
        }
    }


    //dataListからcount件数文の投稿データを保持したListに返却する
    @Override
    public ArrayList<Contribution> getContribution( int count ) {

        ArrayList<Contribution> aList = new ArrayList<Contribution>();
        int DLS = dataList.size();

        if ( DLS < count ) {
            for ( int j = 0; j < DLS; j++ )
                aList.add( dataList.get( j ) );
        } else {
            for ( int j = DLS - count; j < DLS; j++ ) {
                aList.add( dataList.get( j ) );

            }
        }
        return aList;

    }

}

サーブレットクラス

public class Chat1 extends HttpServlet {


    private static final long serialVersionUID = 1L;


    public Chat1() {

        super();

    }


    @Override
    protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {

        this.doPost( request, response );

    }


    @Override
    protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {


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


        try {
            ServletContext application = this.getServletContext();//ServletContextインスタンスの取得

            ServletConfig sconfig = getServletConfig();
            String primary = sconfig.getInitParameter( "chat" );

            if ( primary == null ) {
                primary = (String) application.getAttribute( "初期値" );
            }

            ChatDataDAO_CHAT CDC = (ChatDataDAO_CHAT) Class.forName( primary ).newInstance();

            ArrayList<Contribution> chatList = new ArrayList<Contribution>();//ArrayListの生成
            String id = request.getParameter( "Id" );
            String title = request.getParameter( "Title" );
            String body = request.getParameter( "Body" );
            Date date = new Date();

            String datetime = dateString( date );


            if ( title != "" && body != "" && title != null && body != null ) {


                CDC.addContribution( new Contribution( id, title, body, datetime ) );
            }

            int number = 5;
            String num = request.getParameter( "num" );

            if ( num != null ) {
                number = Integer.parseInt( num );
            }
            chatList = CDC.getContribution( number );
            int aList = CDC.dataList.size();

            application.setAttribute( "chatList", chatList );//アプリケーションスコープにインスタンスを保存
            application.setAttribute( "初期値", primary );//アプリケーションスコープにインスタンスを保存
            application.setAttribute( "aList", aList );

            RequestDispatcher dispatch = request.getRequestDispatcher( "/ChatOutput.jsp" );
            dispatch.forward( request, response );

            // System.out.println( chatList.size() );

        } catch ( InstantiationException e ) {

            e.printStackTrace();
        } catch ( IllegalAccessException e ) {

            e.printStackTrace();
        } catch ( ClassNotFoundException e ) {

            e.printStackTrace();
        } finally {
            System.out.println( "finally処置" );
        }

    }

    static public final String DATE_PATTERN = "yyyy/MM/dd HH:mm:ss";


    public static String dateString( Date date ) {

        String str;
        if ( date == null ) {
            str = null;
        } else {
            str = new SimpleDateFormat( DATE_PATTERN ).format( date );
        }
        return str;
    }

}

Contributionクラス

public class Contribution {


    private String id = "";

    private String title = " ";

    private String body = "";

    private String date = "";




    public Contribution( String id, String title, String body, String date ) {

        this.id = id;
        this.title = title;
        this.body = body;
        this.date = date;
    }


    public String getId() {

        return this.id;
    }


    public String getTitle() {

        return this.title;
    }


    public String getBody() {

        return this.body;
    }


    public String getDate() {

        return this.date;

    }


     }

JSP

```java

<%ArrayList<Contribution> chatList = (ArrayList<Contribution>) application.getAttribute( "chatList" ); %>
<% int aList =(Integer)application.getAttribute( "aList" ); %>
<% %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        <title>チャット</title>
            <h1>チャットDAO</h1>
    </head>

<body>
    <form action="/Test/Chat1" method="post">
        ID:<input type="text" name = "Id" value = "" size=20>
        タイトル<input type="text" name="Title" value="" size=20>
        <br>
        <input type="text" name = "Body" value = "" size=40>
        <input type="submit" value=" 投稿 " name="do">
        <input type="button" onclick="location.replace(location.href)" value="ページを更新">
        <br>
        表示行数:<input type="number" name="num" value="5" min="1" max="100" step="1">行
        <input type="submit" value=" 設定 " name="setting">
    </form>

        <% int CLS =chatList.size();
 for( int i = 0; i < chatList.size(); i++ ) {%>

    <%="ID:"%><%=chatList.get(CLS-1-i).getId()%>
    <%="   タイトル:"%><%=chatList.get( CLS - 1 - i ).getTitle()%>
    <%="   "%><%=chatList.get( CLS-1-i ).getDatetime(  ) %>
    <br>
    <%=chatList.get(CLS - 1 - i ).getBody()%>
    <br>
<%}
%>
</body>
</html>
`

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

eclipse  4.3 
JDK 1.7 
Tomcat 7 
DB = H2

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • KiyoshiMotoki

    2016/05/25 12:21

    どのようにうまくいかないのかを追記してください。なにを書けばよいか分からない場合、まずは以下を一読することをお勧めします。 https://teratail.com/help/question-tips#questionTips3-4

    キャンセル

  • khr0404

    2016/05/30 11:22

    KiyoshiMotokiさん
    これからの質問では気をつけて質問していきます。
    助言ありがとうございました。

    キャンセル

回答 3

checkベストアンサー

+1

Chat1クラスの

Date data = new Date();
String date = request.getParameter( "" );

if ( title != "" && body != "" && title != null && body != null ) {
    CDC.addContribution( new Contribution( id, title, body, date ) );
}

ここで指定しているのが 下の変数の「requestのパラメータから取得したdate」だからだと思います。
想定しているのは、上の変数 Date型のdataではないですか?

紛らわしい変数名をつけると、バグの元になりかねません。
分かりやすい名前をつけましょう。

また、発言した日時を登録したいのですよね?
わざわざAPサーバー上のシステム日付を渡すのではなく、DBサーバ上のCURRENT_TIMESTAMPを指定して登録してしまえばいいのではないでしょうか?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/30 11:29

    kaputarosさん

    DBでのTIMESTAMPだとどうしてもうまくいかなかったので結局DBでは全部VARCHARで作成し日時はjavaのDATEでとってくる方法にしました。

    ですがDBでもNOTNULLで設定しているのにも関わらず一回目の投稿ボタン押下だとnullの情報も一度表示結果に表示されてしまい、もう一度更新するとその投稿は消えます。

    ・nullが入っている内容で一回目の投稿ボタン押下後は表示はされるがDBへは追加されていない
    ・二回目の投稿or更新ボタンを押下後はDB通り先ほど表示されていたnullの内容は表示されない

    なので一回目の投稿ボタン押下の時点で表示される一件目の情報はDBから取得した情報ではなくDBへ登録する前の情報だと思うのですがどこが原因がわかりません。。。

    キャンセル

  • 2016/05/30 11:50

    お騒がせしてすみません
    サーブレットクラスのif分に記述が抜けていました。

    if ( title != "" && body != "" && title != null && body != null && id != "" && id != null ) {

    で訂正したところ表示もされなくなりました。

    キャンセル

0

・ ChatDataDAO_CHATクラスの 
         pStmt.setString( 4, c.getDate() );

       pStmt.setTimestamp( 4, new Timestamp( System.currentTimeMillis() ) );
に変更したら
時間はでるようになったのですが
 ID:aa aa:a null 
 ID:fff fff:fff 2016-05-25 10:29:38.53 
 ID:sss sss:sss 2016-05-25 10:28:06.262 
 ID:ttt ttt:ttt 2016-05-25 10:28:00.14 
 ID:ff ff:ff 2016-05-25 10:27:54.064 

のように次の投稿をするまでnullのままになってしまいます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

お騒がせしてすみません
サーブレットクラスのif分に記述が抜けていました。

  if ( title != "" && body != "" && title != null && body != null && id != "" && id != null ) {

で訂正したところ表示もされなくなりました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

同じタグがついた質問を見る