Tutorial integrado

34 respostas
M

ae pessoal, to escrevendo um textinho sobre DAO com acesso a DataSource, ai falei com o JavaTeco, ele disse q tava fazendo o mesmo… e além disso, um tutor de Value Object… q iria se encaixar no tutor de DAO dele, ai me surgiu uma idéia, q tal cada um de nós (q tiver um tempinho e disposição) fazer uma parte de um super tutorial, q abrangeria as principais camadas de uma aplicação, por ex, eu to fazendo a persistência, o JavaTeco tb junto com VO, ai aparece outro onde faz um sobre Facade, outro sobre mais abordagens na camada de negócios, outro sobre a camada View, outro mostrando como instalar a aplicação toda num container… respeitando os padrões e tal, ai acho q no final disso dava pra integrar o trabalho de cada um, e fazer um baita tutorial!!! oq acham? ai aqueles q tem mais facilidade em uma área da aplicação, poderiam colaborar… e aprendemos uns com os outros ainda! :grin: voluntários?

34 Respostas

J

matheus, perfeito, magnífico… vamos começar a organizar o negócio e fazer isso?

Ae pessoal, vamos participar… :galera:

M

então, como eu disse, eu imaginava uma aplicação completa no final, sendo distribuida como um .war ou .ear (dependendo da extenção do trabalho do pessoal :)) , sendo assim, teria q ter umas tabelas no banco tb, pra exemplificar na implementação dos bancos suportados pelo DAO por exemplo, poderia ser feito as classes relevantes ao MySQL, Oracle, Postgres, oq fosse, eu ja tenho essa parte praticamente pronta, só preciso das tabelas, pra modificar os SQLs, ai, tb poderia ser reaproveitado um tutor de Struts q a gente ja tem, falar com o autor do tutor, pra ver se ele gostaria de participar tb, fazendo um refactoring do tutor dele pra se encaixar no super tutor do PJ :grin: eu acho q sairia um trabalho de extremo valor pro pessoal q procura coisas completas por ai… eu por ex. hehehehe, algo como uma mini implementação da petstore da Sun pro PJ ehehe :slight_smile:

A

Ô Matheus, se você me der uma idéia do que é o banco, talvez eu possa montar as tabelas p/ Oracle e SQLServer.

(…) nessa terra de gigantes (…)

M

legal ademilton, como é um tutorial, eu tava pensando em fazer um banco bem pequeno, pra não ter muitos métodos de acesso no DAO, pra fins de simplicidade e clareza, a gente poderia ter algo como uma tabela aluno e outra professor, onde tu teria métodos de listar alunos por um id, inserir, remover, atualizar, e listar todos… o mesmo pra professores, só pra exemplificar a camada de persistência funcionando, até mesmo uma tabela ja serve, com algumas colunas integer e varchars… ta ótimo :grin: alguém sugere um modelo? poderia ser uma tabela onde salvasse os nomes da gente, usuários aqui do Portal, com nossa idade, e localização… :slight_smile:

J

Matheus, estava pensando em usar o SQL padrão. Ou seja, deixar nossas DAOs genéricas e independente de banco. Então não seria necessário criar DAOs para bancos diferentes. Portanto, seria apenas alterardo o DataSource e as DAO continuariam funcionando perfeitamente sem modificação. Pois esse é o intuito deste padrão… o que acha? Um extensão deste tutorial poderia ser depois fazer as especializações, mas acho legal fazer uma coisa genérica.

J

Oi

Que show… Parabeńs pra vcs…

Ae, eu estou por aí, como sempre… se precisarem de algo é só dar um grito… hehehehe

T+

M

javateco, a gente usa o padrão Abstract Factory ao invéz do Factory Method, o DAO serve exatamente pra deixar tua aplicação independente de banco, por exemplo, tu tem uma classe FactoryDAO abstrata q retorna uma DAO concreta em método statico, essa DAO abstrata seria a implementação do SQL pra um banco em especial… o DataSource tb se altera, pq tem q mudar o driver do banco, e possivelmente a URL, mas os SQLs tb são diferentes em muitos casos, é simples, eu ja tenho uma estrutura usando Abstract Factory aqui, só falta a gente definir qual será a tabela usada, q implemento os métodos do DAO concreto do Postgres e MySQL, no final, o cliente nem saberá qual banco esta sendo utilizado, ele só chama um método de acesso e deu, quem cuida disso é o DAO, depois q tivermos as classes concretas implementadas, nunca mais precisamos nos preocupar com a persistencia :slight_smile: posso ir passando o código pra ti ver se quiser

J

Entendi o que vc falou… é pq eu faço assim:

Tenho a DAO, e tenho as DAOs de tabelas usando SQL padrão. Caso precise utilizar alguma DAO especializada para um Banco, eu estendo a DAO padrão e especializo colocando funcionalidades do banco especifico(utizando tb um Factory). Com essa DAO padrão, qq DataSource que vc passe a DAO irá funcionar. Isso é importante, para aplicações onde o BD do cliente não é sabido antecipadamente.
Isso para o usuário, é transparente, mas digo isso a nivel de implementação, acho que fica mais legal.

E tb para o tutorial, pois a mostra ao leitor outra forma de pensar…

Não fica bravo em Matheus… hehehehehehehehe, é bom a gente discutir bem isso…

Não vai ser um tutorial e sim O TUTORIAL, se não for mais que isso… :grin:

M

hehe jóia, vamos aos nossos códigos, tu me mostra e explica o teu, q eu faço o mesmo com o meu, chegamos a um concenso e esta pronta a persistência :slight_smile:

A

Beleza, então matheus. Amanhã dou um jeito de largar o trampo mais cedo e escrever isto pra você. Vai ser rápido.

M

pessoal, como eu havia conversado com o JavaTeco por e-mail, e o Ademilton por uma MP, a gente ta pensando em qual estratégia utilizar pro DAO, Factory Method ou Abstract Factory, a diferença é a seguinte, o Factory Method implementa tudo com SQL ANSI padrão, ótima escolha qnd as operações realizadas no banco são simples, nenhum SELECT envolvendo alguma lógica q acarrete muito o desempenho…, já o Abstract Facotory tem uma DAO concreta pra cada banco, onde tem os SQLs de cada banco… ja podem perceber q é bem mais trabalhoso, porém, é a estratégia mais flexível, e se houverem operações dependentes de banco, é a melhor, por exemplo, o Oracle pode ter melhor desempenho em determinado SELECT pq usa recursos nativos dele, o Postgres já usaria outra solução pro mesmo problema, o MySQL outra… o SQL Server outra… sendo assim, cada DAO concreto seria realmente diferente, mas como a nivel de Tutorial só vão ser consideradas instruções básicas, acho q vamos ficar com o Factory Method… alguém tem mais algum argumento sobre isso? Vou ver se posto o diagrama de classes das duas estratégias aqui tb…

A

OK, matheus. Não consigo formular opinião sobre isso porque não conheço (não vejo a hora de sair o tutorial…), sou, como dizemos lá no trabalho “um mero digitador de SELECT’s”. Mas continuo de olho no caso aí e no que puder ajudar…

PS: da próxima vez que mandar uma MP fica melhor eu anexar o arquivo que estou referenciando, não é mesmo???

J

“ADEMILTON”:
OK, matheus. Não consigo formular opinião sobre isso porque não conheço (não vejo a hora de sair o tutorial…), sou, como dizemos lá no trabalho “um mero digitador de SELECT’s”. Mas continuo de olho no caso aí e no que puder ajudar…

PS: da próxima vez que mandar uma MP fica melhor eu anexar o arquivo que estou referenciando, não é mesmo???

blz kara… então, vamos montar um SQL ANSI, temos que ver qual versão, tipo tem a 92 e 99 (e se bobiar outras), mas se vc manjar disso, poderia nos dar uma mão… tipo, depois de criado a estrutura da DAO, terão que ser feitas as DAOs concretas que terão os SQL ANSI, ai vc poderia ver se realmente está no padrão ANSI… blz?

D

Se precisarem de ajuda to aki! Mas minha abrangencia vai ateh servlets e jsp, nada de EJB :cry: :cry:

eu tbm poderia criar as tabelas em MySQL e FireBird… e os DAOs

A

Beleza, então. Vou continuar acompanhando o tópico e tão logo tenha algo mais, envio p/ vocês…

A

Olá, matheus. Nem tenho muita certeza de que isso vai ajudar, mas de qualquer forma aí vai (detalhe - este é p/ SQLServer):

--início da criação do banco de dados
GO

CREATE DATABASE ESCOLA ON PRIMARY (
	NAME = DAT_ESCOLA,
	FILENAME = 'C:\ESCOLA.MDF')
LOG ON (
	NAME = LOG_ESCOLA,
	FILENAME = 'C:\ESCOLA.LDF')
	
--final da criação do banco de dados
GO	

--início da criação de tabelas

USE ESCOLA

GO

CREATE TABLE PROFESSORES (
	PROID INT CONSTRAINT PK_PROF PRIMARY KEY,
	PRONOME VARCHAR (20),
	PRODISCIPLINA VARCHAR (30)
)

GO

CREATE TABLE ALUNOS (
	ALUID INT CONSTRAINT PK_ALU PRIMARY KEY,
	ALUNOME VARCHAR (20),
	ALUDTNASC SMALLDATETIME
)

GO

CREATE TABLE MATRICULAS (
	MATCODPRO INT CONSTRAINT FK_MAT_PRO FOREIGN KEY REFERENCES PROFESSORES,
	MATCODALU INT CONSTRAINT FK_MAT_ALU FOREIGN KEY REFERENCES ALUNOS,
	MATDATA SMALLDATETIME,
	MATVALOR MONEY,
	CONSTRAINT PK_MAT PRIMARY KEY (MATCODPRO, MATCODALU)
)
--final da criação de tabelas

GO
--início dos inserts

INSERT INTO PROFESSORES VALUES (1,'MATHEUS','INTRODUÇÃO A J2SE')
INSERT INTO PROFESSORES VALUES (2,'JEVEAUX','INTRODUÇÃO A XML')
INSERT INTO PROFESSORES VALUES (3,'JAVATECO','J2EE AVANÇADO')
INSERT INTO PROFESSORES VALUES (4,'JUJO','MELHORES PRÁTICAS')
INSERT INTO PROFESSORES VALUES (5,'TOMAZLAVIERI','J2ME INTERMEDIÁRIO')

INSERT INTO ALUNOS VALUES (1,'MICROFILO',CAST('2004/06/21' AS SMALLDATETIME))
INSERT INTO ALUNOS VALUES (2,'DARKSEID',CAST('2004/05/10' AS SMALLDATETIME))
INSERT INTO ALUNOS VALUES (3,'CALDERAN',CAST('2004/05/27' AS SMALLDATETIME))
INSERT INTO ALUNOS VALUES (4,'RALPH',CAST('2004/02/18' AS SMALLDATETIME))
INSERT INTO ALUNOS VALUES (5,'DANIELBADAWI',CAST('2004/02/27' AS SMALLDATETIME))
INSERT INTO ALUNOS VALUES (6,'ZANATTO',CAST('2004/06/08' AS SMALLDATETIME))
INSERT INTO ALUNOS VALUES (7,'CANDAHAR',CAST('2004/05/09' AS SMALLDATETIME))
INSERT INTO ALUNOS VALUES (8,'FELIPE',CAST('2003/05/08' AS SMALLDATETIME))
INSERT INTO ALUNOS VALUES (9,'HEBER',CAST('2003/09/09' AS SMALLDATETIME))
INSERT INTO ALUNOS VALUES (10,'RAFARRV',CAST('2004/02/07' AS SMALLDATETIME))
INSERT INTO ALUNOS VALUES (11,'ADEMILTON',CAST('2004/01/15' AS SMALLDATETIME))

INSERT INTO MATRICULAS VALUES(1,11,CAST('2004/06/23' AS SMALLDATETIME),25.5)
INSERT INTO MATRICULAS VALUES(1,2,CAST('2004/05/19' AS SMALLDATETIME),25.5)
INSERT INTO MATRICULAS VALUES(1,4,CAST('2004/03/15' AS SMALLDATETIME),25.5)
INSERT INTO MATRICULAS VALUES(1,7,CAST('2004/06/17' AS SMALLDATETIME),25.5)
INSERT INTO MATRICULAS VALUES(1,5,CAST('2004/04/25' AS SMALLDATETIME),25.5)
INSERT INTO MATRICULAS VALUES(1,6,CAST('2004/07/03' AS SMALLDATETIME),25.5)
INSERT INTO MATRICULAS VALUES(1,3,CAST('2004/06/18' AS SMALLDATETIME),25.5)
INSERT INTO MATRICULAS VALUES(2,1,CAST('2004/06/26' AS SMALLDATETIME),15.7)
INSERT INTO MATRICULAS VALUES(2,8,CAST('2004/02/23' AS SMALLDATETIME),15.7)
INSERT INTO MATRICULAS VALUES(2,10,CAST('2004/04/19' AS SMALLDATETIME),15.7)
INSERT INTO MATRICULAS VALUES(2,11,CAST('2004/05/15' AS SMALLDATETIME),15.7)
INSERT INTO MATRICULAS VALUES(2,7,CAST('2004/06/19' AS SMALLDATETIME),15.7)
INSERT INTO MATRICULAS VALUES(2,9,CAST('2004/02/17' AS SMALLDATETIME),15.7)
INSERT INTO MATRICULAS VALUES(3,5,CAST('2004/03/18' AS SMALLDATETIME),27.3)
INSERT INTO MATRICULAS VALUES(3,1,CAST('2004/06/29' AS SMALLDATETIME),27.3)
INSERT INTO MATRICULAS VALUES(3,2,CAST('2004/06/15' AS SMALLDATETIME),27.3)
INSERT INTO MATRICULAS VALUES(3,4,CAST('2004/03/01' AS SMALLDATETIME),27.3)
INSERT INTO MATRICULAS VALUES(3,6,CAST('2004/07/05' AS SMALLDATETIME),27.3)
INSERT INTO MATRICULAS VALUES(4,2,CAST('2004/03/25' AS SMALLDATETIME),30)
INSERT INTO MATRICULAS VALUES(4,7,CAST('2004/06/27' AS SMALLDATETIME),30)
INSERT INTO MATRICULAS VALUES(4,3,CAST('2004/05/28' AS SMALLDATETIME),30)
INSERT INTO MATRICULAS VALUES(4,1,CAST('2004/07/02' AS SMALLDATETIME),30)
INSERT INTO MATRICULAS VALUES(5,9,CAST('2004/06/10' AS SMALLDATETIME),21)
INSERT INTO MATRICULAS VALUES(5,10,CAST('2004/05/30' AS SMALLDATETIME),21)
INSERT INTO MATRICULAS VALUES(5,7,CAST('2004/06/23' AS SMALLDATETIME),21)
INSERT INTO MATRICULAS VALUES(5,11,CAST('2004/04/18' AS SMALLDATETIME),21)
INSERT INTO MATRICULAS VALUES(5,2,CAST('2004/06/16' AS SMALLDATETIME),21)
M

é ótimo ademilton, a gente só tinha q definir uma função pra essa aplicação, poderia ser até mais simples do q essas tabelas, poderia ser só uma tabela… com nome e telefone… onde a aplicação seria uma agenda telefonica web… o banco pode ser bem simples, a intenção é focar em padrões de projeto… :slight_smile: pelo menos foi nisso q eu pensei qnd abri o tópico hehehe, estou estudando a implementação do DAO com o JavaTeco

J

E ai pessaol… estava precisando do esquema da tabela, pra mim começar a montar as DAOs com SQL Ansi… tem como já definir o o esquema delas? Estou dependendo disso pra continuar a implementação… postem quais as tabelas e campos e tal… blz? Estou esperando…

A

Rollback nisso, então, caras. Confirme um esquema assim, se estiver ok:

uma tabela “Agenda”, com os seguintes campos:

ID do Contato - tipo numérico;

Nome do Contato - tipo texto;

Data de Nascimento - tipo data;

Telefone do Contato - tipo numérico (para armazenar sem formatação);

e-mail do Contato - tipo texto;

Faz sentido pra vocês??? Alguém manda mais algum campo???

J

“ADEMILTON”:
Rollback nisso, então, caras. Confirme um esquema assim, se estiver ok:

uma tabela “Agenda”, com os seguintes campos:

ID do Contato - tipo numérico;

Nome do Contato - tipo texto;

Data de Nascimento - tipo data;

Telefone do Contato - tipo numérico (para armazenar sem formatação);

e-mail do Contato - tipo texto;

Faz sentido pra vocês??? Alguém manda mais algum campo???

Blz kara… não precisa ter muitos campos… o que tem esta ótimo… Só acho que o nome da tabela deveria ser alguma coisa como Pessoa, que seria mais expressivo… o que acha? Temos que criar mais uma tabela, o que sugerem? Com pouco campos, tipo uns 5 no máximo… blz?

A

Bom, indo nessa de agenda, mudamos o nome para Pessoas, e que tal criar outra tipo, “Compromissos” ?

poderia ficar +/- assim:

ID Pessoa - tipo numérico (para se relacionar com a tabela Pessoas, fazendo com que possamos cadastrar +d1 compromisso para cada pessoa)
Data compromisso - tipo data completa (com dia, mes, ano, hora e minuto),
sendo também chave primária para impedir +d1 compromisso no mesmo instante,
Descrição compromisso - tipo texto,
Prioridade - tipo numérico

Acha que agora vai?

R

eu não sei nada deste trecos ai, mas se quiserem alguem que manja um pouco de sql server 2000, po fala

sei umas coisas básicas e médias…

inner join, trigger, stored proc, rollback, umas tabelas virtuais, cursor…

nada muito avançado

M

javateco, como vai o teu DAO? hehehe… cara, eu ja tenho ele em Factory Method prontinho aqui… (foi oq eu te mandei no mail se nao me engano) se quiser, podemos dar progresso ao tutor, só tem q ver como será a base… prefiro q tenha só uma tabela… o mais simples possivel… pq o tutor não é de banco de dados né… hehehe

J

Eu tb já tenho tudo pronto aqui… domingo agora mando pra vc o projeto, fiz umas tabelas aqui:

Pessoa e Empresa… onde tem uns 5 campos cada um…

Há e outra coisa legal que eu fiz… fiz um classe que vc passa uma tabela de um banco de dados, e ela gerar um VO referente a essa tabela… Ou seja, ele cria um arquivo java, no qual o nome do arquivo será, TabelaDoBancoVO.java, com todos métodos set e get.

Já até usei ele para gerar as VOs das duas tabelas (Pessoa e Empresa)…

Agora estou fazendo o GeraDAO, onde vc também passa uma tabela e ele gera todos os stripts de inserção, exclusão e busca…

Assim podemos montar um tutorial e explicar como funciona e ainda teremos uma ferramenta automatizada para gerar DAOs e VOs…

Está ficando show…

M

esse lance de gerar automático ai eu to por fora… :roll:

J

Estou só fazendo isso pra ter um tutorial com ferramentas que ajudem na hora de desenvolver… além de explicarmos os conceitos… falei que seria o Tutorial… hehehehehhe :wink:

M

tão ta… é só tu me dar a interface dos métodos do DAO, e oq eles retornam, q eu ja posso ir dando continuidade nas outras camadas :slight_smile:

J

Para não estender muito eu coloquei somente estes:

public abstract void insert(VO vo, Map map) throws ExcecaoDAO;

  public abstract void delete(VO vo, Map map) throws ExcecaoDAO;

  public abstract Collection findAll() throws ExcecaoDAO;

  public abstract VO findByPrimayKey(VO vo) throws ExcecaoDAO;

Vou te mandar o projeto… blz?

Esses Map como parametros, depois eu explico… mas é bom deixar… pode sempre passar null…

Quero ver se hoje eu termino o GeraDAO ai vou criar as DAOs e já mando o projeto pra vc…

M

…pra q é o Map sendo passado junto? :roll:

M

só pra deixá-los a parte, eu ja fiz a estrutura dos padrões business delegate, facade (ja q o tutor vai ser pequeno, nao seria necessario facade, mas eu pretendo explicar no tutor pra ele serve e tal) e service locator, tem um EJB q é o Facade, q vai acessar direto o DAO… e o business delegate, poderia ser acessado por uma aplicação web struts, ou um Swing… é só a gente selecionar quais as operações q o sistema fará no banco pra continuar… :slight_smile:

I

Só por curiosidade

vcs pararam de fazer o tutorial integrado???

M

bah cara, eu dei uma parada, pq to dando uma guinada aqui, to me mudando pra POA, a nivel de sobrevivente por enquanto… hehehehe, mas logo q eu me ajeitar lá, e tiver mais tempo eu vou dar uma turbinada no tutor, q ta demorando mesmo… :roll:

M

Bom pessoal, pena q vcs param o Tutorial integrado, mas…

Mateus e JavaTeco, será q vcs poderia mandar os Codes q vcs já tem prontos, pq eu to procurando uns exemplos simples porem funcionais de DAO, mas num to conseguindo achar. se puderem mandar, eu agradeço

[email removido]

Obrigado

M

blz marocos, eu te mando tudo oq ja fiz cara, fim de semana pode ser? os códigos estão na minha máquina no AP, ai lá a net é discada… afff… :???: , qnd eu me achar por aqui continuo a codificação, mais tarde só vou precisar de alguem pra fazer o banco, e o cliente, com um struts e outro desktop … pra mostrar q funciona igualmente pros dois… hehe

Criado 3 de julho de 2004
Ultima resposta 10 de ago. de 2004
Respostas 34
Participantes 8