Driver's JDBC

Ae gente eu to com umas dúvidas aqui.

Bom primeiro eu queria saber mais sobre os JDBC mas não achei muita coisa. Se tiverem material me passem.
Bom minha dúvida principal é quanto aos PreparedStatement, BatchStatement e o Statement. Desculpem qualquer erro de nome…

Bom sei que o Statement é rodado 1 por 1, pode acontecer se não for tratado corretamente de ter um sql injection pois para criar esta query vc usaria concatenação de string’s, é um metodo para inserir query’s uma a uma. Sendo este metodo mais lento na inserção do que os outros 2.

Já o PreparedStatement ele pré-processa a query o que isso significa ?
Que ele irá processar o custo da query, montar ela de uma forma mais efetiva e repassa para o banco algo já mastigado só com os valores e o banco não necessita fazer um peso para ver qual o caminho melhor para processar minha query, Mas nesse caso a validação da query fica a encargo do driver também ? Se for isso então isso tudo quem deve ser responsável é o Driver e não o banco ?

E o BatchStatement quando eu rodo várias query’s mas não do o execute, ele esta guardado tudo no Driver para depois ser passado tudo para o banco de dados como uma grande sequencia de query’s a serem executadas ?

E quanto ao Driver em questão. Ele irá somente fazer o papel de criar a conexão e repassar as query’s para o banco, e o banco em questão irá tratar de otimiza-las e tudo e responder ao driver, ou o driver faz alguma otimização em minhas query’s e repassa ao banco de dados algo já pré-processado, e em cima disso o banco de dados irá fazer a validação e quebrar em várias sub-query’s e executa-las ?

São várias dúvidas…

Me corrigam se tiver algo errado alem do portugues plz.

[quote=rommul]Ae gente eu to com umas dúvidas aqui.

Bom primeiro eu queria saber mais sobre os JDBC mas não achei muita coisa. Se tiverem material me passem.
Bom minha dúvida principal é quanto aos PreparedStatement, BatchStatement e o Statement. Desculpem qualquer erro de nome…

Bom sei que o Statement é rodado 1 por 1, pode acontecer se não for tratado corretamente de ter um sql injection pois para criar esta query vc usaria concatenação de string’s, é um metodo para inserir query’s uma a uma. Sendo este metodo mais lento na inserção do que os outros 2.
[/quote]
OK

Hum… a rigor o que ocorre é que o driver monta um comando SQL em um formato que depende do banco de dados com o qual ele se comunica, e passa os parâmetros normalmente em formato binário (tanto é que normalmente não é possível obter a string SQL equivalente ao comando SQL). Ele repassa em formato mastigado (OK), manda só os valores (OK), mas a otimização da query SQL é uma outra coisa que só o próprio banco tem condições de fazer, já que é só ele que tem acesso às estatísticas do banco de dados.
De qualquer maneira, um prepared statement é benéfico em termos de desempenho, porque isso pode ser usado por um cache de queries SQL pré-processadas que normalmente os bancos de dados têm. Aí o banco economiza tempo porque não precisa efetuar o parse do SQL nem refazer o plano de execução.

[quote]Mas nesse caso a validação da query fica a encargo do driver também ? Se for isso então isso tudo quem deve ser responsável é o Driver e não o banco ?
[/quote]Normalmente o driver não valida queries; quem deve fazer isso é o banco.

Isso depende do driver e do banco é claro; dependendo do banco não é uma “grande sequência de queries” e sim uma outra coisa. É por isso que tais coisas não são precisamente definidas na documentação, para dar liberdade ao programador do driver e do banco para implementarem isso da melhor maneira possível.

Normalmente é algo entre só criar a conexão e repassar as queries (drivers mais ingênuos) e efetuar alguma otimização que seja possível fazer (drivers mais complexos). Mas existem certas otimizações que só o banco pode fazer.

Pode corrigir seu inglês? Plural de string = strings (não string’s), query = queries (não query’s).

Uhm Valeu. Muito Obrigado.

Irei Melhora-lo sim.

E existe algum local com esta documentação ? alem da API java.

O Driver existe pq vc não precisa conhecer o protocolo do banco, e o protocolo do banco não é SQL (talvez exista alguma exceção).

Sem ele vc teria que abrir um socket e controlar a conexão na mão, saber o que cada codigo de retorno significa, etc. E tudo o que aprendesse pro MySQL vc teria que reaprender para lidar com o PostgreSQL, Oracle ou DB2.