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 JDBCSpring 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 查询?的主要内容,如果未能解决你的问题,请参考以下文章

Java自学!spring-kafka监听器不好使

Spring基础:JDBCTemplate的使用

spring中JDBCTemplate的简单应用

全网首发!java将内容写入文件

原来SqlSession只是个甩手掌柜?真香

java主流框架ssm,附带学习经验