2016-11-04 4 views
0

私はプロジェクトでSpringBootを扱っています。 JdbcNamedTemplatesはデータにアクセスするためにDAOで使用されます。私は、私のdaosでクエリを書いて、正しいデータを得るために実行時にいくつかのパラメータをマップします。SpringアプリケーションでJDBCTemplateを使用して異なるテーブル名を扱う

ここで、要求に応じて複数の同一のテーブルからデータを取得する必要があります。他のテーブル名を使用する必要がある以外は、検索ロジックは同じです。 JdbcTemplateでは、テーブル名をパラメータとして使用できません。私はクエリを最終的にしたいので、文字列の書式設定を使用したくない。

ほとんどの機能とそれを拡張してテーブル名の違いを処理する具象クラス(基本的には "getTableName()"メソッド)を持つ抽象クラスを作成できました。これは機能します。しかし、私はたくさんのクラスを作っているようで、それらのクラスを少なくしたいと思っています。

もっと良い方法がありますか?

私は、特定のテーブルの名前にインターフェイスを使用するのがいいと思っていましたが、SpringとAutowiringでどのように動作するかを頭に入れてはいけません。

UPDATE:

はちょうど私が改善したいもののサンプルを与えます。 これまでのところ、私はこのような抽象DAOのカップルを持っています。彼らはデータベースの話をします。

public abstract class Dao1 { 
    private static final String PARAM = "p"; 
    private final String QUERY1 = " SELECT * FROM " + getTableName() + " WHERE something"; 
    //here we would also have autowired jdbcNamedTemplate and maybe some other stuff. 
    public getAll() { 
     //map parameters, do query return results 
    } 
    protected abstract String getTableName(); 
} 

次に、私は抽象メソッドgetTableName()を実装するデータアクセスオブジェクトをいくつか持っています。テーブルが "秋"だったら、私は持っていなければならない。

だから、
@Component 
public class AutumnDao1 extends Dao1 { 
    @Override 
    protected String getTableName() { 
     return "AUTUMN"; 
    } 
} 

あなたは、各抽象DAOのために、私はコンクリートDAOS(秋、冬、春、夏)のカップルをしなければならないだろうと見ることができ、上記の例から。これは現在受け入れられていますが、ある時点ではかなりの規模のダウのコレクションに成長するかもしれません。

「シーズン」/名前ごとに1つのクラス/インターフェイスを作成し、必要に応じて何らかの形でDao1、Dao2などにアタッチして回避する方法があるかどうかを知りたいと思います。私は、ユーザーの要求が到着したときに、どの名前が関連しているかを知るだけです。

+0

"要求に応じて複数の同一テーブルからデータを取得する必要があります。異なるテーブル名を使用する必要がある以外は、検索ロジックは同じです" - サンプルを提供できますか? – kuhajeyan

+0

インタフェースを使用して試したり、 bean @Qualifier。 – Nano

+0

@Nano、私はアノテーションをつけたノブです。私の最後の更新を考慮してどのように動作するかを詳しく教えてください。 – Riv

答えて

0

@Qualifier( "nameOfBean")を使用すると、探しているインスタンスを挿入できます。たとえば、あなたが持っている場合は

、:あなたが親クラスDao1に注入することができる2つのBeanを作成している。この場合

@Component 
public class AutumnDao1 extends Dao1 { 
    @Override 
    protected String getTableName() { 
     return "AUTUMN"; 
    } 
} 

@Component 
public class SummerDao1 extends Dao1 { 
    @Override 
    protected String getTableName() { 
     return "SUMMER"; 
    } 
} 

。正しいものを注入するには、次の操作を行う必要があります。

@Autowire 
@Qualifier("autumnDao1") 
private Dao1 autumnDao; 

@Autowire 
@Qualifier("summerDao1") 
private Dao1 summerDao; 

+0

お返事ありがとうございます!しかし、実行時にWualifierを選択する方法はありますか? – Riv

+0

ええと、私はまだ手がかりがありません。この質問をチェックし、あなたが探していたものかどうか教えてください! http:// stackoverflow。com/questions/26463393/with-inject-different-services-at-runtime-on-a-property-with-spring-with – Nano

関連する問題