Реализация поддержки библиотекой подключений к разным БД
Имеется библиотека, которая используя 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;
}
}
Ссылки по теме
Источник: Stack Overflow на русском