JDBC Compreender os conceitos básicos da utilização do acesso a banco de dados via JDBC Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC Conceitos; Arquitetura; Processo básico de utilização; Classes e interfaces JDBC; Exemplo prático; Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC JDBC- Java Database Connectivity É um conjunto de interfaces definidas no Java para construção de componentes de acesso a bancos de dados. Esse conjunto de interfaces que devem ser implementadas por componentes de acesso a um determinado banco de dados. Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC JDBC- Java Database Connectivity Com JDBC é possível construir uma aplicação Java para acesso a qualquer banco de dados SQL. JDBC é uma interface de nível de código: Código SQL é usado explicitamente dentro do código Java; O pacote java.sql consiste de um conjunto de classes e interfaces que permitem embutir código SQL em métodos Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC Arquitetura JBDC: SQL-Server, MySql, entre outros. Aplicação JAVA Interface JDBC Implementação JDBC.BANCO SGBD Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC Processo básico para utilizar o JDBC Carregar e registrar o driver JDBC junto ao Driver Manager; Configurar e obter uma conexão com o banco de dados; Preparar os dados para consulta (formatação, ordenação, ...) e o próprio SQL; Executar a consulta; Obter e verificar os resultados; Tratar possíveis erros; Formatar a saída para o usuário; Ao finalizar a aplicação, fechar a conexão. Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - DriverManager e Driver A interface Driver é utilizada apenas pelas implementações de drivers JDBC: É preciso carregar a classe do driver na aplicação que irá utilizálo. Isto pode ser feito com Class.forName(): Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); A classe DriverManager manipula objetos do tipo Driver: Possui métodos para registrar drivers, removê-los ou listá-los; Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - DriverManager e Driver É usado para retornar Connection, que representa uma conexão a um banco de dados, a partir de uma URL JDBC recebida como parâmetro: Nome do DSN registrado, se fizer conexão ODBC Connection con = DriverManager.getConnection( "jdbc:odbc:aluguel","", ""); Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - Connection, ResultSet e Statement Connection: Representa uma conexão ao banco de dados, que é retornada pelo DriverManager na forma de um objeto. Sendo possíveis algumas operações: con.commit(); con.rollBack(); con.close(); Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - Connection, ResultSet e Statement Statement: Oferece meios de passar instruções SQL para o sistema de banco de dados. Obtendo-se um objeto Connection, chamamos o seu método createStatement() para obter uma instância de uma classe que implementa a interface Statement: Statement stmt = con.createStatement(); A interface Statement é usada para executar comando SQL simples. Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - Connection, ResultSet e Statement Statement: Com um objeto do tipo Statement podemos utilizar os métodos execute, executeQuery e executeUpdate que são usados da seguinte maneira: stmt.execute( "CREATE TABLE produto(id_produto INT PRIMARY KEY, descricao CHAR(20), fabricante char(20)); "); Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - Connection, ResultSet e Statement Statement: int linhasModificadas = stmt.executeUpdate( " INSERT INTO produto (id_produto, descricao, fabricante) VALUES (1,‘PNEU',‘firestone’) "); O retorno do método indica o status da operação. Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - Connection, ResultSet e Statement Statement: Consultas que retornam dados são executadas usando o executeQuery: ResultSet rs = stmt.executeQuery("SELECT * FROM Produto"); Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - Connection, ResultSet e Statement Comandos pré-compilados: O Statement pré-compilado que é mais eficiente quando várias consultas similares são enviadas com parâmetros diferentes Uma String com instrução SQL é preparada previamente, deixando-se "?" no lugar dos parâmetros. Parâmetros são inseridos em ordem, com setXXX() onde XXX é um tipo igual aos retornados pelos métodos de ResultSet. Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - Connection, ResultSet e Statement Comandos pré-compilados: String newSql = "INSERT INTO PRODUTO (nom_produto, des_produto, fornecedor) VALUES (?, ?, ?)"; PreparedStatement stmt1 = con.prepareStatement(newSql); stmt1.setString(1, "Monitor"); stmt1.setString(2,"Monitor LCD"); stmt1.setString(3, “SAMSUNG"); stmt1.executeUpdate(); Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - Connection, ResultSet e Statement ResultSet: É um cursor para os dados recebidos. Conforme demonstrado, o método executeQuery() retorna um objeto do tipo ResultSet; Com esse cursor recuperado, pode-se então navegar pelas linhas da tabela e recuperar as informações armazenadas nas colunas solicitadas na consulta. Alguns métodos para navegação são: Next(); previous(); First() e last(). Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - Connection, ResultSet e Statement ResultSet: Para obtenção dos dados são utilizados os seguintes métodos: getInt(); getString()... Ou seja, getXXX() onde XXXX é o tipo da informação recuperada. Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - Connection, ResultSet e Statement ResultSet: Supondo que em uma tabela exista 3 atributos: A Tabela Produtos que foi mostrado anteriormente. Então usaremos os métodos getInt() e o getString() objetoReultset.getInt(“id_produto”) objetoReultset.getString(“descricao”) objetoReultset.getString(“fabricante”) Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - Connection, ResultSet e Statement ResultSet: Os métodos getXXXX() possuem duas sobrecarga. Onde pode ser Passado como parâmetro o nome do atributo da tabela ou o número da ordem de criação do atributo (índice do atributo) objetoReultset.getInt(1) // Para o atributo id_produto objetoReultset.getString(2) // Para o atributo descricao objetoReultset.getString(3) // Para o atributo abricante Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - Connection, ResultSet e Statement Propriedades transacionais: Possibilita maior segurança na atualização dos dados. Temos que lançar a exceção (throws SQLException). Também fazer o tratamento de erro. connection.setAutoCommit(false); PreparedStatement pst = connection.prepareStatement( SuaQuery ); .. pst.executeUpdate() //Várias alterações no BD. ... connection.commit(); ou connection.rollback(); Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected]) JDBC - Connection, ResultSet e Statement Propriedades transacionais: String sql = "INSERT INTO clientes (NOME, ENDERECO, BAIRRO, CIDADE) VALUES (?, ?, ?, ?)"; try { connection.setAutoCommit(false); PreparedStatement pst = connection.prepareStatement( sql ); pst.setString(1, "Carlos Teste 1"); pst.setString(2,"Endereço de Carlos Teste 1"); Faz duas alterações no banco de pst.setString(3,"Bairro Carlos Teste 1"); dados. pst.setString(4,"Cidade Carlos Teste 1"); pst.executeUpdate(); Só então, caso não haja erros ele sql = "UPDATE clientes SET NOME=? WHERE Codigo=?"; pst = connection.prepareStatement( sql ); pst.setString(1, "Jorge"); pst.setInt(2, 4); pst.executeUpdate(); Caso connection.commit(); Confirma todas al alterações, de fato, no banco ocorra algum erro ele desfaz as alterações, voltando ao estado, seguro, original pst.close(); } catch(SQLException e) { System.err.println ("\nError Menssage: " + e.getMessage()); connection.rollback(); } Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos (UFBA)([email protected])