Реализация поддержки библиотекой подключений к разным БД

Рейтинг: 0Ответов: 0Опубликовано: 27.01.2023

Имеется библиотека, которая используя JDBC подключается к БД по указанной строкe подключения.
На данный момент поддерживается только MS SQL, но необходимо добавить поддержку и других баз данных. В идеале библиотека должна работать с любыми БД, для которых имеется JDBC драйвер. Проблема в том, что я не могу протестировать/установить все возможные БД. Конечно сразу приходит на ум ORM, но библиотека нужна именно для работы с java.sql.* классами, а также имеется запрет на ORM со стороны руководства.

Насколько я понимаю, то для добавления поддержки работы с разными БД мне необходимо:

  • определять тип необходимого драйвера по строке подключения и регистрировать;
  • иметь в списке зависимостей библиотеки (pom.xml) все поддерживаемые JDBC драйвера для регистрации;

Так ли это реализуется или имеется более правильный способ? Нужна ли в принципе регистрация драйвера?

Фрагмент pom.xml:

<!-- https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc -->
<dependency>
  <groupId>com.microsoft.sqlserver</groupId>
  <artifactId>mssql-jdbc</artifactId>
  <version>${mssql-jdbc}</version>
  <!--
       Будет ли возникать ошибка
       при недоступности одного или
       нескольких драйверов в runtime?
       С runtime scope компиляция не выполняется.
  -->
  <!-- <scope>provided</scope> -->
</dependency>
<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc11 -->
<dependency>
  <groupId>com.oracle.database.jdbc</groupId>
  <artifactId>ojdbc11</artifactId>
  <version>${ojdbc}</version>
  <!--
       Будет ли возникать ошибка
       при недоступности одного или
       нескольких драйверов в runtime?
       С runtime scope компиляция не выполняется.
  -->
  <!-- <scope>provided</scope> -->
</dependency>

Пример регистрации драйвера:

import com.microsoft.sqlserver.jdbc.SQLServerDriver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import oracle.jdbc.driver.OracleDriver;

public class SqlExportService
{
  private ServiceSettings settings;

  public SqlExportService(ServiceSettings settings)
  {
    this.settings = settings;
    registerDrivers( settings.getConnectionString() );
  }

  private boolean registerDrivers( String connectionString )
  {
    try
    {
      if( connectionString.startsWith("jdbc:oracle:") )
      {
        DriverManager.registerDriver( new OracleDriver() );
      }
      else if( connectionString.startsWith("jdbc:sqlserver:") )
      {
        DriverManager.registerDriver( new SQLServerDriver() );
      }
    }
    catch ( SQLException e )
    {
      logger.error( "An error occurred while registering the driver in the manager.", e );
      return false;
    }
    return true;
  }

  public ResultSet executeStatement( String sqlStatement )
  {
    ResultSet result = null;
    try (Connection connection = DriverManager.getConnection( this.settings.connectionString );
         Statement statement = connection.createStatement())
    {
      result = statement.executeQuery( sqlStatement );
    }
    catch ( SQLException e )
    {
      logger.error("An error occurred while executing the SQL query: \"" + sqlStatement + "\"", e);
    }
    return result;
  }
}

Ссылки по теме

Ответы

Ответов пока нет.