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

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

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

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

Q&A

解決済

2回答

1077閲覧

finallyの処理する中身をメソッドでまとめて出力したい

ai_atoz

総合スコア2

Java

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

0グッド

1クリップ

投稿2021/01/28 08:50

登録以外の処理をする際に利用できるようにcloseメソッドでまとめようと考えています。
closeメソッドのConnectionとPreparedStatementをnullではなく実際に利用しているinsertメソッドからConnectionとPreparedStatementを持ってきてクローズしたいのですがどのように持ってくるのかがわかりません。
ご教授頂ければ幸いです。

Dao

1import java.sql.Connection; 2import java.sql.DriverManager; 3import java.sql.PreparedStatement; 4import java.sql.SQLException; 5 6public class Dao { 7 private static final String URL = "jdbc:mysql://localhost:3306/aaa?characterEncoding=UTF-8&serverTimezone=JST"; 8 private static final String USER = "bbb"; 9 private static final String PASS = "ccc"; 10 private static final String DRIVE = "com.mysql.cj.jdbc.Driver"; 11 12 private Connection getConnection() throws SQLException, ClassNotFoundException { 13 Connection con = null; 14 Class.forName(DRIVE); 15 con = DriverManager.getConnection(URL, USER, PASS); 16 con.setAutoCommit(false); 17 return con; 18 } 19 20 void close() throws SQLException, ClassNotFoundException { 21//ここのConnectionとPreparedStatementの部分です。 22 Connection con = null; 23 PreparedStatement ps = null; 24 try { 25 if (ps != null) { 26 ps.close(); 27 } 28 } catch (SQLException e) { 29         e.printStackTrace(); 30 } 31 try { 32 if (con != null) { 33 con.close(); 34 } 35 } catch (SQLException e) { 36         e.printStackTrace(); 37 } 38 } 39 public void insert(Dto dto) throws SQLException { 40 PreparedStatement ps = null; 41 Connection con = null; 42 try { 43 con = getConnection(); 44 45StringBuilder INSERT_SQL = new StringBuilder(); 46 INSERT_SQL.append("INSERT INTO aaa ("); 47 INSERT_SQL.append("ID,"); 48 INSERT_SQL.append("name,"); 49 INSERT_SQL.append("remarks)"); 50 INSERT_SQL.append("VALUES (?,?,?)"); 51 String sql = INSERT_SQL.toString(); 52 ps = con.prepareStatement(sql); 53 ps.setInt(1, dto.getID()); 54 ps.setString(2, dto.getName()); 55 ps.setString(3, dto.getRemarks()); 56 ps.executeUpdate(); 57 con.commit(); 58 } catch (ClassNotFoundException | SQLException e) { 59 con.rollback(); 60 } finally { 61 close(); 62 } 63 } 64}

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

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

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

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

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

dodox86

2021/01/28 08:57

> finallyの処理する中身をメソッドでまとめて出力したい 言いまわしが少し謎(?)なので確認です。close()メソッドにConnectionとPreparedStatementの引数を増やせばよいと思うのですが、そういう話ではなくて? でしょうか。
ai_atoz

2021/01/28 13:35

説明がわかりにくく申し訳ありません。 引数を増やすというのはclose()メソッドにどのような処理を記述すればよろしいのでしょうか?
guest

回答2

0

ベストアンサー

closeメソッドのConnectionとPreparedStatementをnullではなく実際に利用しているinsertメソッドからConnectionとPreparedStatementを持ってきてクローズしたいのですがどのように持ってくるのかがわかりません。

最低限、質問者さんの現状のコードとやりたいことに沿うかたちにするならば、insert()メソッド内で生成したConnectionPreparedStatementclose()メソッドの引数にすることが考えられます。以下はそのようにしたコード例です。closeAnyway()メソッドをご覧ください。

Java

1import java.sql.Connection; 2import java.sql.DriverManager; 3import java.sql.PreparedStatement; 4import java.sql.SQLException; 5 6public class Dao { 7 private static final String URL = "jdbc:mysql://localhost:3306/aaa?characterEncoding=UTF-8&serverTimezone=JST"; 8 private static final String USER = "bbb"; 9 private static final String PASS = "ccc"; 10 private static final String DRIVE = "com.mysql.cj.jdbc.Driver"; 11 12 private Connection getConnection() throws SQLException, ClassNotFoundException { 13 Connection con = null; 14 Class.forName(DRIVE); 15 con = DriverManager.getConnection(URL, USER, PASS); 16 con.setAutoCommit(false); 17 return con; 18 } 19 20 void close() throws SQLException, ClassNotFoundException { 21//ここのConnectionとPreparedStatementの部分です。 22 Connection con = null; 23 PreparedStatement ps = null; 24 try { 25 if (ps != null) { 26 ps.close(); 27 } 28 } catch (SQLException e) { 29 e.printStackTrace(); 30 } 31 try { 32 if (con != null) { 33 con.close(); 34 } 35 } catch (SQLException e) { 36 e.printStackTrace(); 37 } 38 } 39 40 // SQLExceptionもClassNotFoundExceptionもthrowしないので、throws...は不要。 41 // インスタンスメソッドである必要もないので、staticなクラスメソッドで十分。 42 private static void closeAnyway(Connection con, PreparedStatement ps) { 43 try { 44 if (ps != null) { 45 ps.close(); 46 } 47 } catch (SQLException e) { 48 e.printStackTrace(); 49 } 50 51 try { 52 if (con != null) { 53 con.close(); 54 } 55 } catch (SQLException e) { 56 e.printStackTrace(); 57 } 58 } 59 60 public void insert(Dto dto) throws SQLException { 61 PreparedStatement ps = null; 62 Connection con = null; 63 try { 64 con = getConnection(); 65 66 StringBuilder INSERT_SQL = new StringBuilder(); 67 INSERT_SQL.append("INSERT INTO aaa ("); 68 INSERT_SQL.append("ID,"); 69 INSERT_SQL.append("name,"); 70 INSERT_SQL.append("remarks)"); 71 INSERT_SQL.append("VALUES (?,?,?)"); 72 String sql = INSERT_SQL.toString(); 73 ps = con.prepareStatement(sql); 74 ps.setInt(1, dto.getID()); 75 ps.setString(2, dto.getName()); 76 ps.setString(3, dto.getRemarks()); 77 ps.executeUpdate(); 78 con.commit(); 79 } catch (ClassNotFoundException | SQLException e) { 80 if (con != null) { 81 con.rollback(); 82 } 83 } finally { 84 //close(); 85 // とにかく可能な限りcloseする、と言う意味を込めて: 86 closeAnyway(con, ps); 87 } 88 } 89} 90

SQL実行中の例外(Exception)関連のハンドリングは意外と難しく、様々なやり方が提案されています。上記例はtrycatchif文だらけで仕方が無いとは言え、コードとして見た目が不格好ですよね。上記の例にこだわらず、他の良質なサンプルコードなどを見、理解した上で必要に応じて改善していくのも良いことだと思います。

投稿2021/01/29 03:32

dodox86

総合スコア9256

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

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

ai_atoz

2021/01/29 10:27

質問にお答えくださりありがとうございました。 コードを参考にさせていただきました。 理解できていないところも多々ありましたので学習しながら理解を深めていきたいと思います。
guest

0

try {

con = getConnection();

これは入れ替えておかないと、catchのときに、ヌルポになりますよ

投稿2021/01/28 09:01

y_waiwai

総合スコア88042

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

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

ai_atoz

2021/01/28 13:38

そうなのですね。 ご指摘ありがとうございます。
y_waiwai

2021/01/28 13:40

getConnection() の実行で例外でたら、ってことですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問