Programação em Rede JDBC 1 Linguagens de Programação JDBC – Acesso a Bases de Dados JDBC - Java Database Connectivity • Necessidades : ligar aplicações Java e Applets a DBMS • Drivers que suportam SQL – um driver JDBC/DBMS deve suportar pelo menos o ANSI SQL92 • JDBC é constituído por interfaces Java que permitem ao programador : • estabelecer uma ligação com uma base de dados particular ; • executar instruções SQL ; •processar os resultados. • Os interfaces mais importantes : • java.sql.DriverManager – gere o carregamento de um driver e suporta o estabelecimento de ligações a uma base de dados • java.sql.Connection – representa a ligação a uma base de dados particular • java.sql.Statement – representa um contentor para uma instrução SQL dada uma determinada ligação • java.sql.ResultSet – representa o contentor dos resultados de um tipo particular de Statement (query) • O interface java.sql.Statement interface tem dois sub-tipos importantes : • java.sql.PreparedStatement – para executar uma instrução SQL précompilada • java.sql.CallableStatement – para invocar uma “stored procedure” 2 registada na base de dados Linguagens de Programação JDBC – Acesso a Bases de Dados JDK 1.1 -> JDBC 1.0 JDK 1.2 -> JDBC 2.0 Drivers : JDBC-ODBC Bridge JDBC 2.0 -> jConnect 5.2 (driver p/ BD Sybase) 3 Linguagens de Programação JDBC – Acesso a Bases de Dados DriverManager • Gere os drivers JDBC. • Carrega as classes de driver. • Um programa pode carregar explicitamente um driver JDBC a qualquer momento Class.forName("my.sql.Driver"); Connection 1) Carregar o driver Exemplos : Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Class.forName cria uma instância do driver e regista-o no DriverManager ou : SybDriver sybDriver = null; Class c = Class.forName("com.sybase.jdbc2.jdbc.SybDriver"); sybDriver = (SybDriver) c.newInstance(); DriverManager.registerDriver((Driver) sybDriver); 4 Linguagens de Programação JDBC – Acesso a Bases de Dados •2) Criar uma connection connection – liga o driver ao DBMS Exemplo : String dbUrl = "jdbc:odbc:Fred"; Connection conn = DriverManager.getConnection (dbUrl, "dba", "sql"); ou : String dbUrl = "jdbc:sybase:Tds:localhost:2638"; Properties props = new Properties(); props.put("user", "dba"); props.put("password", "sql"); Connection conn = DriverManager.getConnection (dbUrl, props); ( JDBC URL tem o formato - jdbc:subprotocol:subname, tal como jdbc:sybase:Tds:144.14.2.1:2001 ) Statement Statement – envia instruções SQL ao DBMS Exemplo : Statement s = conn.createStatement(); // permite actualizar a base (criar, inserir, apagar…): s.executeUpdate( "INSERT INTO Tabela1 " + "VALUES ('Pedro',4)" ); // ou consultar a base (fazer um query) : ResultSet r = s.executeQuery( "SELECT * " + "FROM tabela1" ); 5 Linguagens de Programação JDBC – Acesso a Bases de Dados ResultSet ResulSet – tabela de dados que contém os resultados de um query à base de dados Exemplo : ResultSet r = s.executeQuery( "SELECT * " + "FROM tabela1" ); // o método next permite aceder a cada linha do ResultSet while(r.next()) { // os métodos getXXX permitem aceder aos tipos de dados em SQL String JNome = r.getString("Nome"); int JNumero = r.getInt("Numero"); System.out.println(JNome+" "+" "+JNumero); } // outra maneira de identificar as colunas de uma tabela na base de dados : String JNome = r.getString(1); int JNumero = r.getInt(2); Mesmo que o ResultSet só tenha uma linha, é necessário utilizar next() para aceder a essa linha, pois inicialmente o cursor está posicionado antes da primeira linha. 6 Linguagens de Programação JDBC – Acesso a Bases de Dados Exemplo completo em modo Applet : import javax.swing.*; import java.sql.*; import com.sybase.jdbcx.*; import java.util.*; import java.awt.*; import java.awt.event.*; public class AppletAcessoBD1 extends JApplet { JButton b1 = new JButton("Acede a BD"); JTextField t = new JTextField("Acede à base ", 30); ActionListener a1 = new ActionListener() { public void actionPerformed(ActionEvent e){ t.setEditable(true); SybDriver sybDriver = null; // Carrega o driver Sybase jdbc try { Class c = Class.forName("com.sybase.jdbc2.jdbc.SybDriver"); sybDriver = (SybDriver) c.newInstance(); DriverManager.registerDriver((Driver) sybDriver); } catch (Exception ex) { System.out.println("Não consegue carregar o Sybase JDBC driver. " + ex); ex.printStackTrace(); } String dbUrl = "jdbc:sybase:Tds:localhost:2638"; try { Properties props = new Properties(); props.put("user", "dba"); props.put("password", "sql"); Connection conn = DriverManager.getConnection (dbUrl, props); 7 Linguagens de Programação JDBC – Acesso a Bases de Dados // Abre ligacao Statement s = conn.createStatement(); // Codigo SQL : s.executeUpdate( "INSERT INTO Tabela1 " + "VALUES ('Pedro',4)" ); ResultSet r = s.executeQuery( "SELECT * " + "FROM tabela1" ); boolean b = false; while(r.next()) { String JNome = r.getString("Nome"); int JNumero = r.getInt("Numero"); System.out.println(JNome+" "+" "+JNumero); } s.close(); // Fecha statement conn.close(); // Fecha connection } catch (SQLException sqe) { System.out.println("Excepcao : " + sqe.toString() + ", sqlstate = " + sqe.getSQLState()); sqe.printStackTrace(); System.exit(1); } catch(Exception exp) { exp.printStackTrace(); } } }; public void init() { b1.addActionListener(a1); Container cp = getContentPane(); cp.setLayout(new FlowLayout()); cp.add(b1); cp.add(t); } } 8 Linguagens de Programação JDBC – Acesso a Bases de Dados <HTML> <HEAD> <TITLE>MyApplet Example1</TITLE> </HEAD> <BODY> <H1>MyApplet</H1> <HR> <P> <APPLET CODE="AppletAcessoBD1" archive="jconn2.jar" WIDTH="300" HEIGHT="300"> </APPLET> </P> <HR> </BODY> </HTML> 9