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 registada na base de dados 1
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) 2
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); 3
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" ); 4
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. 5
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); 6
Linguagens de Programação // 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); 7
<HTML> </HTML> <HEAD> </HEAD> <BODY> </BODY> <TITLE>MyApplet Example1</TITLE> <H1>MyApplet</H1> <HR> <P> <APPLET CODE="AppletAcessoBD1" archive="jconn2.jar" WIDTH="300" HEIGHT="300"> </APPLET> </P> <HR> 8
Interface PreparedStatement extends Statement Pre-compile, store re-execute multiple times. Support IN parameters - PreparedStatement stmt = conn.preparestatement( "UPDATE table3 SET m =? WHERE x =?"); Set the IN parameters - stmt.setstring(1, "Hi"); stmt.setint(2, 25); Parameters are refered to sequentially, by number. The first parameter is 1 executequery,executeupdate,execute setabc methods setbyte,setbinarystream,setdouble,setlong,settimestamp.. etc. Method setobject(int parameterindex, Object x) interface CallableStatement extends PreparedStatement Execute SQL stored procedures with IN and OUT parameters. sqlstring {?= call [,,...] or {call [,,...] CallableStatement stmt = conn.preparecall( "{call gettestdata(?,?)"); setabc to set IN parameters Register OUT parameters using registeroutparameter prior to executing the stored procedure. stmt.registeroutparameter(1,java.sql.types.tinyint); Use getabc to retrieve OUT values after execution. byte x = stmt.getbyte(1); Interface ResultSet 9 ResultSet provides access to a table of data generated by executing a Statement.The table rows are retrieved in sequence. Within a row its column