2017-07-07 11 views
2

が私の基本的なDAO実装クラスです:SpringブートでJdbcTemplateを手動で設定するにはどうしたらいいですか?ここで

@Repository 
public class MeetingDaoImpl implements MeetingDao { 

    @Autowired 
    JdbcTemplate jdbcTemplate; 

    public boolean insertNewMeeting(String initials, String meetingId, int numYears) { 

    int numRowsAffected = jdbcTemplate.update(SQLConstants.INSERT_NEW_MEETING, 
     new Object[] {initials.toLowerCase(), meetingId, numYears}); 

    return numRowsAffected > 0; 

    } 
} 

jdbcTemplateは自動的に素晴らしいですが、私のapplication.propertiesファイルからspring.datasourceプロパティを読み込み、それは私がコミットしたくないものです私のDBのパスワードが含まれています。代わりに、ローカルのserver.propertiesファイルから読み込み、Javaクラスから簡単に読むことができます。

JavaでjdbcTemplateを設定する方法はありますか?私は、BeanとXMLを使用して複数の例を見てきましたが、Javaはありません。

+1

次にコミットしないでください。フレームワークを回避する代わりに、フレームワークを操作してください。アプリケーションを起動するときにパラメータとしてパスワードを指定するか、jarファイルの隣にある 'application.properties'を置くか、環境変数として設定します。プロパティを読む方法と場所については、[リファレンスガイド](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html)を参照してください。 –

答えて

2

だけJdbcTemplate Beanを宣言します。

@Bean 
JdbcTemplate jdbcTemplate() throws IllegalAccessException, InvocationTargetException, InstantiationException { 
    // extract this 4 parameters using your own logic 
    final String driverClassName = "org.h2.Driver"; 
    final String jdbcUrl = "jdbc:h2:mem:test"; 
    final String username = "sa"; 
    final String password = ""; 
    // Build dataSource manually: 
    final Class<?> driverClass = ClassUtils.resolveClassName(driverClassName, this.getClass().getClassLoader()); 
    final Driver driver = (Driver) ClassUtils.getConstructorIfAvailable(driverClass).newInstance(); 
    final DataSource dataSource = new SimpleDriverDataSource(driver, jdbcUrl, username, password); 
    // or using DataSourceBuilder: 
    final DataSource dataSource = DataSourceBuilder.create().driverClassName(driverClassName).url(jdbcUrl).username(username).password(password).build(); 
    // and make the jdbcTemplate 
    return new JdbcTemplate(dataSource); 
} 

もう一つの方法は、あなたのapplication.propertiesファイル内の設定データソースパラメータにではなく、実行時にそれを宣言すること。アプリを実行しているときは、application.propertiesに定義されているプロパティを上書きするか、新しいプロパティを定義できます。例えば

java -jar my-spring-boot-app.jar --spring.datasource.url=jdbc:h2:mem:test --spring.datasource.username=sa --spring.datasource.password=secret

より洗練された方法は、あなたの設定を管理するためのspring-cloud-config-serverまたはConsulを使用することです。

+0

この関数を新しいクラスの 'DatabaseConfig'に入れましたが、どうやってDAOに実装するのですか? – nicholas79171

+0

DAOでは、前のように 'JdbcTemplate'を挿入するだけです。 –

+0

JDBCテンプレートの自動設定を防ぐために、' @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}) 'をメインアプリケーションクラスに追加する必要がありました、しかしそれは働いた!ありがとう! – nicholas79171

0

あなたは以下のような特性を与えることができます。

datasource.local.url= datasource.local.driver-class-name= datasource.local.username= datasource.local.password=

を設定するクラスを作成します。メインアプリケーションクラスで

@Configuration 
    @ConfigurationProperties("datasource.local") 
    @EnableJpaRepositories(
     basePackages = "com...", 
     transactionManagerRef = "localTransactionManager", 
     entityManagerFactoryRef = "localEntityManagerFactory" 
    ) 
    public class OracleConfiguration { 
    @NotNull 
    private String username; 
    @NotNull 
    private String password; 

    @NotNull 
    private String url; 

    private String driverClassName; 


    public void setUsername(String username) { 
     this.username = username; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    @Bean 
    DataSource localDataSource() throws SQLException { 

     return DataSourceBuilder 
       .create() 
       .url(this.url) 
       .username(this.username) 
       .password(this.password) 
       .driverClassName(this.driverClassName) 
       .build(); 
    } 

    public String getDriverClassName() { 
     return driverClassName; 
    } 

    public void setDriverClassName(String driverClassName) { 
     this.driverClassName = driverClassName; 
    } 

    @Bean 
    @Autowired 
    public PlatformTransactionManager localTransactionManager(@Qualifier("localEntityManagerFactory") 
                      EntityManagerFactory entityManagerFactory) { 
     return new JpaTransactionManager(entityManagerFactory); 
    } 

    @Bean 
    @Autowired 
    public LocalContainerEntityManagerFactoryBean localEntityManagerFactory(@Qualifier("localDataSource")DataSource dataSource) { 

     HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); 

     LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); 

     factoryBean.setDataSource(dataSource); 
     factoryBean.setJpaVendorAdapter(jpaVendorAdapter); 
     factoryBean.setPackagesToScan("com..."); 

     return factoryBean; 
    } 
    @Bean 
    @Autowired 
    public JdbcTemplate localJdbcTemplate(@Qualifier("localDataSource")DataSource dataSource) { 
      return new JdbcTemplate(dataSource); 
     }} 

を、この設定ファイルが含ま:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class, 
     DataSourceTransactionManagerAutoConfiguration.class }) 
@EnableTransactionManagement 
@Import({ OracleConfiguration.class}) 
public class MyApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(MyApplication.class, args); 
    }} 

をあなたのクラスでは、テンプレート:

@Autowired 
    private JdbcTemplate localJdbcTemplate; 
+0

これはデータソースを設定するだけの非常に多くの作業のようですが、もっと簡単な方法はありませんか? – nicholas79171

関連する問題