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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

トランザクション

トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。

Q&A

解決済

2回答

4409閲覧

java PreparedStatementをトランザクションで使いたい

arisa_80

総合スコア5

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

トランザクション

トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。

0グッド

0クリップ

投稿2020/03/01 16:31

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
新規登録の際、入力されたログインIDと名前とパスワードを基にInsertのsqlを3つ行いたいと考えています。
新規登録用のサーブレットで以下のDAOの中のsignupメソッドを使う感じです。
3つの引数は入力されたログインIDと名前とパスワードとなっています。

発生している問題・エラーメッセージ

sqlで問題が発生していて、データベースに反映ができません。
データベースに登録できるようにしたいです。

Java

1public void signup(String inputLoginId, String inputUserName, String inputPassword) { 2 Connection con=null; 3 con=DBManager.getConnection(); 4 5 try { 6 con.setAutoCommit(false); 7 String sql="BEGIN;"; 8 sql+=" INSERT INTO user (login_id,name,password) VALUES (?,?,?);"; 9 sql+=" INSERT INTO ranking_easy (user_id) select id from user where login_id=?;"; 10 sql+=" INSERT INTO ranking_hard (user_id) select id from user where login_id=?;"; 11 sql+=" COMMIT;"; 12 PreparedStatement st=con.prepareStatement(sql); 13 st.setString(1, inputLoginId); 14 st.setString(2, inputUserName); 15 st.setString(3, inputPassword); 16 st.setString(4, inputLoginId); 17 st.setString(5, inputLoginId); 18 st.executeUpdate(); 19 con.commit(); 20 st.close(); 21 22 }catch (SQLException e) { 23 e.printStackTrace(); 24 } finally { 25 if (con != null) { 26 try { 27 con.close(); 28 } catch (SQLException e) { 29 e.printStackTrace(); 30 } 31 } 32 } 33 34 } 35 36``` 37エラーメッセージ 38``` 39 40 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO user (login_id,name,password) VALUES ('tanaka','田中','password');' at line 1 41 42```ここに言語名を入力 43ソースコード 44``` 45 46### 試したこと 47 48ググりましたがよくわからず・・・・ 49 50### 補足情報(FW/ツールのバージョンなど) 51eclipse/tomcat使用 52mySQL使用 53 54データベースのuserテーブルについて 55id int(11) auto_increment 56name varchar(255) 57login_id varchar(255) 58password varchar(255) 59 60データベースのranking_easyテーブルについて 61id int(11) auto_increment 62user_id int(11) 63easy_high_score int(11) 64 65データベースのranking_hardテーブルについて 66id int(11) auto_increment 67user_id int(11) 68hard_high_score int(11)

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

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

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

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

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

jimbe

2020/03/01 17:38

inset 毎に個別に実行しては如何ですか. トランザクションも sql ではなく jdbc のレベルで行ってください.
guest

回答2

0

ベストアンサー

SQLのバッチ実行

3つのSQLを一度に実行したいのならStatement#executeBatchを利用すると良いかもしれません。3つのSqlがそれぞれ異なるのでPreparedStatementは使えません。Statementになります。SQLインジェクション対策が必要。

Java

1public void signup(String inputLoginId, String inputUserName, String inputPassword) { 2 try (Connection conn = DBManager.getConnection()) { 3 conn.setAutoCommit(false); 4 try (Statement stmt = conn.createStatement()) { 5 stmt.addBatch("INSERT INTO user (login_id,name,password) VALUES ('"+inputLoginId+"','"+inputUserName+"','"+inputPassword+"')"); 6 stmt.addBatch("INSERT INTO ranking_easy (user_id) select id from user where login_id='"+inputLoginId+"'"); 7 stmt.addBatch("INSERT INTO ranking_hard (user_id) select id from user where login_id='"+inputLoginId+"'"); 8 int[] results = stmt.executeBatch(); 9 for (int cnt : results) { 10 if (cnt != 1) { 11 conn.rollback(); 12 throw new SQLException("signup('"+inputLoginId+"','"+inputUserName+"') failed."); 13 } 14 } 15 conn.commit(); 16 } 17 } catch (SQLException e) { 18 e.printStackTrace(); 19 } 20}

1つのPreparedStatementを大量に実行する場合はバッチ実行が可能です。

投稿2020/03/04 09:35

xebme

総合スコア1083

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

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

0

インジェクション対策のため;の後ろは空白文字以外許可されてないはずです。

五回に分けましょう。
現在の記述では出来たとしてもオートコミットと同じ処理です

投稿2020/03/01 23:36

編集2020/03/01 23:39
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問