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

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

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

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

SQL

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

Q&A

2回答

23432閲覧

select文の結果を変数に取得したい

touch

総合スコア38

Java

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

SQL

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

0グッド

0クリップ

投稿2015/05/10 02:11

現在、SQL文の発行によりデータベースアクセスを行うdaoクラスを作成中です。
このクラスの中に、ID自動採番を行うメソッド(呼び出し元に戻り値integer型のIDが代入された変数を返す)を作っているのですが、select文の問い合わせ結果をどのように変数に取得すればよいのかがわからず困っています。自分でこうではないかというソースコードを作成したのですが、何か違うような気もしています。
宜しければどうかご助力いただけませんでしょうか?
以下、該当メソッド部分のソースコードになります。

/* フィールド変数 */ private Connection con; // 接続オブジェクト private PreparedStatement ps; // ステートメント private ResultSet rs; // SELECT文の結果を受け取る /* param con 接続オブジェクト */ public Integer getId(Connection con){ /* SQL文を作成する */ StringBuilder sb = new StringBuilder(); sb.append("SELECT "); sb.append("MAX(ID) + 1 "); sb.append("AS ID "); sb.append("FROM "); sb.append("TABLE_LIST ");

//IDを格納する変数numを初期化
Integer num = 0;

try { // プリペアードステートメントを生成する ps= con.prepareStatement(sb.toString()); // SQL文発行 rs = ps. executeQuery(); num = rs.getInt("ID"); //"ID"という文字列から果たして結果が取得できるのでしょうか? }catch(Exception e){ e.printStackTrace(); }finally{ try{ // 後処理を行う if(ps!=null) ps.close(); if(ps!=null) ps.close(); if(con!=null) con.close(); }catch(SQLException e){ e.printStackTrace(); } }

//呼び出し元へ返す
return num;
}


以上になります。
宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

SELECT MAX(ID) + 1
は止めた方が良いかも。

取得された MAX(ID) + 1 のデータがINSERTされる前に、同時ユーザがいれば、重複してしまうことになります。最大値の管理テーブルを作り、以下の様に処理をした方が良いのでは?

主処理のsession(トランザクション)開始

最大値取得用のsession(トランザクション)開始

最大値管理テーブルをロック

最大値を取得、カウントアップしてコミット(ロック解除)

主処理

主処理のsessionをコミット(またはロールバック)

※ 主処理でこけたら飛び番ができます。

投稿2015/05/11 00:52

kantomi

総合スコア295

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

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

0

フィールド名で取得しようとすると、データベースの種類によっては大文字、小文字のどちらかしか使えないケースが出てきます。
列の順序(1から始まる)を指定するResultSet#getInt(int)を使用した方が確実です。

また、ご質問のポイント以外にもいくつか改善した方が良いと思われる箇所があります。
con,ps,rsはフィールドにする意味が無いので、必要になった時点でローカル変数を宣言するようにした方が良いでしょう。
・ Java7以降ではtry-with-resources文を使用した方が簡潔に書けます。
conはメソッドを呼び出している側で接続を切断するようにした方が良いです。(開けた人が閉じる)

以上を踏まえると、こんな感じになります。

lang

1// Java7以降 2 3// import java.sql.*; 4 5/* param con 接続オブジェクト */ 6public Integer getId(Connection con) { 7 8 /* SQL文を作成する */ 9 StringBuilder sb = new StringBuilder(); 10 sb.append("SELECT "); 11 sb.append("MAX(ID) + 1 "); 12 sb.append("AS ID "); 13 sb.append("FROM "); 14 sb.append("TABLE_LIST "); 15 16 //IDを格納する変数numを初期化 17 Integer num = 0; 18 19 // プリペアードステートメントを生成する 20 try (PreparedStatement ps = con.prepareStatement(sb.toString())) { 21 // SQL文発行 22 try (ResultSet rs = ps.executeQuery()) { 23 num = rs.getInt(1); 24 } 25 } catch (Exception e) { 26 e.printStackTrace(); 27 } 28 29 //呼び出し元へ返す 30 return num; 31}

投稿2015/05/10 04:32

編集2015/05/10 04:33
argius

総合スコア9388

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

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

touch

2015/05/10 13:41

ご回答有難うございます。 ご回答をもとに自身で調べていたところ少しずつ意味がわかってきました。 あとは自力で考えてみたいと思います。 重ねて感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問