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

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

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

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

Java

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

Q&A

解決済

1回答

7623閲覧

Connection,ResultSet,Statementオブジェクトのclose方法

退会済みユーザー

退会済みユーザー

総合スコア0

JDBC

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

Java

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

0グッド

0クリップ

投稿2018/02/14 07:58

編集2018/02/15 00:25

表題について、参考書によくわからないソースがいくつかありました。
ソースにコメントで番号をふったところです。

下記は従業員IDで従業員テーブルの従業員情報(名前、年齢等)を検索するというサンプルです。

※Javaのバージョン7です。
※importは省いています。

public class Search {    public void execute(HttpServletRequest request) throws SQLException { //コントローラから最初に呼びだされるメソッド BeanDaoTest daoTest = null; String empId = request.getParameter("paramId"); try { EmpBean empBean = daoTest.getEmpData(Integer.parseInt(empId)); //省略(結果のempBeanをsetAttribute()したり、該当する従業員がいないエラーだしたり。) } finally { if (daoTest != null) { daoTest.close();  //③ } } } } public class BeanDaoTest { private Connection connection; public BeanDaoTest() throws SQLException { String url = ○○; String user = ○○; String password = ○○; connection = DriverManager.getConnection(url, user, password); } public void close() { try { if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } public EmpBean getEmpData(int empId) throws SQLException {   EmpBean bean = null; PreparedStatement pstatement = null; ResultSet result = null; try { //省略(SQL実行、結果取得)        if (result.next()) {          bean = new EmpBean(); //セッターゲッターのクラス //省略(beanに結果セット) } } finally { result.close();  //② pstatement.close();  //① } return bean; } }

①getEmpData()のfinally句でPreparedStatementオブジェクトのclose時、null判定をしないといけないと思うのですが、間違いないですか?
もしPreparedStatementオブジェクトの生成前に例外が発生した場合、NullPointerExceptionが発生してしまうという認識です。

②ResultSetオブジェクトのclose時も、このソースの場合はnull判定必要ですよね?
ResultSetオブジェクトは、結果がない場合nullではなく一行もない状態になるので、close時もnull判定はいらないそうですが、今回は最初にnullで初期化しているので、①と同じ理由で必要かと思いました。

③Connectionオブジェクトですが、このソースでは呼び出し元でcloseされています。
何か理由があるのでしょうか?
何か意図があってこうなっているようにも見えるのですが、ResultSetやPreparedStatementと同じfinally句でcloseしてはいけなかったのでしょうか?

長々と失礼致しました。回答お待ちしております。

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

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

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

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

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

unz.hori

2018/02/14 09:59

質問する際は、Javaのバージョン等を詳細に記述しましょう。回答が微妙に変わってきたりします。
退会済みユーザー

退会済みユーザー

2018/02/15 00:18

ご指摘ありがとうございます。今後気をつけます。
guest

回答1

0

ベストアンサー

■重要な点
1,try~with~Resources文という便利な構文があるので、そちらを使ってくださいな。
BeanDaoTest クラスに関しては
a,BeanDaoTest implements AutoCloseableに変更
b,closeメソッドに@overrideアノテーションを追加
という形で対応できるかと。

2,参考書の質問は出版サイトのサポートに問い合わせると的確な回答が返ってくるかと。

■質問に対する回答
質問1と質問2…はい、nullチェックが必要です。

質問3
推測になってしましますが、BeanDaoTest でgetEmpData以外のメソッドを追加時(getItemDataなど)にコネクションを維持したかったのではないかと。

投稿2018/02/14 08:19

編集2018/02/14 09:24
umyu

総合スコア5846

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

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

退会済みユーザー

退会済みユーザー

2018/02/15 00:13

わかりやすい回答ありがとうございました。 try-with-Resource文使ってみます! 質問③については、出版サイトのサポートに問い合わせてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問