Você está na página 1de 37

InterSystems Cach - Java

Amir Samary (asamary@intersys.com)


http://www.intersystems.com.br
news://news.intersystems.com
InterSystems Corporation

O que faremos
Parte I: Instalar o Cach e Definir nossas Classes
Parte 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 Java

Parte I
Cach

O nosso pequeno projeto


%Library.Persistent
...

universidade.Aluno

universidade.Curso
1..1

Matricula: %Integer
Nome: %String
Email: %String

+Curso

%Library.Populate
Populate(n)

Nome: %String
Codigo: %Integer

O nosso pequeno projeto


universidade.Aluno
Matricula: %Integer
Nome: %String
Email: %String

1..1
+Endereco

empresa.Endereco
Rua
Numero

Agregao

Aluno
Endereo

Curso

Criando a classe Aluno


Clique no cubo do Cach no
System Tray do Windows.

Escolha a opo Studio


Utilizaremos o Cach Studio

toda vez que precisarmos definir


classes.

Criando a classe Aluno


Depois 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 Relacionamento
Crie uma

propriedade
chamada Curso,
na classe Aluno,
do tipo
Relacionamento

Populando nossas classes


Compile as duas classes
Ambas 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.

Consultando nossas classes


Clique no cubo do Cach no
System Tray do Windows.

Escolha a opo Gerenciador de


SQL

Cach e Java

Parte II
JDBC

JDBC

ODBC

Conectando via JDBC

SQL

Faremos uma aplicao Java


para Listar os Cursos e outra
para mostrar o nome e o curso
de um aluno cujo email foi
informado.

Cach Engine

Driver JDBC
Classe que implementa a interface JDBC
Fornecidas pelo vendedor do banco de dados
Permite o acesso ao banco de dados
Banco de Dados Cach
Pacote CacheDB.jar
(com.intersys.jdbc.CacheDriver)

Suporte a Pool de Conexes

Estabelecendo uma Conexo


Connection 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 Statement
Statement stat = conn.createStatement();
//executa query
String 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 statement
stat.close();
...

Executando um PreparedStatement
...
//cria PreparedStatement
String 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 query
pstmt.setString(1, args[0]);
//executando a query
ResultSet rs = pstmt.executeQuery();
if (rs.next())
{
//apresenta os dados selecionados
System.out.println("Nome: " + rs.getString(1) + " Curso: " +
rs.getString(2));
}
//fechando o PreparedStatement
pstmt.close();
...

Cach e Java

Parte III
Objetos

Objetos Cach
Todas as classes bsicas esto no CacheDB.jar
Para obter uma conexo precisamos de:
String de conexo
(jdbc:Cache://maquina:porta/namespace )
Usurio
Senha

Conexo estabelecida atravs da classe


CacheDatabase

A classe Persistent
%Library.Persistent

Tambm est no CacheDB.jar

...

a superclasse de todos os

objetos persistentes do Cach

Possui mtodos para abrir, salvar


universidade.Aluno
Matricula: %Integer
Nome: %String
Email: %String

e apagar objetos, dentre outros.

Java Binding
%Library.Persistent
...

As suas classes no esto no


CacheDB.jar

Elas devem ser projetadas para


classes Java e adicionadas ao
seu projeto.

universidade.Aluno
Matricula: %Integer
Nome: %String
Email: %String

public class Aluno extends Persistent


{
....
}

Como funciona
Cach Process

JVM

Objeto
Cach

Objeto
Proxy

Rede TCP/IP

Suas classes
Cach exportadas

CacheDB.jar

Definindo uma query


Vamos criar

uma query para


listar os Cursos

O nome de

nossa query
ser listar

Definindo uma query


Class 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 objeto

No se esquea de compilar a sua classe (CTRL+F7)!

Definindo a Projeo
Uma vez definida, toda

vez que compilarmos a


classe, um .java
correspondente ser
gerado em disco

Definindo a Projeo
Class universidade.Curso Extends (%Persistent, %Populate)
[ ClassType = persistent, Language = Basic, ProcedureBlock ]
{
Projection JavaProj As %Projection.Java(ROOTDIR = c:\Projeto");
....

aconselhvel que esta projeo seja definida em cada classe.


Compile as suas classes (CTRL+F7) e veja o resultado na pasta
c:\Projetos!

Estabelecendo uma Conexo


Database 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 classe
curso.setNome("Cach University");
curso.setCodigo(new Integer(1972));
// Uma CacheException pode ser disparada durante o salvamento
curso._save();
// No preciso fechar o objeto aberto
// Fechamos apenas Connections, Databases, ResultSets,
// Statements, etc...

Criando um Mtodo de Classe


Class 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 Java


Class 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...

Transaes
No JDBC voc utiliza mtodos de sua connection para gerenciar
transaes

Quando trabalha-se com objetos, no usamos uma Connection,


mas sim um Database

Utilize os mtodos de seu objeto Database atual:

public void transationStart()


public void transationCommit()
public void transationRollback()

Todos eles disparam CacheException

JavaDoc do CacheDB.jar
C:\CacheSys\Dev\Java\doc\index.html

InterSystems Cach - Java


Amir Samary (asamary@intersys.com)
http://www.intersystems.com.br
news://news.intersystems.com
InterSystems Corporation