209. 데이터베이스 아이디 프로바이더 (databaseIdProvider)

2012. 4. 23. 08:21공부/MYBATIS

마이바티스는 데이터베이스 벤더에 따른 다양한 구문을 실행할 수 있어. 다중 벤더 지원은 매핑된 구문의 databaseID 속성에 기초하지. databasID가 없으면 마이바티스는 모든 구문을 로드하겠지만, databaseID가 있으면 그에 맞는 하나만 로드해. databaseID가 있고 없는 동일 구문이 발견된 경우에 databaseID가 없는 구문은 무시돼. 다중 벤더 지원을 가능하게 하려면 databaseIdProvider 를 mybatis-config.xml 파일에 다음과 같이 기술해

<databaseIdProvider type="VENDOR" />

VENDER 구현체 databaseIdProvider는 DatabaseMetaData#getDatabaseProductName()에 의해 리턴된 문자열로 databaseId를 세팅해. 그 문자열이 너무 길거나같은 제품의 다른 버전일 경우 다른 값을  리턴해. 그래서 다음과 같은 프라퍼티를 추가해서 짧게 변환할 수도 있어.

<databaseIdProvider type="VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="DB2" value="db2"/>        
  <property name="Oracle" value="oracle" />
</databaseIdProvider>

프라퍼티가 추가되면, VENDOR databaseIdProvider는 리턴된 데이터베이스 제품 이름으로부터 발견된 첫번째 키에 알맞는 프라퍼티 값을 찾거나 매칭되는 값이 없다면 'null'을 찾을 거야. 이 경우, 만일 getDatabaseName()이 'Oracle(DataDirect)'을 리턴하면, databaseId가 'oracle'로 세팅될거야.

org.apache.ibatis.mapping.DatabaseIdProvider 인터페이스를 구현함으로써 너만의 DatabaseIdProvider를 만들 수 있고, mybatis-config.xml에 그것을 등록할 수 있어.

public interface DatabaseIdProvider {

  void setProperties(Properties p);
  
  String getDatabaseId(DataSource dataSource) throws SQLException;
}