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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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に必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

4回答

1208閲覧

JDBCを利用したデータの更新方法について

bona

総合スコア8

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に必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2020/06/30 21:57

何をしたいのか

JDBCをを利用してSQLのデータを更新しようとしているのですがエラーが発生してしまいます。エラーの感じからしてSQL文に問題があるのではないかと考えたのですが、原因を見つけられませんでした。何か間違っている場所があったらご指摘いただきたいです。

java

1package camp; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8 9public class JDBC { 10 public static void main(String[]args) throws SQLException{ 11 Connection db_con = null; 12 PreparedStatement db_st = null; 13 ResultSet db_rs = null; 14 try { 15 Class.forName("com.mysql.cj.jdbc.Driver").newInstance(); 16 db_con = DriverManager.getConnection("jdbc:mysql://localhost:8889/Data_db","root","root"); 17 db_st = db_con.prepareStatement("update from profiles set name=? tel=? age=? birthday=? where profilesID = ?"); 18 db_st.setString(1,"佐々木慎"); 19 db_st.setString(2,"987-654-3210"); 20 db_st.setInt(3, 44); 21 db_st.setString(4, "1999-09-09"); 22 23 db_st.executeUpdate(); 24 25 db_st = db_con.prepareStatement("select * from profiles "); 26 db_rs = db_st.executeQuery(); 27 while(db_rs.next()) { 28 System.out.println(db_rs.getInt("profilesID")); 29 System.out.println(db_rs.getString("name")); 30 System.out.println(db_rs.getString("tel")); 31 System.out.println(db_rs.getInt("age")); 32 System.out.println(db_rs.getString("birthday")); 33 } 34 35 db_con.close(); 36 db_st.close(); 37 db_rs.close(); 38 39 }catch(SQLException e_sql){ 40 System.out.println("接続時にエラーが発生しました"); 41 42 }catch(Exception e){ 43 System.out.println("接続時にエラーが発生しました"); 44 45 }finally { 46 if(db_con != null) { 47 try { 48 db_con.close(); 49 db_st.close(); 50 db_rs.close(); 51 }catch(Exception e_con){ 52 System.out.println("エラーが発生しました"); 53 } 54 } 55 } 56 } 57} 58

##エラー内容

イメージ説明

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

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

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

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

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

hoshi-takanori

2020/06/30 22:02

どこでどんな例外が発生したかを知ることがデバッグの第一歩です。 e_sql.printStackTrace() などとして、スタックトレースを表示しましょう。
退会済みユーザー

退会済みユーザー

2020/06/30 22:08

握りつぶしてエラーがわかりませんという人の質問に答える義理はないと思う
bona

2020/06/30 22:38

StackTraceメソッドというものがあるのですね、勉強になります。エラーの詳細が特定できなかったので助かりました。ありがとうございます。
bona

2020/06/30 22:43

こちらも活用させていただきます。御回答頂きありがとうございます。
guest

回答4

0

とりあえず

}catch(SQLException e_sql){ System.out.println("接続時にエラーが発生しました"); }catch(Exception e){ System.out.println("接続時にエラーが発生しました"); }finally {

握りつぶしてるのが悪いです。
誰もわかりません。

投稿2020/06/30 22:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

dodox86

2020/06/30 23:20

初心の方にはもしかしたら「握りつぶす」と言う表現が通じないのでは、と思いました。 } catch (HogeException e) { ; // 例外 } のようなコードを「例外を握りつぶす」などと言います。プログラマー自ら、例外を無かったことのようにする行為だから、です。>@質問者さん それにしてもなぜ、違う例外(要因)に関して同じエラー出力をするのか。これではasahina1979さんの回答どおり、誰にも原因は分かりません。(握りつぶし、です)
m.ts10806

2020/07/01 01:19

SQLを直に実行確認してないのがそもそもの根本原因ですけどね。
dodox86

2020/07/01 01:30

全体の手順として問題が起きた時に切り分けし易いものとしては、 1. SQLを直に実行して、SQL文として相当なものを確認する。 2. 確認でOKだったSQL文を、実際のコード中にPreparedStatementとして適用する。 3. コード実行の際にエラーが起きて原因が分かるように、Exceptionなどの例外、エラーハンドリング、報告のコードを書いておく。 4. 可能な限り、実際にデバッグ(トレース)する。少なくとも1度は。 でしょうね。
bona

2020/07/01 05:04

握りつぶすという言葉自体理解できていませんでした。また実装手順なども非常に参考になりました、御回答頂きありがとうございます。
guest

0

ベストアンサー

SQL

1update from profiles set name=? tel=? age=? birthday=? where profilesID = ?

項目間の区切り(,)がありません。
また、文法的に誤っています。
update テーブル名 set [項目](,[項目]・・・)です。

SQL

1update profiles set name=? ,tel=? ,age=? ,birthday=? where profilesID = ?

他の方も云われているように、実行可能なSQLとして確認したものを元にすることをお薦めします。

投稿2020/07/01 01:07

編集2020/07/01 01:56
sazi

総合スコア25195

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

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

退会済みユーザー

退会済みユーザー

2020/07/01 01:41 編集

フロム テーブル(エイリアス プロファイル)(ぼそっ)
sazi

2020/07/01 01:51

あ、そうですね。
bona

2020/07/01 05:07

エラー個所を特定して構文を見直したことで、ご指摘いただいた所と同じ間違いに気づくことができました。御回答頂きありがとうございます。
guest

0

StackTraceメソッドでSQL自体に誤りがあること、where profilesIDに相当する部分がセットされていないことに気づき修正した所、上手くいきました。

投稿2020/07/01 05:15

bona

総合スコア8

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

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

退会済みユーザー

退会済みユーザー

2020/07/01 05:24

ちなみに 3つ連続でクローズしてますが。 prepareStatement で エラーになった結果 ResultSet が null のままなので NullPointerException が発生し 「エラーが発生しました 」が出力されてることも付け加えておく
guest

0

SQLに問題があると思うのでしたら構文を確認することです。
リファレンスマニュアル:update

ただ、アプリケーションから実行する前にSQLを直に実行して想定の結果を得られるか確認するのが先です。

投稿2020/06/30 22:08

m.ts10806

総合スコア80850

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

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

bona

2020/07/01 05:08

やはりSQL文周辺に間違いがあることが分かり、見比べてみた所間違いに気づくことができました。御回答頂きありがとうございます。
m.ts10806

2020/07/01 06:51

文法問題ならドキュメント確認が確実です。 それより、アプリケーション実装になって初めてSQLを実行するやり方を見直してください。 それだけで未然に防げる問題も多いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問