JDBC Class.forName() pq?

É vc não está vendo errado! É mais um perguntando sobre o porque de se usar Class.forName( ).

Mas minha pergunta é por que eu tenho que fazer isso?

Class.forName( "com.mysql.jdbc.Driver" )

E não posso instanciar um objeto do tipo com.mysql.jdbc.Driver?

[code]import com.mysql.jdbc.Driver

Driver driver = new Driver();

[/code]

Eu queria esclarecer essa idéia…se for uma explicação lá de baixo mesmo (a base da coisa mesmo), é ainda melhor.

Desde já agradeço.

1 curtida

Essa sua dúvida é bastante interessante…

Paulo Silveira escreveu…[quote]Porém, precisamos antes “carregar” o driver, de tal maneira que o Java saiba que ele existe, e possa usá-lo se necessário. Normalmente, os livros explicam isto de forma muito básica, e não entram em detalhes, já que o código que carrega o driver é do tipo:

Class.forName(“com.mysql.jdbc.Driver”);

Mas o que acontece realmente aqui? Quando você utiliza o método estático Class.forName(), o Class Loader tenta inicializar esta classe. Esta classe (que é o nosso driver jdbc) possui um bloco inicializador estático (não se preocupe caso você não conheça este recurso), que irá registrar essa classe como um driver JDBC, avisando o java.sql.DriverManager, pelo método registerDriver.

Obs: Existem outras maneiras de carregar o driver, como por linha de comando (bootstrap).[/quote]
Bom creio que o texto acima responde a sua dúvida, segue link com o restante do artigo.

http://www.guj.com.br/java.tutorial.artigo.7.1.guj

2 curtidas

eu sempre tive essa duvida…

o artigo nao explica (ou pelo menos nao entendi) pq agente nao pode fazer

Driver driver = new Driver();

e tem que carregar em tempo de execução

errr… :roll:

Ora, e quem disse que não pode?

Ambos vão ter o mesmo efeito, o problema desse seu exemplo aí é que você está se amarrando diretamente ao driver do MySQL, no exemplo com o Class.forName("") o que é passado é uma String que pode ser facilmente colocada em um arquivo de configuração qualquer e alterada se for necessário.

1 curtida

vc poderia fazer isso… se antes fizesse isto…

// imports aqui public class ConnectionFactory { public static Connection getConnection() throws SQLException { try { Class.forName("com.mysql.jdbc.Driver"); return DriverManager.getConnection("jdbc:mysql://localhost/bd","root","root"); } catch (ClassNotFoundException e) { throw new SQLException(e.getMessage()); } } }

public class Driver { // a conexão com o banco de dados private Connection connection; public Driver() throws SQLException { this.connection = ConnectionFactory.getConnection(); } }

desculpe possiveis erros… tentei fazer sem consultar nada…

[quote=Maurício Linhares]Ora, e quem disse que não pode?

Ambos vão ter o mesmo efeito, o problema desse seu exemplo aí é que você está se amarrando diretamente ao driver do MySQL, no exemplo com o Class.forName("") o que é passado é uma String que pode ser facilmente colocada em um arquivo de configuração qualquer e alterada se for necessário.[/quote]

Muito bem colocado.

Vc poderia utilizar apenas:

new Driver();

Que iria funcionar normalmente, mas como o Maurício disse, vc ficaria amarrado ao driver do MySQL.

Como a parte de configuração do banco de dados geralmente é atrelada a arquivos properties para permitir um menor acoplamento do sistema, é aconselhável a carregar o Driver pelo Class Loader.

Abraço.

Também sempre tive outra duvida.

Por que se inicio a Class.forName(""), sempre acabo tendo que usar os métodos java de sql e nao os da classe importada?

Quando tento usar por exemplo um stm do mysql, ele me diz que é incompatível.

Valew ai galera…

…sempre o forum respondendo minhas dores de cabeça!

Valew!

Vale ressaltar que se você estiver usando JDBC 4 (Java 6), não é necessário registrar o Driver com o famoso “Class.forName”.

Se o Driver estiver no classpath, o DriverManager registra pra você.

e viva o Java 6

eu aprendi de duas formas com o:

Class.forName(“com.mysql.jdbc.Driver”);

e dessa forma:

DriverManager.registerDriver(new com.mysql.jdbc.Driver());
connection = DriverManager.getConnection(“jdbc:mysql://”+host+"/"+database,user, password);

me disseram que essa última era melhor e mais nova

Não é nova não.
Está lá desde o 1.4
http://java.sun.com/j2se/1.4.2/docs/api/index.html

O grande lance do Class.forName é poder trocar de um Driver para o outro sem ter de alterar o código fonte.
Com um código bem escrito, a troca de um driver para outro pode ser feita alterando apenas um parâmtero que é passado para o programa. Exemplo: um arquivo .properties.