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

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

ただいまの
回答率

90.33%

  • Java

    14431questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • MySQL

    6183questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • JSP

    960questions

    JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

  • servlet

    486questions

    Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

javaからMysqlへinsertでレコード追加

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 7,452

manmos

score 47

現在javaの勉強として人員管理のwebアプリを作っています。
Mysqlのレコードを→Dao→jspで一覧表示、逆にjspのフォームへ情報を入力し、レコード登録や削除を行うといった物です。
一覧を表示する部分はできたのですがレコードの登録、Insert文の使用方法がいまいち理解できないです。
フォームに入力した情報は、デバックで確認してみるとDao内のInsertメソッド内の各カラム名の変数に格納されているので、それがsql文に連携できていないのかそれともsql文の使い方が間違っているのかだと思うのですが判断がつきません。
わかる方がいれば添削していただければと思います。

public ResultSet InsertInformation(String name, 
            String name_hiragana, String birthday, String 
            mail_address,
            String enter_date,String retire_date, String status) throws ClassNotFoundException, SQLException {
        //SQL文
        //メッセージ情報を挿入
        String sql =
                "INSERT INTO employee_info values(?, ?, ?, ?)";
        String sql2 =
                "INSERT INTO employee_state values(?, ?, ?)";


        /*
         * DB接続/挿入/終了
         * メッセージ挿入
         */
        try {
            Class.forName("com.mysql.jdbc.Driver");             //ドライバクラスのロード

            conn = DriverManager.getConnection(url, user, password);    //Connectionクラス生成
            pstmt = conn.prepareStatement(sql);        //PreparedStatementクラス生成

            pstmt.setString(1, "name");
            pstmt.setString(2, "name_hiragana");
            pstmt.setString(3, "birthday");
            pstmt.setString(4, "mail_address");
            pstmt = conn.prepareStatement(sql2);
            pstmt.setString(1, "enter_date");
            pstmt.setString(2, "retire_date");
            pstmt.setString(3, "status");
            pstmt.executeUpdate();     //INSERT文を実行
            rs = pstmt.executeQuery();
            while (rs.next());

            return rs;

        } catch (ClassNotFoundException e) {
            throw e;
        } catch (SQLException e) {
            throw e;
        } catch (Exception e) {
            throw e;
        } finally {
            // クローズ処理
            if (conn != null) {
                conn.close();
                conn = null;
            }
            if (pstmt != null) {
                pstmt.close();
                pstmt = null;
            }
            if (rs != null) {
                rs.close();
                rs = null;
            }
        }
    }


以上が登録のメソッドになります。(コードタグはこれでいいのでしょうか)
自分でも怪しいと思うのが複数へのテーブルへ対してのsql文の使い方で、このように変数を二つ作るだけで良いのかという点です。
もっといいいやり方などあればご享受願います。

どうぞ宜しくお願い致します。

追記です。

皆様ご教授いただきありがとうございます。
sql文は1テーブルの変数を取得した時点でinsert文を実行していくんですね。
今回は2回とも
pstmt.executeUpdate();
で実行すれば良いのでしょうか。

間が空いてしまい申し訳ありませんでした。
なんとか一つ目のテーブルへのinsert文は成功するようになりました、ありがとうございます。
ただ二つ目のinsert文がどうしてもうまくいきません。
1度目の
pstmt.executeUpdate();
の後に
pstmt = conn.prepareStatement(sql2);
pstmt.setString(1, 変数名);
省略
pstmt.executeUpdate();                    //INSERT文を実行
conn.close();

という風にしてみたのですがどのように変えるべきでしょうか。
(というかsql文は一つにまとめられないものなんでしょうか)

何度もお手数おかけして恐縮ですが宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • issei.

    2016/03/04 03:10

    ソースコードをコードタグで囲って下さい。

    キャンセル

回答 2

0

 try { 
            Class.forName("com.mysql.jdbc.Driver");             //ドライバクラスのロード

            conn = DriverManager.getConnection(url, user, password);    //Connectionクラス生成 
            pstmt = conn.prepareStatement(sql);        //PreparedStatementクラス生成

            pstmt.setString(1, "name"); 
            pstmt.setString(2, "name_hiragana"); 
            pstmt.setString(3, "birthday"); 
            pstmt.setString(4, "mail_address"); 
            pstmt.executeUpdate();     //INSERT文を実行 

            pstmt = conn.prepareStatement(sql2); 
            pstmt.setString(1, "enter_date"); 
            pstmt.setString(2, "retire_date"); 
            pstmt.setString(3, "status"); 

            ResultSet rs = pstmt.executeQuery(); 
           

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/03/03 23:59

    inser文tを終わらせてからデータのupdate文ではないでしょうか?

    キャンセル

  • 2016/03/04 00:02

    順番にinsert文実装です。

    キャンセル

  • 2016/03/04 07:47 編集

    2回目も更新系クエリなのでexecuteUpdate()にしないとダメじゃないですかね?
    executeQuery()は参照系クエリに。

    キャンセル

0

javaに限らずSQLサーバーとのデータ処理の流れは以下になると思います。

コネクション確立
トランザクション開始
データ追加1(Insertの実行)
データ追加2(Insertの実行)
コミット処理(Insert結果の適用)
トランザクション終了
(コミット失敗時のロールバック)
コネクションクローズ

トランザクション処理は、
他者との処理の衝突でデータが壊れるのを防ぐ仕組みです。
データ追加やコミットが失敗したときにデータをトランザクション開始前に戻す(ロールバック)する様になっています。

これを処理に落とし込むと下記のようになるかと思います。
(mysql.jdbcのコード流儀がある様です。)

public ResultSet InsertInformation(String name,  
            String name_hiragana, String birthday, String  
            mail_address, 
            String enter_date,String retire_date, String status) throws ClassNotFoundException, SQLException { 
        //SQL文 
        //メッセージ情報を挿入 
        String sql = 
                "INSERT INTO employee_info values(?, ?, ?, ?)"; 
        String sql2 = 
                "INSERT INTO employee_state values(?, ?, ?)";

        /* 
         * DB接続/挿入/終了 
         * メッセージ挿入 
         */ 
        try { 
            Class.forName("com.mysql.jdbc.Driver");             //ドライバクラスのロード

            /* コネクション確立 */
            conn = DriverManager.getConnection(url, user, password);    //Connectionクラス生成 
            pstmt = conn.prepareStatement(sql);        //PreparedStatementクラス生成

            /* トランザクション開始 */
            conn.setAutoCommit(false); // トランザクション開始の代わりに自動コミットを無効化

            /* データ追加1 */
            pstmt.setString(1, name);
              /* 引数で受け取ったデータをSQL文の中の1個目の?と入れ替えられるメソッドです。
                 "name"の様な文字列リテラルではそのリテラル値がそのまま登録されてしまいます。
                 データ型に応じてメソッドを使い分けてください setDate、setIntなど */
            pstmt.setString(2, name_hiragana); 
            pstmt.setString(3, birthday); 
            pstmt.setString(4, mail_address); 
            rs = pstmt.executeQuery(); //INSERT文を実行

            /* データ追加2 */
            pstmt = conn.prepareStatement(sql2); 
            pstmt.setString(1, enter_date); 
            pstmt.setString(2, retire_date); 
            pstmt.setString(3, status); 
            pstmt.executeUpdate();     //INSERT文を実行 

            /* コミット処理 */
            conn.commit();

            // while (rs.next());

            // return rs;

        } catch (ClassNotFoundException e) { 
            /* jdbc読込失敗時 ロールバック不可 */
            throw e; 
        } catch (SQLException e) { 
            /* SQL文が間違っている場合など、一応ロールバック可能 */
            conn.rollback();
            throw e; 
        } catch (Exception e) { 
            /* コミットまでに失敗した場合
        (データ登録がバッティングした場合など)、ロールバック */
            conn.rollback();
            throw e; 
        } finally { 
            // クローズ処理 
            /* メソッド戻り値にResultSetを指定しているので
                ResultSetを利用した処理が終わるまでクローズしてはいけないのでは? */
            /* if (conn != null) { 
                conn.close(); 
                conn = null; 
            } */
            /* if (pstmt != null) { 
                pstmt.close(); 
                pstmt = null; 
            } */
            /* if (rs != null) { 
                rs.close(); 
                rs = null; 
            } */
        }

        /* try ~ finally 外 */
        Return rs;
    }

以上、参考になりますでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • Java

    14431questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • MySQL

    6183questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • JSP

    960questions

    JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

  • servlet

    486questions

    Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。