In the past, it was required to load a JDBC driver before creating a java.sql.Connection
. Nowadays, when using JDBC 4.0 drivers, this
is no longer required and Class.forName()
can be safely removed because JDBC 4.0 (JDK 6) drivers available in the classpath are
automatically loaded.
This rule raises an issue when Class.forName()
is used with one of the following values:
-
com.mysql.jdbc.Driver
-
oracle.jdbc.driver.OracleDriver
-
com.ibm.db2.jdbc.app.DB2Driver
-
com.ibm.db2.jdbc.net.DB2Driver
-
com.sybase.jdbc.SybDriver
-
com.sybase.jdbc2.jdbc.SybDriver
-
com.teradata.jdbc.TeraDriver
-
com.microsoft.sqlserver.jdbc.SQLServerDriver
-
org.postgresql.Driver
-
sun.jdbc.odbc.JdbcOdbcDriver
-
org.hsqldb.jdbc.JDBCDriver
-
org.h2.Driver
-
org.firebirdsql.jdbc.FBDriver
-
net.sourceforge.jtds.jdbc.Driver
-
com.ibm.db2.jcc.DB2Driver
Noncompliant code example
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Demo {
private static final String DRIVER_CLASS_NAME = "org.postgresql.Driver";
private final Connection connection;
public Demo(String serverURI) throws SQLException, ClassNotFoundException {
Class.forName(DRIVER_CLASS_NAME); // Noncompliant; no longer required to load the JDBC Driver using Class.forName()
connection = DriverManager.getConnection(serverURI);
}
}
Compliant solution
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Demo {
private final Connection connection;
public Demo(String serverURI) throws SQLException {
connection = DriverManager.getConnection(serverURI);
}
}