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

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

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

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

Q&A

2回答

1149閲覧

抽象クラスを使った複数DB対応の共通ライブラリ実装方法(Java)

anpuru

総合スコア14

Java

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

0グッド

0クリップ

投稿2017/09/16 13:27

①実現したいこと
複数のDB(Mysql、Oracleなど)に対して、接続・更新処理などができる共通ライブラリの作成を考えています。
処理は、JDBCを利用して、DB接続、DB切断、DB検索、DB更新、トランザクション処理の最低限のことができればと思っております。

②自分で考えてみた構成
DB.java(抽象クラス)

java

1abstract class DB{ 2 abstract public void Connection(); 3 abstract public void Close(); 4 abstract public void ExecuteQuery(); 5 abstract public void ExecuteUpdate(); 6 abstract public void BeginTransaction(); 7 abstract public void Commit(); 8 abstract public void Rollback(); 9}

MySql.java(DB.javaを継承したクラス)

java

1class MySql extends DB{ 2 public void Connection(){ 3 //Mysql用の接続処理? 4 } 5}

Oracle.java(DB.javaを継承したクラス)

java

1class Oracle extends DB{ 2 public void Connection(){ 3 //Oracle用の接続処理? 4 } 5}

③調べたこと・分からないところ
調べたところ、抽象クラスで実現できるのではないかと思うのですが、
上記のように、抽象クラスと必要な抽象メソッドをその中で定義しておいて、
それを継承したクラスで、それぞれ用(Mysqlやその他のDB)の処理を書いていけばいいのか、
また、複数のDBでも共通部分はあると思うので、その部分をどういう形で書けばいいのかがいまいち理解できず、
悩んでおります。

どなたか、知っている方おりましたら、ご教授お願い致します。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

質問を拝見する限り JDBC による抽象化とほぼ同じレベルの抽象化を再設計しようとされているように思われます。
ExecuteQuery とかではなく、 CustomerQuery(顧客情報を検索する)などアプリケーションレベルのクラスなら抽象化して、何らかのメリットが得られると思いますが、データベースの操作レベルの抽象化であれば、JDBC 以上の抽象化を検討してメリットのある結果を得られるとは思えません。
デザインパターンの問題ではなく、アーキテクチャ設計の問題だと思います。

投稿2017/09/17 13:24

mit0223

総合スコア3401

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

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

0

DB アクセスに限らず、こういうケースにおける一つのパターンは、

BaseStuff.java

java

1abstract class BaseStuff { 2 public void exec() { 3 // 共通の処理 4 ... 5 this.doExec(); 6 // 共通の処理 7 } 8 abstract potected void doExec(); 9}

と親クラスを作っておいて、
SonStuff.java

java

1class SonStuff extends BaseStuff { 2 protected void doExec() { 3 // 具体的な処理 4 } 5}

とするものでしょうか。こういう共通処理がない場合は抽象クラスを使うより、インタフェースを使うべきでしょうし。

これは一つのパターンですが、他にもデザインパターンがあると思います。

投稿2017/09/16 13:39

unau

総合スコア2468

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

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

anpuru

2017/09/16 16:06

ご回答ありがとうございます。 まだ抽象クラスについて、理解しきれてないのですが、 ・共通処理の部分は、抽象クラスにpublic関数で記述する。 ・個別に処理が必要な場合(例えばmysqlとoracleで処理が違う場合)は、  抽象クラスでは、抽象メソッドだけ用意しておいて、継承したクラス(MySqlクラスなど)で処理を  記述する形にすればいいという認識であっておりますでしょうか?
unau

2017/09/16 16:29

これは Template Method というデザインパターンのひとつに相当しますが、唯一の正解ではありません。また、抽象クラスを使うことを目的のように書かれていますが、本来は逆で、「共通する流れがあって、ところどころ、それぞれの対象に合わせた処理を差し込んで利用」という要求には Template Method というパターンが向いており、これを Java で実装する場合は抽象クラスも利用する、ということです。WEB アプリにおけるテンプレートエンジンとか printf 関数とかの「テンプレート」とそこへの差し込み、というのはご理解いただけるでしょうか。Template Method パターンでは、親クラスで Template を作り、そこに子クラスごとに関数をはめ込んでいく形になります。 「Java Template Method パターン」で調べると、参考になるページを見つけられると思います。 というのを踏まえてご質問に答えます。 まず、おおむね理解はあっていると思います。 「共通処理の部分は、抽象クラスにpublic関数で記述する」ですが、だいたい合っていますが、public なのは、この関数を外から使いたいからです。もし、クラス内部で呼びたい関数があって、その中で共通処理を行なうなら、その関数は protected でもよいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問