我在一个使用Spring JDBC与数据库接口的应用程序中使用Spring Framework
版本5.3.10
。
我试图将SQL查询隔离到.properties
文件。我知道有很多方法可以做到这一点,但我想知道是否有一种方法可以注入所有的值,对于@PropertySource("classpath:database/queries.properties")
引用的给定.properties
文件到Properties
(或Map
)类型。
例如,如果我有一个"存储库"。(或DAO,由您命名)类,如下所示:
@Repository
@RequiredArgsConstructor
@PropertySource("classpath:database/queries.properties")
public class ThisJdbc implements IThisJdbc {
private final Map<String, String> sqlStore; // ...values from queries.properties here
private final Properties sqlStore; // ...or here
@Override
public int[] batchInsert(final List<This> these) {
sqlStore.get("batch-insert");
...
}
...
}
我想要一种简单的方法来注入通过上述类型提供给该类的.properties
文件中的内容-或任何其他可用的键/值类型。.properties
文件和往常一样:
find-all = select * from tb_this
find-by-col_1 = select * from tb_this where col_1 = :col_1
insert-record = insert into tb_this values (:col_1, :col_2, :col_3)
请注意,在所有这些类中注入
Environment
对我来说不是一个选项;)
我正在寻找一种方法来使用@Value
与固定的前缀-类似于Spring Boot的@ConfigurationProperties
,但我找不到任何东西。
基本上,我想看看是否有一种方法使用@PropertySource
和任何Map
类似的类型来避免有这个:
@Bean(name = "this-queries")
public PropertiesFactoryBean thisQueries() {
final var bean = new PropertiesFactoryBean();
bean.setLocation(new ClassPathResource("database/queries.properties"));
return bean;
}
@PropertySource
将与@Configuration
类一起使用。话虽如此,请尝试以下操作:
@Repository
@Configuration
@RequiredArgsConstructor
@PropertySource("classpath:database/queries.properties")
public class ThisJdbc implements IThisJdbc {
@Value("#{${queries}}")
private final Map<String, String> sqlStore; // ...values from queries.properties here
@Override
public int[] batchInsert(final List<This> these) {
sqlStore.get("batch-insert");
...
}
...
}
假设你的queries.properties
是:
queries = {key1:'query1',key2:'query2',....}