2016-11-04 9 views
0

프로젝트에서 스프링 부트로 작업하고 있습니다. JdbcNamedTemplates는 DAO에서 데이터에 액세스하는 데 사용됩니다. 내 daos에 쿼리를 작성한 다음 런타임에 올바른 매개 변수를 얻기 위해 일부 매개 변수를 매핑합니다.스프링 애플리케이션에서 JDBCTemplate을 사용하여 다른 테이블 이름 처리하기

이제 요청에 따라 여러 개의 동일한 테이블에서 데이터를 검색해야합니다. 검색 논리는 다른 테이블 이름을 사용해야하는 것을 제외하고는 동일합니다. JdbcTemplate은 테이블 이름을 매개 변수로 사용할 수 없습니다. 내 쿼리가 최종 이길 바래서 문자열 서식을 사용하고 싶지 않습니다.

대부분의 기능과 테이블 이름의 차이를 처리하도록 확장 한 구체적인 클래스로 추상 클래스를 만들 수 있습니다 (기본적으로 "getTableName()"메서드 사용). 이 작동합니다. 그러나, 나는 많은 수업을 만들고있는 것처럼 보입니다. 나는 그들보다 적은 수업을 만들고 싶습니다.

더 좋은 방법이 있습니까?

특정 tablenames에 대한 인터페이스를 사용하는 것이 좋을 것이라고 생각했지만, 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()를 implemenent 데이터 액세스 개체의 몇 가지있다. 그래서 테이블이 "가을"이라면, 나는 가질 것입니다. 그래서 예로부터 당신은 내가 콘크리트의 DAO (가을, 겨울, 봄, 여름)의 몇을해야 할 것입니다 각 추상적 인 DAO에 대한 것을 볼 수 있습니다 위의

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

. 이것은 현재 받아 들여질 수 있지만 어느 시점에서는 상당히 커질 수 있습니다.

각 "시즌"/ 이름에 대해 단 하나의 클래스/인터페이스를 생성하고 필요에 따라 Dao1, Dao2 등에 연결하는 방법을 피하는 방법이 있는지 알고 싶습니다. 사용자 요청이 도착할 때 어떤 이름이 적절한 지 알 수 있습니다.

+0

"요청에 따라 여러 개의 동일한 테이블에서 데이터를 가져 오는 것을 처리해야합니다. 다른 테이블 이름을 사용해야 만 제외하고 검색 논리가 동일합니다"- 샘플을 제공 할 수 있습니까? – kuhajeyan

+0

인터페이스를 사용하고 다른 구현을 삽입 할 수 있습니다. bean @Qualifier. – Nano

+0

@Nano, 나는 주석이있는 멍청한 녀석이다. 마지막 업데이트를 고려하여 어떻게 작동하는지 자세히 설명해 주시겠습니까? – Riv

답변

0

@Qualifier ("nameOfBean")를 사용하면 찾고있는 인스턴스를 삽입 할 수 있습니다. 예를 들어 당신이있는 경우

: 상위 클래스 Dao1에 주입 할 수있는 두 개의 콩을 만드는이 경우

@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-injection-different-services-at-runtime-on-a-spring-with-with-spring-with- – Nano