Spring Boot 2 + JdbcTemplate - 有没有办法为每个支持的数据库提供 SQL 查询?
Posted
技术标签:
【中文标题】Spring Boot 2 + JdbcTemplate - 有没有办法为每个支持的数据库提供 SQL 查询?【英文标题】:Spring Boot 2 + JdbcTemplate - is there a way to provide SQL query for each database supported? 【发布时间】:2021-02-05 13:06:49 【问题描述】:我正在开发一个基于 Spring Boot 2.4.2 的项目并使用“spring-boot-starter-jdbc”和“com.oracle.database.jdbc " 用于 Oracle Jdbc 驱动程序。
当我使用 JdbcTemplate 与 DB 进行交互时,一切看起来都干净利落。但我将来可能需要支持多种数据库类型——Oracle、SQL Server、mysql、DB2 等。 做了相当多的谷歌搜索,但没有找到任何选项..
如上所述,我使用的是 Spring-Jdbc(不是 Spring Data JDBC 或 Spring Data JPA) - 我如何提供特定于代码或配置中支持的每个数据库的 SQL 查询?
请告诉我你的想法。谢谢。
【问题讨论】:
【参考方案1】:我不熟悉 Spring JDBC,但您可以使用 Spring 依赖注入机制为每个数据库创建配置文件。
首先是一个界面:
public interface DbQueries
String createQueryForSelectingUsers();
然后为每个支持的数据库实现接口:
@Profile("mysql")
@Component
public class MySqlDbQueries implements DbQueries
@Override
public String createQueryForSelectingUsers()
return "SELECT * FROM USER";
第二个例子:
@Profile("oracle")
@Component
public class OracleDbQueries implements DbQueries
@Override
public String createQueryForSelectingUsers()
return "SELECT * FROM USER";
然后在需要的地方使用它:
public class MyRepository
private DbQueries dbQueries;
// DbQueries implementation will be injected based on your current profile
public MyRepository(DbQueries dbQueries)
this.dbQueries = dbQueries;
public void printAllUsers()
String query = dbQueries.createQueryForSelectingUsers();
// stuff to execute query
请记住使用带有 e.q. 的配置文件启动您的应用。 --spring.profiles.active=mysql
或将活动配置文件信息添加到 application.properties
:
spring.profiles.active=mysql
【讨论】:
谢谢马尔辛。我没有考虑使用 Profiles,因为我打算将包含 DB 详细信息的 application.properties 放在与 Spring Boot jar 相同的文件夹中。对于配置文件,用户需要另外传递配置文件名称,即使在外部 application.properties 文件中指定了他们的数据库详细信息。 可以在application.properties中应用active profile,添加一行:spring.profiles.active=mysql 也许我必须在 Spring Boot 的主类中以编程方式设置配置文件值,即带有 @SpringBootApplication 的类 - 基于应用程序中设置的驱动程序类,属性。所以至少这种方式用户不需要手动设置配置文件。如果 Spring Boot 没有提供任何内置功能,或者除非有人提出更好的建议,我会接受这是一个答案。谢谢。以上是关于Spring Boot 2 + JdbcTemplate - 有没有办法为每个支持的数据库提供 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章