簡體   English   中英

如何在Spring Boot中手動配置JdbcTemplate?

[英]How do I manually configure a JdbcTemplate in Spring Boot?

這是我的基本DAO實現類:

@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屬性,這很棒,但是它包含我不想提交的數據庫密碼。 相反,我想從本地server.properties文件讀取它,而我可以很容易地從Java類讀取它。

有沒有辦法用Java配置jdbcTemplate 我已經看到了多個使用bean和XML的示例,但沒有使用Java的示例。

只需聲明一個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-serverConsul來管理您的設置。

您可以提供以下屬性:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM