2017-07-07 4 views
2

Hier ist meine grundlegende DAO-Implementierungsklasse:Wie konfiguriere ich manuell eine JdbcTemplate im Spring Boot?

@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; 

    } 
} 

Die jdbcTemplate liest automatisch die spring.datasource Eigenschaften aus meiner application.properties Datei, das ist toll, aber es enthält mein DB-Passwort, das etwas ist, ich will nicht zu begehen. Stattdessen würde ich es lieber von einer lokalen server.properties Datei lesen, die ich einfach aus einer Java-Klasse lesen kann.

Gibt es eine Möglichkeit, die jdbcTemplate mit Java zu konfigurieren? Ich habe mehrere Beispiele mit einer Bean und XML gesehen, aber keine mit Java.

+1

Dann begehen Sie es nicht ... Anstatt mit dem Framework zu arbeiten, arbeiten Sie mit dem Framework. Geben Sie entweder beim Starten der Anwendung das Kennwort als Parameter an oder fügen Sie eine 'application.properties' neben dem jar oder set als Umgebungsvariable ein. In der [Referenzanleitung] (https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html) erfahren Sie, wie und wo Sie Eigenschaften lesen können. –

Antwort

2

erklären Sie einfach eine JdbcTemplate Bohne:

@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); 
} 

Ein anderer Weg ist nicht zu Setup-Datenquelle Parameter in Ihrer application.properties Datei, aber es zur Laufzeit statt zu erklären. Wenn Sie Ihre App ausführen, können Sie alle in application.properties definierten Eigenschaften überschreiben oder neue definieren.

Zum Beispiel:

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

Je anspruchsvoller Weg ist spring-cloud-config-server oder Consul zu verwenden, um Ihre Einstellungen zu verwalten.

+0

Ich habe diese Funktion in eine neue Klasse 'DatabaseConfig' geschrieben, aber wie implementiere ich sie in meinem DAO? – nicholas79171

+0

In DAO injiziere einfach 'JdbcTemplate' so wie es funktionieren sollte wie vorher –

+0

Ich musste' @EnableAutoConfiguration (exclude = {DataSourceAutoConfiguration.class}) 'zur Hauptanwendung hinzufügen um die automatische Konfiguration der JDBC Vorlage zu verhindern aber dann hat es geklappt! Vielen Dank! – nicholas79171

0

Sie können Eigenschaften geben wie unten:

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

eine Konfigurationsklasse erstellen:

@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); 
     }} 

In Ihrer Hauptanwendungsklasse, sind diese Konfigurationsdatei:

@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); 
    }} 

Dann in deiner Klasse, wo du das spritzen musst Vorlage:

@Autowired 
    private JdbcTemplate localJdbcTemplate; 
+0

Das scheint eine Menge Arbeit, nur um eine Datenquelle zu konfigurieren, gibt es keinen einfacheren Weg? – nicholas79171

Verwandte Themen