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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

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

JSP

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

Java

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

servlet

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

Q&A

2回答

20379閲覧

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

manmos

総合スコア55

MySQL

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

JSP

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

Java

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

servlet

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

0グッド

0クリップ

投稿2016/03/03 14:38

編集2022/01/12 10:55

現在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文は一つにまとめられないものなんでしょうか)

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

issei.

2016/03/03 18:10

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

回答2

0

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

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

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

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

lang

1public ResultSet InsertInformation(String name, 2 String name_hiragana, String birthday, String 3 mail_address, 4 String enter_date,String retire_date, String status) throws ClassNotFoundException, SQLException { 5 //SQL文 6 //メッセージ情報を挿入 7 String sql = 8 "INSERT INTO employee_info values(?, ?, ?, ?)"; 9 String sql2 = 10 "INSERT INTO employee_state values(?, ?, ?)"; 11 12 /* 13 * DB接続/挿入/終了 14 * メッセージ挿入 15 */ 16 try { 17 Class.forName("com.mysql.jdbc.Driver"); //ドライバクラスのロード 18 19 /* コネクション確立 */ 20 conn = DriverManager.getConnection(url, user, password); //Connectionクラス生成 21 pstmt = conn.prepareStatement(sql); //PreparedStatementクラス生成 22 23 /* トランザクション開始 */ 24 conn.setAutoCommit(false); // トランザクション開始の代わりに自動コミットを無効化 25 26 /* データ追加1 */ 27 pstmt.setString(1, name); 28 /* 引数で受け取ったデータをSQL文の中の1個目の?と入れ替えられるメソッドです。 29 "name"の様な文字列リテラルではそのリテラル値がそのまま登録されてしまいます。 30 データ型に応じてメソッドを使い分けてください setDate、setIntなど */ 31 pstmt.setString(2, name_hiragana); 32 pstmt.setString(3, birthday); 33 pstmt.setString(4, mail_address); 34 rs = pstmt.executeQuery(); //INSERT文を実行 35 36 /* データ追加2 */ 37 pstmt = conn.prepareStatement(sql2); 38 pstmt.setString(1, enter_date); 39 pstmt.setString(2, retire_date); 40 pstmt.setString(3, status); 41 pstmt.executeUpdate(); //INSERT文を実行 42 43 /* コミット処理 */ 44 conn.commit(); 45 46 // while (rs.next()); 47 48 // return rs; 49 50 } catch (ClassNotFoundException e) { 51 /* jdbc読込失敗時 ロールバック不可 */ 52 throw e; 53 } catch (SQLException e) { 54 /* SQL文が間違っている場合など、一応ロールバック可能 */ 55 conn.rollback(); 56 throw e; 57 } catch (Exception e) { 58 /* コミットまでに失敗した場合 59 (データ登録がバッティングした場合など)、ロールバック */ 60 conn.rollback(); 61 throw e; 62 } finally { 63 // クローズ処理 64 /* メソッド戻り値にResultSetを指定しているので 65 ResultSetを利用した処理が終わるまでクローズしてはいけないのでは? */ 66 /* if (conn != null) { 67 conn.close(); 68 conn = null; 69 } */ 70 /* if (pstmt != null) { 71 pstmt.close(); 72 pstmt = null; 73 } */ 74 /* if (rs != null) { 75 rs.close(); 76 rs = null; 77 } */ 78 } 79 80 /* try ~ finally 外 */ 81 Return rs; 82 }

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

投稿2016/03/04 08:32

Aeona

総合スコア396

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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 14:58

WEB-DIR

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WEB-DIR

2016/03/03 14:59

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

2016/03/03 15:02

順番にinsert文実装です。
dupont_kedama

2016/03/03 22:49 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問