Upload
zanoni-silva
View
42
Download
1
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.