37
InterSystems Caché - Java Amir Samary ([email protected]) http:// www.intersystems.com.br news:// news.intersystems.com InterSystems Corporation

Amir Samary - Curso de Caché Com Java v3

Embed Size (px)

DESCRIPTION

Apostila de Cache com Java

Citation preview

  • InterSystems Cach - JavaAmir Samary ([email protected])http://www.intersystems.com.brnews://news.intersystems.comInterSystems Corporation

  • O que faremosParte I: Instalar o Cach e Definir nossas ClassesParte II: Construir uma Aplicao JDBC para listar todos os Cursos cadastrados.Parte III: Construir uma Aplicao acessando o banco via objetos para listar os Alunos de um Curso.

  • Cach e JavaParte ICach

  • O nosso pequeno projeto1..1+Curso

  • O nosso pequeno projeto

  • Agregao

  • Criando a classe AlunoClique no cubo do Cach no System Tray do Windows.Escolha a opo StudioUtilizaremos o Cach Studio toda vez que precisarmos definir classes.

  • Criando a classe AlunoO Studio nos abre um projeto novo e vazio no namespace USER.Vamos criar a nossa classe neste novo projeto

  • Criando a classe AlunoMarque que a classe possui suporte a populao automtica de dados.

  • Criando a classe AlunoClass universidade.Aluno Extends (%Persistent, %Populate) [ ClassType = persistent, Language = Basic, ProcedureBlock ]{

    }

    Agora s falta definir as propriedades de nossa classe.

  • Criando a classe AlunoClass universidade.Aluno Extends (%Persistent, %Populate) [ ClassType = persistent, Language = Basic, ProcedureBlock ]{Property Nome As %String [ Required ];Property EMail As %String [ Required ];Property Matricula As %Integer [ Required ];

    Index MatriculaIndex On Matricula [ Unique ];Index EMailIndex On EMail [ Unique ];}

  • Criando a classe AlunoDepois de ter criado as propriedades, digite CTRL+F7 para compilar a classe.Navegue pela estrutura de pacotes na janela de projetos para encontrar a sua classe.Crie a classe universidade.Curso seguindo os mesmos passos.Salve o seu projeto dando um nome para ele.

  • Definindo um RelacionamentoCrie uma propriedade chamada Curso, na classe Aluno, do tipo Relacionamento

  • Definindo um RelacionamentoCada aluno aponta para um objeto da classe CursoA propriedade inversa AlunosFinish

  • Populando nossas classesCompile as duas classesAmbas as classes herdam de Populate.Ambas as classes possuem agora um mtodo Populate(n), onde n o nmero de objetos a serem criados.Executar Populate(10) em Curso.Executar Populate(100) em Aluno.

  • Populando nossas classes

  • Consultando nossas classesClique no cubo do Cach no System Tray do Windows.Escolha a opo Gerenciador de SQL

  • Consultando nossas classes

  • Cach e JavaParte IIJDBC

  • Conectando via JDBCFaremos uma aplicao Java para Listar os Cursos e outra para mostrar o nome e o curso de um aluno cujo email foi informado.

  • Driver JDBCClasse que implementa a interface JDBCFornecidas pelo vendedor do banco de dadosPermite o acesso ao banco de dadosBanco de Dados CachPacote CacheDB.jar (com.intersys.jdbc.CacheDriver)Suporte a Pool de Conexes

  • Estabelecendo uma ConexoConnection conn = null;try { //registra o driver Cach Class.forName(com.intersys.jdbc.CacheDriver); // URL JDBC para o Cach String url = jdbc:Cache://127.0.0.1:1972/User; String usuario = _system; String senha = sys; //conecta com o banco de dados conn = DriverManager.getConnection(url, usuario, senha);}catch (Exception ex) { }//fechar conexo no finally

  • Executando um Statement...//cria StatementStatement stat = conn.createStatement();//executa queryString query = "select Nome, Codigo from universidade.Curso";ResultSet rs = stat.executeQuery(query);//para cada linha retornada...while (rs.next()){ //apresentar os dados relacionados System.out.println("Cdigo: " + rs.getString(2) + " Nome: " + rs.getString(1));}//fechar o statementstat.close();...

  • Executando um PreparedStatement...//cria PreparedStatementString query=select Nome, Curso->Nome from universidade.Aluno where Email=?;PreparedStatement pstmt = conn.prepareStatement(query);//passando o e-mail da linha de comando para a querypstmt.setString(1, args[0]);//executando a queryResultSet rs = pstmt.executeQuery();if (rs.next()){ //apresenta os dados selecionados System.out.println("Nome: " + rs.getString(1) + " Curso: " + rs.getString(2));}//fechando o PreparedStatementpstmt.close();...

  • Cach e JavaParte IIIObjetos

  • Objetos CachTodas as classes bsicas esto no CacheDB.jarPara obter uma conexo precisamos de:String de conexo (jdbc:Cache://maquina:porta/namespace )UsurioSenhaConexo estabelecida atravs da classe CacheDatabase

  • A classe PersistentTambm est no CacheDB.jar a superclasse de todos os objetos persistentes do CachPossui mtodos para abrir, salvar e apagar objetos, dentre outros.

  • Java BindingAs suas classes no esto no CacheDB.jarElas devem ser projetadas para classes Java e adicionadas ao seu projeto.

  • Como funciona

  • Definindo uma queryVamos criar uma query para listar os CursosO nome de nossa query ser listar

  • Definindo uma queryVamos retornar apenas o ID e o Nome dos objetos

  • Definindo uma queryVamos ordernar apenas por Nome

  • Definindo uma queryClass universidade.Curso Extends (%Persistent, %Populate) [ ClassType = persistent, Language = basic, ProcedureBlock ]{

    Query listar() As %SQLQuery(CONTAINID = 1){SELECT %ID,Nome FROM Curso ORDER BY Nome}....CONTAINID aponta para o ndice da coluna no SELECT que contm o ID do objetoNo se esquea de compilar a sua classe (CTRL+F7)!

  • Definindo a ProjeoUma vez definida, toda vez que compilarmos a classe, um .java correspondente ser gerado em disco

  • Definindo a Projeo aconselhvel que esta projeo seja definida em cada classe.Compile as suas classes (CTRL+F7) e veja o resultado na pasta c:\Projetos!

    Class universidade.Curso Extends (%Persistent, %Populate) [ ClassType = persistent, Language = Basic, ProcedureBlock ]{

    Projection JavaProj As %Projection.Java(ROOTDIR = c:\Projeto");

    ....

  • Estabelecendo uma ConexoDatabase db = null;try { // URL JDBC para o Cach String url = jdbc:Cache://127.0.0.1:1972/User; String usuario = _system; String senha = sys; //conecta com o banco de dados db = CacheDatabase.getDatabase (url, usuario, senha);}catch (Exception ex) {}//fechar database no finally

  • Executando uma query// preciso passar o database como primeiro // argumento de todo mtodo de classe.

    CacheQuery cq = Curso.query_listar(db);

    // ResultSet do pacote java.sql// Neste caso, o a nossa query no recebe argumento algum.ResultSet rs = cq.execute();while (rs.next()){System.out.println(rs.getString(1) + " - " + rs.getString(2));}

    // No se esquea de fechar o ResultSet!rs.close();

  • Abrindo um Objeto// preciso passar o database como primeiro // argumento de todo mtodo de classe.// Um id deve ser encapsulado em um objeto da classe Id()

    Curso curso = (Curso) Curso._open(db, new Id(1));

    if (curso!=null) {System.out.println("Nome do curso: " + curso.getNome());}

    // No preciso fechar o objeto aberto// Fechamos apenas Connections, Databases, ResultSets,// Statements, etc...

  • Criando um Objeto// preciso passar o database tambm para os construtores// de objetos recm criados

    Curso curso = new Curso(db);

    // O Cach gera os mtodos set e get para cada propriedade da classecurso.setNome("Cach University");curso.setCodigo(new Integer(1972));

    // Uma CacheException pode ser disparada durante o salvamentocurso._save();

    // No preciso fechar o objeto aberto// Fechamos apenas Connections, Databases, ResultSets,// Statements, etc...

  • Criando um Mtodo de ClasseClass universidade.Curso Extends (%Persistent, %Populate) [ ClassType = persistent, ProcedureBlock ]{

    ClassMethod RecuperarPorCodigo(cod As %Integer) As universidade.Curso [Language = basic ] { Set rs = New %ResultSet() rs.Prepare("select ID from universidade.Curso where codigo=?") rs.Execute(cod) If rs.Next() Then Return Me.%OpenId(rs.Get("ID")) End If Return ""}....

  • Executando um mtodo de classe// preciso passar o database tambm para os construtores// de objetos recm criados

    Curso curso = (Curso) Curso.RecuperarPorCodigo(db, new Integer(123));

    if (curso!=null) {System.out.println("Nome do curso: " + curso.getNome());}

    // No preciso fechar o objeto aberto// Fechamos apenas Connections, Databases, ResultSets,// Statements, etc...

  • Criando um Mtodo de Classe JavaClass universidade.Curso Extends (%Persistent, %Populate) [ ClassType = persistent, ProcedureBlock ]{

    Method toString() As %String [Language = java ] { try { return this.getNome(); } catch (Exception e) {} return ; }....

  • Executando um mtodo de classe// preciso passar o database tambm para os construtores// de objetos recm criados

    Curso curso = (Curso) Curso.RecuperarPorCodigo(db, new Integer(123));

    if (curso!=null) {System.out.println("Nome do curso: " + curso);}

    // No preciso fechar o objeto aberto// Fechamos apenas Connections, Databases, ResultSets,// Statements, etc...

  • TransaesNo JDBC voc utiliza mtodos de sua connection para gerenciar transaesQuando trabalha-se com objetos, no usamos uma Connection, mas sim um DatabaseUtilize os mtodos de seu objeto Database atual:public void transationStart()public void transationCommit()public void transationRollback()Todos eles disparam CacheException

  • JavaDoc do CacheDB.jarC:\CacheSys\Dev\Java\doc\index.html

  • InterSystems Cach - JavaAmir Samary ([email protected])http://www.intersystems.com.brnews://news.intersystems.comInterSystems Corporation

    O driver JDBC necessrio para traduzir as chamadas a API JDBC para o banco de dados especfico, alm de isolar sua aplicao do banco de dados utilizado.Em verses mais antigas do banco de dados Cach, o driver est no pacote CacheJDBC.jarPara a utilizao da ponte JDBC-ODBC necessrio o registro do banco de dados no ODBC.No trecho de cdigo apresentamos a criao de um objeto Statement, a execuo de uma query utilizando o mtodo executeQuery(), e a apresentao dos resultados obtidos a partir do objeto ResultSet retornado da queryNote o uso dos mtodos getXXX() que tem de estar de acordo com os tipos no banco de dadosOs mtodos no Cach que iniciam com % so traduzidos para _ em Java.Os mtodos no Cach que iniciam com % so traduzidos para _ em Java.Os mtodos no Cach que iniciam com % so traduzidos para _ em Java.