ti-enxame.com

o que exatamente isso faz Class.forName ("com.mysql.jdbc.Driver"). newInstance ();

Ao conectar-me ao banco de dados MySQL, execute as seguintes etapas

Connection con = null;
Resultset rs = null;
Statement st = null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/database","root","passwp");

Na verdade, eu queria saber o que a instrução Class.forName("com.mysql.jdbc.Driver").newInstance(); faz.

Embora essa classe não esteja no mysql.jar. Onde está presente?

17
user2098012

A classe Class está localizada no pacote Java.lang, portanto é distribuída com Java e importada automaticamente para todas as classes.

O que o método forName() faz é apenas retornar o objeto Class para o paramater que foi carregado pelo carregador de classes. O método newInstance() retorna uma nova instância da classe.

Então o que acontece é que você chama Class.forName(...) e retorna com.mysql.jdbc.Driver.class. Você então chama newInstance() nessa classe que retorna uma instância da classe, sem nenhum parâmetro, então está basicamente chamando new com.mysql.jdbc.Driver();.

26
chossenger

Citando a partir de especificação JDBC , capítulo 9, seção 2:

Os drivers JDBC devem implementar a interface Driver, e a implementação deve conter um inicializador estático que será chamado quando o driver for carregado. Este inicializador registra uma nova instância de si mesmo com o DriverManager.

E um código de exemplo é fornecido para AcmeJdbcDriver da seguinte maneira:

public class AcmeJdbcDriver implements Java.sql.Driver {
    static {
        Java.sql.DriverManager.registerDriver(newAcmeJdbcDriver());
    }
}

E quando você chama Class.forName (String className) , de acordo com a documentação da API, acontece o seguinte:

Uma chamada para forName ("X") faz com que a classe chamada X seja inicializada.

onde a inicialização envolve código no bloco estático a ser executado.

Então, basicamente, você inicializa a classe Driver e, por sua vez, a classe se registra com o Java.sql.DriverManager de acordo com a especificação JDBC.

Observe que isso não é mais necessário. Detalhes podem ser encontrados aqui .

Os métodos DriverManager getConnection e getDrivers foram aprimorados para oferecer suporte ao mecanismo Java Standard Edition Service Provider. Os drivers JDBC 4.0 devem incluir o arquivo META-INF/services/Java.sql.Driver. Este arquivo contém o nome da implementação dos drivers JDBC do Java.sql.Driver.Por exemplo, para carregar a classe my.sql.Driver, o arquivo META-INF/services/Java.sql.Driver deve conter a entrada:

my.sql.Driver

Os aplicativos não precisam mais carregar explicitamente os drivers JDBC usando Class.forName ().

6
Koray Tugay

Ele criará uma nova instância do com.mysql.jdbc.Driver e, portanto, chame a inicialização estática, que registrará o driver com DriverManager, para que você possa criar conexões mysql com base na URL usada na segunda linha.

A classe, no entanto, deve estar no mysql.jar.

5
Janick Bernet