jdbc e hibernate
TRANSCRIPT
JDBC e Hibernate
Bancos de dados e mapeamento objeto relacional em Java
Acessar bancos de dados em Java é fácil!
Coméquié?
O que? Não acredita?
Você só tem que conhecer três interfaces:
•java.sql.Connection•java.sql.Statement•java.sql.ResultSet
Código de acesso ao banco
Class.forName("org.h2.Driver");Connection connection = DriverManager.getConnection("jdbc:h2:file:database/erp");
Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery( "select * from Autor" );
while ( resultSet.next() ) {System.out.printf("Linha %s%n", resultSet.getRow());for ( int x = 1; x <= resultSet.getMetaData().getColumnCount(); x++ ) {
System.out.printf("\tColumn: %s Value %s%n", resultSet.getMetaData().getColumnName(x),resultSet.getString( x ));
}}
connection.close();
E quem é DriverManager?
Statements
Executam comandos SQL no banco de dados;
Podem executar qualquer tipo de comando, específico ou não, do banco;
Precisam de uma conexão aberta;
PreparedStatements
Executa comandos DML de forma parametrizada;
É mais rápido e mais seguro do que fazer concatenação de Strings;
Previne ataques de “SQL Injection”;
PreparedStatements
Class.forName("org.h2.Driver");Connection connection = DriverManager.getConnection("jdbc:h2:file:database/erp");
PreparedStatement statement =connection.prepareStatement( "select * from Autor a where a.id = ?" );statement.setLong(1, 1);ResultSet resultSet = statement.executeQuery();
while ( resultSet.next() ) {System.out.printf("Linha %s%n", resultSet.getRow());for ( int x = 1; x <= resultSet.getMetaData().getColumnCount(); x++ ) {
System.out.printf("\tColumn: %s Value %s%n", resultSet.getMetaData().getColumnName(x),resultSet.getString( x ));
}}
connection.close();
CallableStatement
Executa uma “stored procedure” no banco de dados;
Pode gerar ResultSets ou apenas o contador de atualização;
Sintaxe padronizada para qualquer banco:{? = call <procedure>[<arg1>,<arg2>]} {call <procedure>[<arg1>,<arg2>]}
Transações em JDBC
As transações são definidas no objeto Connection;
Para iniciar uma, deve chamar o método “setAutoCommit()” com o valor “false”;
Para terminar uma transação, o método “commit()” deve ser chamado;
Transações em JDBC
connection.setAutoCommit(false);connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
PreparedStatement statement = connection.prepareStatement("select * from Autor",ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {resultSet.updateString(4, "http://maujr.org/");resultSet.updateRow();
}try {
connection.commit();} catch (SQLException e) {
connection.rollback();} finally {
connection.close();}
Tipos de transação
TRANSACTION_NONE – Não há transação;
TRANSACTION_READ_COMMITED – Pode ler dados que foram enviados por outras transações;
TRANSACTION_READ_UNCOMMITED – Pode ler dados ainda não validados por outra transação;
Tipos de transação
TRANSACTION_REPEATABLE_READ – Garante que a mesma query vai retornar os mesmos resultados duas vezes, mas uma “phantom-read” ainda pode acontecer;
TRANSACTION_SERIALIZABLE – Os comandos são enviados de forma seqüencial e não concorrente, os dados vão ser garantidamente gravados e corretamente;
Tipos de ResultSet - Navegação TYPE_FORWARD_ONLY – Navegação
sequencial e não percebe atualizações externas
TYPE_SCROLL_INSENSITIVE – Navegação total (ida e volta) mas ainda não percebe atualizações externas;
TYPE_SCROLL_SENSITIVE – Navegação total e ainda percebe atualizações feitas por outros usuários nos dados do banco;
Tipos de ResultSet - Atualização
CONCUR_READ_ONLY – ResultSet de apenas leitura;
CONCUR_UPDATABLE – ResultSet atualizável;
THE END
E VOCÊ NÃO VIU NADA SER CLICADO E ARRASTADO...