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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

SQL

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

4518閲覧

JDBC Templateでinsertしたときのtry-chatchのやり方を教えていただきたいです

syoshinsya-

総合スコア21

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

SQL

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/09/02 18:44

編集2020/09/02 18:45

###やっていること
HTML上で適当に入力したものをDBに書き込み
書き込みが成功か失敗かをwebの画面に表示する(ローカル環境です)

###やりたいこと
JDBCTemplateでinsertして
PRIMARY_KEYに設定したものがダブってエラーがになった時にweb上にエラー文がバーーって出てしまうのをtrychatchを使って任意のものに変更したい

###試したこと
わざとダブらせたときに
SQLIntegrityConstraintViolationException
というものが出ていたのでchatchのところをこれにしてみたり
他にも
SQLException
SQLWarning
などを試しましたが駄目でした

#コード

@Repository public class Register { @Autowired JdbcTemplate jdbcTemplate; public int insert(String test){ try { //ここでダブってエラー出たときにどうにかしたい jdbcTemplate.update("insert into test values (?)", test); return 1; }catch (SQLWarningException e){ System.out.println("エラーです"); return 0; } } }

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

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

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

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

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

guest

回答2

0

java

1@Repository 2public class Register { 3 @Autowired 4 JdbcTemplate jdbcTemplate; 5 6 public int insert(String test) throws 独自Exception { 7 try { 8 //ここでダブってエラー出たときにどうにかしたい 9 jdbcTemplate.update("insert into test values (?)", test); 10 return 1; 11 }catch (SQLIntegrityConstraintViolationException e){ 12 throw new 独自Exception(); 13 } 14 } 15}

で通常は出来るはずです。
うまくいかなかった理由として、私の経験から思い浮かぶのは

  • ソースを保存するのを忘れた
  • ソースを保存した後にアプリケーションを再起動しなかった

辺りでしょうか。

いずれも凡ミスですが…。

投稿2020/09/03 03:23

deaf_tadashi

総合スコア200

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

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

syoshinsya-

2020/09/03 06:05

回答ありがとうございます ソースを保存し忘れていた 再起動を忘れていた ということはありませんでした しかし今後気を付けようと思います
guest

0

ベストアンサー

入力チェック「バリデーション」の範疇では。
insertしないとわからないわけじゃないですよね。同じキーでselectすればinsertせずともPKの重複を未然に防げますし、ExceptionではPK重複だけを拾うことは不可能です。
エラーメッセージを解析するのも悪手ですしね。
PK重複くらいだと「Exception」として捉えるのも微妙な話だと思います。selectすれば未然に防げるから。(桁数とか型とかマスタチェックもこの部類)

投稿2020/09/02 22:38

m.ts10806

総合スコア80875

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

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

syoshinsya-

2020/09/03 02:30

回答ありがとうございます たしかにselectを使えば未然に防げるエラーではあるのですが エラーのようなものが出ていたことからtrycatchで楽できるかと考えていました
m.ts10806

2020/09/03 02:56

「のようなもの」が何かによります。 あくまで「異常捕捉」なので、切り分けは必要です。 ただ異常系設計もどうするかにもよります。全て捕捉したいのなら親であるExceptionで拾えますし、明示したいのならそのExceptionを別途捕捉し、そのExceptionでどうしたいかを書きます。 先に書いたように質問の提示の要件はバリデーションで防げる範囲なのでExceptionを利用するのは無駄遣いになるのではと。 insert投げないと取れないし、Exceptionだとしても原因がPK重複とは限らないわけですから。
fsk5303

2020/09/03 03:11 編集

>「同じキーでselectすればinsertせずともPKの重複を未然に防げますし」 未然に防げるのですか? 同様のリクエストが短い時間であった際に、SELECT1 → SELECT2 → INSERT1 → INSERT2 の順で実行されればバリデーション(バリデーションという言葉がここに適しているかは保留)したとしてもキー重複は起こってしまうと思いますけども・・・。
m.ts10806

2020/09/03 03:17

語弊ありました。仰有るとおり、完全には防げないですね。その場合はSQLExceptionで拾ってユーザーには「登録できなかった」事実だけ伝えても良いかなと。(問い合わせ対応のためログには出力する) もう一度同じアカウントで登録しようとすると弾かれます。
fsk5303

2020/09/03 03:21 編集

なるほど!ありがとうござます、腑に落ちました! 私の勝手な解釈ですが、syoshinsya-さんの質問文を拝読したところ、その、「SQLExceptionで拾ってユーザーには「登録できなかった」事実だけ伝え」る処理を行いたいけど、なぜか出来ないという質問に思えました。
m.ts10806

2020/09/03 03:26

「エラー文がバーー」も状況によりですね。 私の解釈ではあくまで「どうやったら重複キーエラーを拾えるか」だと思いました。 DBやバージョンによって一定とは限らないので、同時アクセスや合間の瞬間でなかなか起き得ない対応で頑張るよりも弾けるなら先に弾いておいて、あとは全て「異常」として捉えても良いのではと考えました。 連番を確保するためにシーケンスを先に必要分取っておいて利用するのも似てます。
syoshinsya-

2020/09/03 06:04

エラー文を載せていなかったのは私の問題でした。 すみません そのためエラー文を見直しました。 初めに書いていた SQLException SQLWarning SQLIntegrityConstraintViolationException のほかに TemplateInputException DuplicateKeyException が見つかりました。 とりあえずすべてをトライキャッチで処理するように設定したところ DuplicateKeyException がpライマリ―キー重複のエラーを拾ってくれることがわかりました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問