2009-11-23 2 views

답변

12

스프링에는 더피모가 연결되어있는 솔루션의 보일러 플레이트 측면을 처리 할 수있는 객체가 DatabaseMetaDataCallback 있습니다. 그런 다음 JDBCUtils.extractDatabaseMetaData을 호출 할 때 해당 객체를 전달할 수 있습니다.

이러한 클래스를 사용하여 동일한 호출을 작성하는 예는 here입니다. 링크에서

샘플 코드 :

등급 :

class GetTableNames implements DatabaseMetaDataCallback { 

     public Object processMetaData(DatabaseMetaData dbmd) throws SQLException { 
      ResultSet rs = dbmd.getTables(dbmd.getUserName(), null, null, new String[]{"TABLE"}); 
      ArrayList l = new ArrayList(); 
      while (rs.next()) { 
       l.add(rs.getString(3)); 
      } 
      return l; 
     } 
    } 

사용법 :

GetTableNames getTableNames = new GetTableNames(); 
try { 
    Object o = JdbcUtils.extractDatabaseMetaData(dataSource, getTableNames); 
    System.out.println(o); 
} catch (MetaDataAccessException e) { 
    System.out.println(e); 
} 
+2

+1 - 이것은 지금까지 최고의 답변입니다. 좋은. – duffymo

4

항상 Connection을 사용하여 java.sql.DatabaseMetaData를 가져올 수 있습니다. SimpleJdbcTemplate에는 도움이되는 메소드가 없지만 솔직히 필요는 없습니다.

DatabaseMetaData md = c.getMetaData(); 
ResultSet rs = md.getTables(null, null, "%", null); 
while (rs.next()) { 
    System.out.println(rs.getString(3)); 
} 
+0

그것은 봄 측면 인해 트랜잭션 관리자의 상호 작용 또는 무언가에 중요 가능성이 있습니다. – bmargulies

+1

이와 같은 읽기 전용 작업에는 트랜잭션이 필요하지 않다고 생각합니다. 유일한 문제는 결과가 무효화되는 방식으로 작업을 수행하는 동안 다른 사람이 스키마를 변경하는 경우 일 수 있습니다. 그러한 일이 발생할 수 있다면, 당신은 훨씬 더 큰 문제가 있습니다. – duffymo

+1

해당 링크가 현재 phising 사이트로 리디렉션됩니다 – Justin

1

USER_TABLES 뷰를 쿼리하면 가져올 수 있습니다.

물론 sqlplus를 둘러싼 모양이 제일 먼저 보입니다.

+0

제 경험상, 응용 프로그램의 "테이블"은 종종 다른 스키마의 테이블과 동의어이므로 ALL_TABLES도 쿼리해야 할 수 있습니다. 내게서 – Dan

관련 문제