1 / 57

SQLJ : uma alternativa de alto nível a JDBC

SQLJ : uma alternativa de alto nível a JDBC. Universidade Federal de Campina Grande Disciplina: Banco de Dados I Professor: Cláudio de Souza Baptista Estagiário: Elvis Rodrigues da Silva. Roteiro. Introdução Sintaxe Inicial Comandos avançados Requisitos Referências.

Download Presentation

SQLJ : uma alternativa de alto nível a JDBC

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. SQLJ: uma alternativa de alto nível a JDBC Universidade Federal de Campina Grande Disciplina:Banco de Dados I Professor: Cláudio de Souza Baptista Estagiário: Elvis Rodrigues da Silva http://www.lsi.dsc.ufcg.edu.br/

  2. Roteiro • Introdução • Sintaxe Inicial • Comandos avançados • Requisitos • Referências

  3. Introdução (1 de 5) • SQLJ é uma tecnologia que permite a um programa Java acessar um banco de dados utilizando statements SQL embutidos • Arquivo fonte termina com “.sqlj” • Manipulações SQLJ • Meta informações: Create, Alter, Drop • Dados: Select, Insert, Update, Open, Fetch • Controle de Transações: Commit, Rollback

  4. Introdução (2 de 5) • SQLJ não pode ser compilado diretamente pelo compilador Java • Solução: usar um tradutor • SQLJ Translator

  5. Introdução (3 de 5) • O tradutor verifica erros de sintaxe e semânticos na instrução SQL em tempo de tradução: • Nomes incorretos • Checagem de tipos • Verifica se o comando SQL está de acordo com o Banco de Dados • Etc.

  6. Introdução (4 de 5) • A IDE Oracle JDeveloper reconhece a sintaxe de SQLJ para o banco de dados Oracle, mas é possível utilizar outros compiladores • O IBM Websphere também possui compatibilidade com SQLJ para o banco de dados IBM DB2

  7. Introdução (5 de 5) • Vantagens de SQLJ sobre JDBC (comandos estáticos) • Código-fonte reduzido • Checagem de tipos SQL via conexão • Associação de variáveis em um único comando • Checagem de tipos de parâmetros e retorno antes da execução • Desvantagens • Um passo a mais no processamento: tradução de sqlj para java

  8. Sintaxe Inicial: Declarações (1 de 3) • Declarações SQLJ : • #sql{<comando SQL>}; • Regras pra declarações SQLJ SQLJ declaration; // OK (top level scope) class Outer { SQLJ declaration; // OK (class level scope) class Inner { SQLJ declaration; // OK (nested class scope) } void func() { SQLJ declaration; /* OK in JDK 1.2.x; ILLEGAL in JDK 1.1.x (method block)*/ } }

  9. Exemplo:

  10. Sintaxe Inicial: Declarações (3 de 3) • Existem 2 tipos de declarações SQLJ: • Iterator • Context • Iterator • Declarações que definem classes iterator • Usado para receber os resultados de consultas • Context • Usado para criar uma conexão ao Banco de Dados

  11. Sintaxe Inicial: SQLJ Namespace • Todas as restrições de nome em Java são aplicadas aqui • Evitar usar as palavras reservadas, nome de classes e colunas em iterator: • iterator • context • with

  12. Sintaxe Inicial: Iterator (1 de 8) • Declaração: • Modifiers: • publics, static, etc • Existem 2 tipos de iterator: • named iterators • positional iterators

  13. Sintaxe Inicial: Iterator (2 de 8) • named iterators • positional iterators

  14. Sintaxe Inicial: Iterator (3 de 8) • Exemplo named iterators: #sql iterator MyCheckedIter (String ename, double sal); ... MyCheckedIter iter; #sql iter = { SELECT ename, sal FROM Employee}; while (iter.next()) { System.out.println(iter.ename()); System.out.println(iter.sal()); }

  15. Sintaxe Inicial: Iterator (4 de 8) • Obtendo os elementos de um Positional iterators • FETCH INTO seguido por endFetch() • O FETCH INTO chama implicitamente o método next()

  16. Exemplo de “positional iterators”

  17. Sintaxe Inicial: Iterator (6 de 8) • Iterator e ResultSet podem existir dentro de outro Iterator em Oracle SQLJ • Exemplos: CREATE TABLE DEPT ( DEPTNO NUMBER(2), DNAME VARCHAR2(14) ); CREATE TABLE EMP ( EMPNO NUMBER(4), ENAME VARCHAR2(10), SAL NUMBER(7,2), DEPTNO NUMBER(2) );

  18. Sintaxe Inicial: Iterator (7 de 8)

  19. Sintaxe Inicial: Iterator (8 de 8) • Outro exemplo: • Declaração: • Execução:

  20. Sintaxe Inicial: Connection (1 de 7) • Existem várias formas de criar uma conexão com o Banco de Dados: • Criando um contexto Default DefaultContext defctx = new DefaultContext ("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger", false); • Através da declaração SQLJ:

  21. Sintaxe Inicial: Connection (2 de 7) • Exemplo: #sql context MyContext; ... MyContext myContext = new MyContext("jdbc:oracle:thin:@localhost:1521:dbhome", “scott", "tiger ", false);

  22. Sintaxe Inicial: Connection (3 de 7) • Simples conexão usando connect() da classe oracle.sqlj.runtime.Oracle • Oracle.connect(MyClass.class, "connect.properties"); • Oracle.connect("jdbc:oracle:thin:@localhost:1521: orcl", "scott", "tiger"); • A função connect() simplifica o processo de criação e usa uma instância da classe DefaultContext

  23. Sintaxe Inicial: Connection (4 de 7) • Formato do arquivo “properties”: sqlj.url=jdbc:oracle:thin:@localhost:1521:dbhome sqlj.user=scott sqlj.password=tiger

  24. Sintaxe Inicial: Connection (5 de 7) • Multiplas conexões DefaultContext ctx1 = Oracle.getConnection ( "jdbc:oracle:thin:@localhost1:1521:orcl1", "scott", "tiger"); DefaultContext ctx2 = Oracle.getConnection ( "jdbc:oracle:thin:@localhost2:1521:orcl2", "bill", "lion"); #sql [ctx1] { SQL operation }; ... #sql [ctx2] { SQL operation };

  25. Sintaxe Inicial: Connection (6 de 7) • Se uma conexão é usada várias vezes podemos fazer: DefaultContext.setDefaultContext(ctx1); #sql { SQL operation }; #sql { SQL operation }; #sql { SQL operation }; ... DefaultContext.setDefaultContext(ctx2); #sql { SQL operation }; #sql { SQL operation }; #sql { SQL operation };

  26. Sintaxe Inicial: Connection (7 de 7) • Fechando a conexão • Há um “commit” implícito quando a conexão é fechada ... finally { try { ctx.close(); //ou Oracle.close(); } catch(SQLException ex) { ... } } ...

  27. Sintaxe Inicial: Interfaces (1 de 3) • Iterator e Context são transformados em classes java depois de traduzidos #sql iterator MyCheckedIter (String ITEM_NAME, Double COST); class MyCheckedIter extends sqlj.runtime.ref.ResultSetIterImpl implements sqlj.runtime.NamedIterator{ … public String ITEM_NAME(){…} public Double COST(){…} … } tradutor

  28. Sintaxe Inicial: Interfaces (2 de 3) • Quando se declara um “iterator” ou “context”, pode-se especificar uma ou mais interfaces #sql <modifiers> context context_classname implements intfc1,..., intfcN; • Exemplo: #sql iterator EmpIter implements mypackage.EmpIterIntfc (String emame, int empno, float sal);

  29. Exemplo: evitar acesso a uma coluna da tabela Erro de compilação

  30. Sintaxe Inicial: SubClasses • Exemplo: // Declarando um iterator #sql public static iterator EmpIter(int empno, String ename); ... //criando a subclasse public static class EmpColl extends EmpIter {...} ... //usando a subclasse EmpColl ec; #sql ec = { select ename, empno from emp };

  31. Sintaxe Inicial: Hosts (1 de 4) • Usados para troca de valores entre variáveis Java e SQLJ • Podem ser referenciados dentro de uma instrução SQLJ • SQLJ fica responsável em devolver os valores • O tipo da variável host é convertida para o tipo compatível com a coluna

  32. Sintaxe Inicial: Hosts (2 de 4) • Sintaxe: • : [mode] variavel_host • Onde mode pode ser • IN, OUT e INOUT • O default é OUT se a variável é parte de uma lista INTO ou em um statement SET e é IN caso contrário

  33. Sintaxe Inicial: Hosts (3 de 4) • Exemplos String nome;int mat = 5;#sql { SELECT aluno INTO :nome FROM cadastro WHERE matricula = :mat}

  34. Sintaxe Inicial: Hosts (4 de 4) • Outro exemplo: float balance = 12500.0; float minPmtRatio = 0.05; ... #sql { UPDATE creditacct SET minPayment = :(balance * minPmtRatio) WHERE acctnum = 537845 };

  35. Comandos Avançados: Scrollable Iterators (1 de 8) • Iterator tem apenas um único método para navegar: • next() • Scrollable Iterators permite o usuário dizer o sentido da iteração

  36. Comandos Avançados: Scrollable Iterators (2 de 8) • Para um iterator tornar-se um Scrollable Iterator ele deve implementar a interface “sqlj.runtime.Scrollable” • Declaração: #sql public static MyScrIter implements sqlj.runtime.Scrollable (String ename, int empno);

  37. Comandos Avançados: Scrollable Iterators (3 de 8) • Scrollable Interface: • setFetchDirection(int) • FETCH_FORWARD (default) • FETCH_REVERSE • getFetchDirection() • boolean isBeforeFirst() • boolean isFirst() • boolean isLast() • boolean isAfterLast()

  38. Comandos Avançados: Scrollable Iterators (4 de 8) • Métodos de navegação: • boolean previous() • boolean first() • boolean last() • boolean absolute(int) • boolean relative(int) • void beforeFirst() • void afterLast()

  39. Comandos Avançados: Scrollable Iterators (5 de 8) • Exemplo ...

  40. Comandos Avançados: Scrollable Iterators (6 de 8) • Scrollable Positional Iterators • O comando: • #sql { FETCH :iter INTO :x, :y, :z } É uma abreviação para: • #sql { FETCH NEXT FROM :iter INTO :x, :y, :z }

  41. Comandos Avançados: Scrollable Iterators (7 de 8) • O comando • #sql { FETCH NEXT FROM :iter INTO :x, :y, :z } sugere um padrão para movimentos alternativos: • #sql { FETCH PREVIOUS FROM :iter INTO :x, :y, :z } • #sql { FETCH FIRST FROM :iter INTO :x, :y, :z } • #sql { FETCH LAST FROM :iter INTO :x, :y, :z } • #sql { FETCH ABSOLUTE :n FROM :iter INTO :x, :y, :z } • #sql { FETCH RELATIVE :n FROM :iter INTO :x, :y, :z }

  42. Comandos Avançados: Scrollable Iterators (8 de 8) • Não podemos usar constantes numéricas para especificar movimentos: • #sql { FETCH RELATIVE 0 FROM :iter INTO :x, :y, :z }; (ERRADO) • #sql { FETCH RELATIVE :(0) FROM :iter INTO :x, :y, :z }; (OK)

  43. Comandos Avançados: Constantes (1 de 2) • Declaração com constantes • As constantes são sempre produzidas como “public static final”

  44. Comandos Avançados: Constantes (2 de 2) • Exemplo: #sql public iterator MyScrollableIterator implements sqlj.runtime.Scrollable with (sensitivity=ASENSITIVE) (String ename, int empno); • Sensitivity é um atributo da interface sqlj.runtime.ResultSetIterator • “with” sempre deve vir após “implements”

  45. Comandos Avançados: Transação (1 de 4) • Uma transação é uma seqüência de operações SQL que o BD trata como uma simples unidade • Uma transação começa depois de: • conectar ao Banco de Dados • depois de um COMMIT • depois de um ROLLBACK

  46. Comandos Avançados: Transação (2 de 4) • Commit automático • Por default o auto-commit tem o valor “false” • Ativando o auto-commit: Oracle.getConnection ( "jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger", true);

  47. Comandos Avançados: Transação (3 de 4) • Mudando o auto-commit • ctx.getConnection().setAutoCommit(false); ou • ctx.getConnection().setAutoCommit(true);

  48. Comandos Avançados: Transação (4 de 4) • Commit e Rollback manual • #sql { COMMIT } • #sql { ROLLBACK } • Não usar o COMMIT ou o ROLLBACK quando o auto-commit estiver habilitado

  49. Comandos Avançados: SQL Dinâmico (1 de 6) • O Oracle9i possui uma extensão para suportar SQL dinâmico em SQLJ • Operações que podem mudar em tempo de execução • “Meta bind” são usados para SQL dinâmico em SQLJ

  50. Comandos Avançados: SQL Dinâmico (2 de 6) • Sintaxe :{ Java_bind_expression } ou :{ Java_bind_expression :: SQL_replacement_code } Identificador ou expressão Java do tipo String Seqüência de SQL tokens

More Related