0
Passagem de Objetos entre Java e OracleTransformando e enviandoPojos Java como parâmetrospara Procedures em PL/SQLno Oracle.
?
Fatores:PL/SQL !!! / Java? Hibernate WTF??Contrato com a Oracle de longo prazoMáquina BD mais potente e ociosaAlgumas defi...
Como “era” feito:String sql = "insert into contatos (nome,email)values (?,?)";PreparedStatement stmt = con.prepareStatemen...
Como “era” feito:Statment stmt = con.createStatement();ResultSet rs;rs = stmt.executeQuery("select * from contatos");List<...
Depois:session.save(contato);
Como “era” feito:String proc = "{call procInsereContato(?,?,?)}";CallableStatement cs = con.prepareCall(proc);cs.registerO...
Como “era” feito:CREATE OR REPLACE PROCEDURE procInsereContato(      contatoId OUT Contatos.id%TYPE,      contatoNome IN C...
Como “era” feito:public class PessoaBean {  private   long idPessoa;  private   Date dtNascimento;  private   String nome;...
Como “era” feito:String proc = "{callprocCadastraPessoa(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,...
String proc = "{call procCadastraPessoa(?)}";   CallableStatement cs = con.prepareCall(proc);   cs.setObject(1, pessoa);  ...
Bizzaro!?
ojdbc14.jar
Primeira versãopublic class Bairro {    private int id;    private String nome;    public final String getNome() {       r...
Primeira versãopublic class Bairro {  private int id;  private String nome;  // getters e setters suprimidos   public STRU...
Primeira versãopublic STRUCT toSTRUCT(OracleConnection oconn) throwsSQLException {   StructDescriptor sd =StructDescriptor...
Primeira versãopublic void toBEAN(STRUCT struct) throws SQLException {    if (null != struct) {      Object[] attributes =...
Primeira versão                        DAOString proc = "{call procCadastraBairro(?)}";OracleCallableStatement cs = oconn....
Primeira versão                    ORACLECREATE OR REPLACE TYPE TP_BAIRRO AS OBJECT (   id      NUMBER(3),   nome    VARCH...
Primeira versão                    ORACLECREATE OR REPLACE PROCEDURE procCadastraBairro(      bairro IN OUT TP_BAIRRO)ISBE...
Primeira versão                     ORACLECREATE OR REPLACE PROCEDURE procCadastraBairro(      bairro IN OUT TP_BAIRRO)IS ...
Primeira versão                 LISTA no DAOString proc = "{call procPesquisarBairro(?,?)}";OracleCallableStatement cs = o...
Primeira versão                  LISTA no DAOARRAY array = cs.getARRAY(2);Datum[] lista = array.getOracleArray();List<Bair...
Primeira versão                    ORACLECREATE OR REPLACE TYPE TPLISTA_BAIRRO AS TABLE OFTP_BAIRRO;GRANT EXECUTE ON TPLIS...
Primeira versão                    ORACLECREATE OR REPLACE TYPE TPLISTA_BAIRRO AS TABLE OFNUMBER;CREATE OR REPLACE TYPE TP...
Primeira versão                    ORACLECREATE OR REPLACE PROCEDURE procPesquisarBairro(      bairro IN TP_BAIRRO,      l...
Primeira versão              ORACLESELECT VALUE(e)BULK COLLECT INTO listaBairrosFROM TABLE( CAST( MULTISET(    SELECT id, ...
Primeira versão                     toSTRUCT()Object[] attributes = {     int/long, // NUMBER     String, // VARCHAR2     ...
Primeira versão                   toSTRUCT()ARRAY listaOutroTipoArray = null;ArrayDescriptor ad =ArrayDescriptor.createDes...
Primeira versão                     toBEAN()Object[] valores = struct.getOracleAttributes();((NUMBER)valores[0]).intValue(...
Primeira versão                    toBEAN()CLOB cl = ((CLOB)valores[6]);Reader reader = cl.characterStreamValue();StringBu...
Primeira versão                    toBEAN()this.listaOutroTipo = new ArrayList<OutroTipo>();Datum[] lista = ((ARRAY)valore...
Primeira versãoimport   java.io.IOException;import   java.io.Reader;import   java.sql.SQLException;import   java.util.Arra...
Bizzaro!?
OracleTypeConverter@ DBType(value)@ NotInType@ SendNullOracleTypeConverterSTRUCTPrinter
OracleTypeConverter@DBType("TP_BAIRRO")public class Bairro {    private int id;    private String nome;    // getters e se...
OracleTypeConverter                        DAOString proc = "{call procCadastraBairro(?)}";OracleCallableStatement cs = oc...
OracleTypeConverter                 LISTA no DAOcs.setARRAY(1, OracleTypeConverter.toARRAY(oconn,listaBairros, "TPLISTA_BA...
OracleTypeConverter@DBType("TP_PAGINACAO")public class Paginacao {    private int pagina = 1;    private int quantRegistro...
OracleTypeConverter                    ORACLECREATE OR REPLACE TYPE TP_PAGINACAO AS OBJECT (   pagina           NUMBER,   ...
OracleTypeConverter@DBType("TP_OCORRENCIA")public class Ocorrencia {  private   Long id;  private   Assunto assunto;  priv...
OracleTypeConverter                    ORACLECREATE OR REPLACE TYPE   TP_OCORRENCIA AS OBJECT (   id                    NU...
OracleTypeConverter                DAO – Enviar CLOBcs.setSTRUCT(1, OracleTypeConverter.toSTRUCT(oconn,ocorrencia));cs.reg...
OracleTypeConverter
OracleTypeConverterNão converte FLOAT, DOUBLE, BigDecimal, BigInteger(ainda não precisei destes);A converão é baseada na o...
ReferênciasOracle Database JDBC Developers Guide and Reference:Working with Oracle Object Typeshttp://download.oracle.com/...
Obrigado!André Luis F. Reisarghos@gmail.comtwitter.com/andrelfreisfacebook.com/andrelfreislinkedin.com/in/andrelfreis
Passagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e Oracle
Upcoming SlideShare
Loading in...5
×

Passagem de Objetos entre Java e Oracle

1,549

Published on

Transformando e enviando Pojos Java como parametros para Procedures em PL/SQL no Oracle

Published in: Technology, News & Politics
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,549
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
11
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Passagem de Objetos entre Java e Oracle"

  1. 1. Passagem de Objetos entre Java e OracleTransformando e enviandoPojos Java como parâmetrospara Procedures em PL/SQLno Oracle.
  2. 2. ?
  3. 3. Fatores:PL/SQL !!! / Java? Hibernate WTF??Contrato com a Oracle de longo prazoMáquina BD mais potente e ociosaAlgumas definições de segurançaDesempenho (“idas” ao banco)
  4. 4. Como “era” feito:String sql = "insert into contatos (nome,email)values (?,?)";PreparedStatement stmt = con.prepareStatement(sql);stmt.setString(1, contato.getNome());stmt.setString(2, contato.getEmail());stmt.execute();
  5. 5. Como “era” feito:Statment stmt = con.createStatement();ResultSet rs;rs = stmt.executeQuery("select * from contatos");List<Contato> contatos = new ArrayList<Contato>();while (rs.next()) { int id = rs.getString("id"); String nome = rs.getString("nome"); String email = rs.getString("email"); Contato c = new Contato(id, nome, email); contatos.add(c);}
  6. 6. Depois:session.save(contato);
  7. 7. Como “era” feito:String proc = "{call procInsereContato(?,?,?)}";CallableStatement cs = con.prepareCall(proc);cs.registerOutParameter(1, java.sql.Types.NUMERIC);cs.setString(2, contato.getNome());cs.setString(3, contato.getEmail());cs.execute();contato.setId(cs.getInt(1));
  8. 8. Como “era” feito:CREATE OR REPLACE PROCEDURE procInsereContato( contatoId OUT Contatos.id%TYPE, contatoNome IN Contatos.nome%TYPE, contatoEmail IN Contatos.email%TYPE)ISBEGIN INSERT INTO Contatos (id, nome, email) VALUES (SQ_CON.NEXTVAL, contatoNome, contatoEmail) RETURNING id INTO contatoId;END;
  9. 9. Como “era” feito:public class PessoaBean { private long idPessoa; private Date dtNascimento; private String nome; private char sexo; private int idNacionalidade; private int idUF; private int idNaturalidade; private String naturalidadeExt; private int idCor; private int idEstadoCivil; private String telResidencial; private String telCelular; private String telComercial; private String email; private boolean stAtivo; private FiliacaoBean filiacaoBean;
  10. 10. Como “era” feito:String proc = "{callprocCadastraPessoa(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}";CallableStatement cs = con.prepareCall(proc);cs.setLong(1, pessoa.getIdPessoa());cs.setDate(2, pessoa.getDtNascimento());cs.setString(3, Character.toString(pessoa.getSexo()));cs.setInt(4, pessoa.getIdNacionalidade());cs.setInt(5, pessoa.getIdUF());cs.setInt(6, pessoa.getIdNaturalidade());cs.setString(7, pessoa.getNaturalidadeExt());cs.setInt(8, pessoa.getIdCor());cs.setInt(9, pessoa.getIdEstadoCivil());cs.setString(10, pessoa.getTelResidencial());
  11. 11. String proc = "{call procCadastraPessoa(?)}"; CallableStatement cs = con.prepareCall(proc); cs.setObject(1, pessoa); Pessoa p = cs.getObject(2);PROCEDURE procCadastraPessoa(Pessoa IN p);
  12. 12. Bizzaro!?
  13. 13. ojdbc14.jar
  14. 14. Primeira versãopublic class Bairro { private int id; private String nome; public final String getNome() { return nome; } public final void setNome(String nome) { this.nome = nome; } public final int getId() { return id; } public final void setId(int id) { this.id = id; }}
  15. 15. Primeira versãopublic class Bairro { private int id; private String nome; // getters e setters suprimidos public STRUCT toSTRUCT(OracleConnection oconn)throws SQLException { ... } public void toBEAN(STRUCT struct) throwsSQLException { ... }}
  16. 16. Primeira versãopublic STRUCT toSTRUCT(OracleConnection oconn) throwsSQLException { StructDescriptor sd =StructDescriptor.createDescriptor("TP_BAIRRO", oconn); Object[] attributes = { ( 0 >= this.id ? null : this.id ), ( "".equals(this.nome) ? null : this.nome ) }; return new STRUCT(sd, oconn, attributes);}
  17. 17. Primeira versãopublic void toBEAN(STRUCT struct) throws SQLException { if (null != struct) { Object[] attributes = struct.getOracleAttributes(); if (null != attributes[0]) { this.setId(((NUMBER)attributes[0]).intValue()); } if (null != attributes[1]) { this.setNome(((CHAR)attributes[1]).getString()); } }}
  18. 18. Primeira versão DAOString proc = "{call procCadastraBairro(?)}";OracleCallableStatement cs = oconn.prepareCall(proc);cs.setSTRUCT(1, bairro.toSTRUCT(oconn));cs.registerOutParameter(1, OracleTypes.STRUCT,"TP_BAIRRO");cs.execute();bairro.toBEAN(cs.getSTRUCT(1));
  19. 19. Primeira versão ORACLECREATE OR REPLACE TYPE TP_BAIRRO AS OBJECT ( id NUMBER(3), nome VARCHAR2(50));GRANT EXECUTE ON TP_BAIRRO TO USUARIO;
  20. 20. Primeira versão ORACLECREATE OR REPLACE PROCEDURE procCadastraBairro( bairro IN OUT TP_BAIRRO)ISBEGIN INSERT INTO Bairros (id, nome) VALUES (SQ_BAI.NEXTVAL, bairro.nome) RETURNING id INTO bairro.id;END;
  21. 21. Primeira versão ORACLECREATE OR REPLACE PROCEDURE procCadastraBairro( bairro IN OUT TP_BAIRRO)IS bairroId Bairros.id%TYPE;BEGIN INSERT INTO Bairros (id, nome) VALUES (SQ_BAI.NEXTVAL, bairro.nome) RETURNING id INTO bairroId; SELECT TP_BAIRRO(id, nome) INTO bairro FROM Bairros WHERE id = bairroId;END;
  22. 22. Primeira versão LISTA no DAOString proc = "{call procPesquisarBairro(?,?)}";OracleCallableStatement cs = oconn.prepareCall(proc);cs.setSTRUCT(1, bairro.toSTRUCT(oconn));cs.registerOutParameter(2, OracleTypes.ARRAY,"TPLISTA_BAIRRO");cs.execute(); CONTINUA...
  23. 23. Primeira versão LISTA no DAOARRAY array = cs.getARRAY(2);Datum[] lista = array.getOracleArray();List<Bairro> bairros = new ArrayList<Bairro>();for (int i = 0; i < lista.length; i++) { Bairro bairro = new Bairro(); bairro.toBEAN((STRUCT)lista[i]); bairros.add(bairro);}return bairros;
  24. 24. Primeira versão ORACLECREATE OR REPLACE TYPE TPLISTA_BAIRRO AS TABLE OFTP_BAIRRO;GRANT EXECUTE ON TPLISTA_BAIRRO TO USUARIO;
  25. 25. Primeira versão ORACLECREATE OR REPLACE TYPE TPLISTA_BAIRRO AS TABLE OFNUMBER;CREATE OR REPLACE TYPE TP_BAIRRO AS OBJECT ();/** Objetos desfeitos / inicio reconstrucao **/CREATE OR REPLACE TYPE TP_BAIRRO AS OBJECT ( id NUMBER(3), nome VARCHAR2(50));CREATE OR REPLACE TYPE TPLISTA_BAIRRO AS TABLE OFTP_BAIRRO;
  26. 26. Primeira versão ORACLECREATE OR REPLACE PROCEDURE procPesquisarBairro( bairro IN TP_BAIRRO, listaBairros OUT TPLISTA_BAIRRO)ISBEGIN SELECT TP_BAIRRO(id, nome) BULK COLLECT INTO listaBairros FROM Bairros WHERE nome = bairro.nome;END;
  27. 27. Primeira versão ORACLESELECT VALUE(e)BULK COLLECT INTO listaBairrosFROM TABLE( CAST( MULTISET( SELECT id, nome FROM Bairros WHERE nome = bairro.nome) AS TPLISTA_BAIRRO)) e;
  28. 28. Primeira versão toSTRUCT()Object[] attributes = { int/long, // NUMBER String, // VARCHAR2 boolean ? 1 : 0, // NUMBER(1) 3 estados ? 1 : 0 : null, // NUMBER(1) util.Date ? new Timestamp(date.getTime()), // DATE OutroTipo.toSTRUCT(oconn), // TP_OUTROTIPO String ? CLOB.getEmptyCLOB(), // CLOB listaOutroTipoArray // TPLISTA_OUTROTIPO};
  29. 29. Primeira versão toSTRUCT()ARRAY listaOutroTipoArray = null;ArrayDescriptor ad =ArrayDescriptor.createDescriptor("TPLISTA_OUTROTIPO",oconn);List<Object> listaItems = new ArrayList<Object>(); for (OutroTipo outro : this.listaOutroTipo) { listaItems.add(outro.toSTRUCT(oconn)); }listaOutroTipoArray = new ARRAY(ad, oconn, listaItems.toArray());}
  30. 30. Primeira versão toBEAN()Object[] valores = struct.getOracleAttributes();((NUMBER)valores[0]).intValue();((NUMBER)valores[1]).longValue();((CHAR)valores[2]).getString();((NUMBER)valores[3]).booleanValue();((DATE)valores[4]).timestampValue();this.outroTipo = new OutroTipo();this.outroTipo.toBEAN((STRUCT)valores[5]);
  31. 31. Primeira versão toBEAN()CLOB cl = ((CLOB)valores[6]);Reader reader = cl.characterStreamValue();StringBuffer sb = new StringBuffer();int nchars = 0;char[] buffer = new char[10];while((nchars = reader.read(buffer)) != -1) { sb.append(buffer, 0, nchars);}reader.close();this.setDescricao(sb.toString());
  32. 32. Primeira versão toBEAN()this.listaOutroTipo = new ArrayList<OutroTipo>();Datum[] lista = ((ARRAY)valores[7]).getOracleArray();for (int i = 0; i < lista.length; i++) { OutroTipo outro = new OutroTipo(); outro.toBEAN((STRUCT)lista[i]); this.listaOutroTipo.add(outro);}
  33. 33. Primeira versãoimport java.io.IOException;import java.io.Reader;import java.sql.SQLException;import java.util.ArrayList;import java.util.Date;import java.util.List;import oracle.jdbc.OracleConnection;import oracle.sql.ARRAY;import oracle.sql.ArrayDescriptor;import oracle.sql.CHAR;import oracle.sql.CLOB;import oracle.sql.DATE;import oracle.sql.Datum;import oracle.sql.NUMBER;import oracle.sql.STRUCT;import oracle.sql.StructDescriptor;
  34. 34. Bizzaro!?
  35. 35. OracleTypeConverter@ DBType(value)@ NotInType@ SendNullOracleTypeConverterSTRUCTPrinter
  36. 36. OracleTypeConverter@DBType("TP_BAIRRO")public class Bairro { private int id; private String nome; // getters e setters suprimidos}
  37. 37. OracleTypeConverter DAOString proc = "{call procCadastraBairro(?)}";OracleCallableStatement cs = oconn.prepareCall(proc);cs.setSTRUCT(1, OracleTypeConverter.toSTRUCT(oconn,bairro));cs.registerOutParameter(1, OracleTypes.STRUCT,OracleTypeConverter.getDBTypeAnnotation(Bairro.class));cs.execute();bairro = OracleTypeConverter.toBEAN(Bairro.class,cs.getSTRUCT(1));
  38. 38. OracleTypeConverter LISTA no DAOcs.setARRAY(1, OracleTypeConverter.toARRAY(oconn,listaBairros, "TPLISTA_BAIRRO"));cs.registerOutParameter(2, OracleTypes.ARRAY,"TPLISTA_BAIRRO");cs.execute();listaBairros =OracleTypeConverter.toList(Bairro.class,cs.getARRAY(2));
  39. 39. OracleTypeConverter@DBType("TP_PAGINACAO")public class Paginacao { private int pagina = 1; private int quantRegistros = 10; @SendNull private int total; @NotInType private String action; @DBType("TRISTATES") private String ativo; // getters e setters suprimidos}
  40. 40. OracleTypeConverter ORACLECREATE OR REPLACE TYPE TP_PAGINACAO AS OBJECT ( pagina NUMBER, quantRegistros NUMBER, total NUMBER, ativo NUMBER(1));
  41. 41. OracleTypeConverter@DBType("TP_OCORRENCIA")public class Ocorrencia { private Long id; private Assunto assunto; private Date dataCadastro; private boolean stImprimirCarta; @DBType("CLOB") private String descricao; @DBType("TPLISTA_ENCAMINHAMENTO") private List<Encaminhamento> listaEncaminhamento; @SendNull @DBType("TPLISTA_LOTEIMPRESSAO") private List<LoteImpressao> listaLoteImpressao;
  42. 42. OracleTypeConverter ORACLECREATE OR REPLACE TYPE TP_OCORRENCIA AS OBJECT ( id NUMBER, assunto TP_ASSUNTO, dataCadastro DATE, stImprimirCarta NUMBER(1), descricao CLOB, listaEncaminhamento TPLISTA_ENCAMINHAMENTO, listaLoteImpressao TPLISTA_LOTEIMPRESSAO);
  43. 43. OracleTypeConverter DAO – Enviar CLOBcs.setSTRUCT(1, OracleTypeConverter.toSTRUCT(oconn,ocorrencia));cs.registerOutParameter(2, OracleTypes.CLOB);cs.execute();CLOB clob = cs.getCLOB(2);Writer sw = clob.setCharacterStream(1L);sw.write(ob.getDescricao().trim().toCharArray());sw.flush();sw.close();
  44. 44. OracleTypeConverter
  45. 45. OracleTypeConverterNão converte FLOAT, DOUBLE, BigDecimal, BigInteger(ainda não precisei destes);A converão é baseada na ordem dos atributos;Cuidado com o tamanho da String para VARCHAR(?) edo Integer para NUMBER(?);Até o java 1.6 não existe suporte para o tipo Boolean doPL/SQL;Necessita de refatoração urgente!!!
  46. 46. ReferênciasOracle Database JDBC Developers Guide and Reference:Working with Oracle Object Typeshttp://download.oracle.com/docs/cd/B19306_01/java.102/b14355/oraoot.htmUsing PL/SQL Collections and Recordshttp://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/collections.htmOracle Database JPublisher Users Guide:Introduction to JPublisherhttp://download.oracle.com/docs/cd/B19306_01/java.102/b14188/intro.htmIntroduction to JPublisher # JDBC Mappinghttp://download.oracle.com/docs/cd/B19306_01/java.102/b14188/intro.htm#sthref50
  47. 47. Obrigado!André Luis F. Reisarghos@gmail.comtwitter.com/andrelfreisfacebook.com/andrelfreislinkedin.com/in/andrelfreis
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×