Raible's Wiki

Raible Designs
Wiki Home
News
Recent Changes

AppFuse

Homepage
  - Korean
  - Chinese
  - Italian
  - Japanese

QuickStart Guide
  - Chinese
  - French
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish
  - Japanese

User Guide
  - Korean
  - Chinese

Tutorials
  - Chinese
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish

FAQ
  - Korean

Latest Downloads

Other Applications

Struts Resume
Security Example
Struts Menu

Set your name in
UserPreferences


Referenced by
Articles
Articles_pt
CreateManager_pt
LeftMenu




JSPWiki v2.2.33

[RSS]


Hide Menu

CreateDAO_pt


Difference between version 36 and version 22:

At line 178 changed 2 lines.
<div class="note" style="font-size: 12px">
<a name="appgen"></a>__A Ferramenta AppGen__
%%note <a name="appgen"></a>__NOTE:__ AppFuse versions 1.6.1+ contain include an [AppGen] tool that can be used to generate all the classes for the rest of these tutorials. However, it's best that you go through these tutorials before using this tool - then you'll know what code it's generating.%%
At line 181 removed 17 lines.
Como parte da 1.6.1, eu criei uma ferramenta __AppGen__ que pode ser usada para gerar todas as classes para o restante destes tutoriais. Esta ferramenta foi baseada em contribuições de [Lance Lavandowska|https://appfuse.dev.java.net/issues/show_bug.cgi?id=60] e [Ben Gill|https://appfuse.dev.java.net/issues/show_bug.cgi?id=78]. No início, eu não quis adicionar uma característica de geração de código como essa porque você terminaria com um 1-para-1 relacionamento entre tabelas/pojos, DAOs e Managers. Em muito de meu projetos, eu tenho de longe menos DAOs e Managers do que POJOs.
Por padrão, AppGen irá gerar somente Actions/Controllers, Action/Controller Tests, test data, i18n keys e JSPs. Irá também configurar Actions/Controllers para você. Ele usa as classes genéricas BaseManager e BaseDaoHibernate (configurada como "manager" e "dao") reduzindo o número de arquivos que são gerados. Porém, eu percebi que algumas vezes você irá querer gerar todas as classes DAO e Manager (e também seus tests), assim eu adicionei esta opção também.
Para usar a ferramenta AppGen (depois de instalar sua framework web), execute os seguintes passos:
# Crie seu POJO (no diretório model) e <a href="#ref-CreateDAO-5">configure o arquivo de mapeamento</a> in applicationContext-hibernate.xml.
# cd dentro do ''extras/appgen'' diretório e execute "ant -Dobject.name=Person -Dappgen.type=pojo". Neste exemplo, uma classe __Person__ deve existir em seu pacote "model". Isto gera todos os arquivos que você criou no tutoriais neste site (para sua framework web de escolha).
# Para instalar os arquivos gerados, execute "ant install". Você pode executar "ant install -Dmodel.name=Person -Dmodel.name.lowercase=person" se você desejar fazer tudo de uma única vez. __ATENÇÃO:__ Você deveria fazer backup de seu projeto antes de executar esta opção - ou pelo menos ter certeza que ele foi gravado no seu repositório de código fonte. Eu testei este código, e penso que funciona bem - mas ele ''está'' modificando a árvore de código-fonte para você.
A razão para o "lowercase" parâmetro é renomear as JSPs para começar com uma letra minúscula. Se eu tentasse renomá-los e alterado o nome do arquivo programaticamente, levaria à 1MB a importância da BSF e Rhino JARs (+5 linhas de código) e desta forma me pareceu mais fácil. Falando de JSPs - depende de você modificar o *Form.jsp e fazê-lo paracer melhor. Isto é abrangido no passo 5 de cada respectiva framework web "Create Action/Controller" tutorial: <a href="http://raibledesigns.com/wiki/Wiki.jsp?page=CreateActions#ref-CreateAction-5">Struts</a>, <a href="http://raibledesigns.com/wiki/Wiki.jsp?page=SpringControllers#ref-SpringControllers-5">Spring</a> and <a href="http://raibledesigns.com/wiki/Wiki.jsp?page=WebWorkActions#ref-WebWorkActions-5">WebWork</a>.
__NOTA:__ Se você quizer gerar tudo DAOs/Managers/Tests, execute "ant install-detailed" no lugar de "ant install". Antes de você instalar tudo, os arquivos serão criados no extras/appgen/build/gen diretório (caso você queira dar uma olhada antes de instalar). Se você somente quizer testar a ferramenta, você pode cd para este diretório e executar "ant test" para vê o conteúdo destes tutoriais criados.
Eu o encorago a ler estes tutorias mesmo se você decidir gerar todo seu código. Desta forma você irá entender o que está sendo gerado para você e somente precisará das lista de usuários para [perguntando questões inteligentes|http://www.catb.org/~esr/faqs/smart-questions.html]. ;-) Espero que esta ferramenta irá remover o sofrimento de escrever simples código CRUD e deixar você concentrar no desenvolvimento de suas regras/lógica de negócio e UIs especiais!</div>
At line 200 changed 1 line.
Para começar, crie uma classe PessoaDaoTest.java no diretório test/dao/**/dao. Esta classe deve estender [BaseDaoTestCase|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDAOTestCase.java.html], que já existe neste pacote. Esta classe pai é usada para carregar ApplicationContext do [Spring's|http://www.springframework.org] (Spring une todas as camadas), e para automaticamente carregar um arquivo .properties (ResourceBundle) que tem o mesmo nome que sua classe *Test.class. Neste exemplo, se você colocar um arquivo PessoaDAOTest.properties no mesmo diretório que PessoaDAOTest.java, este arquivo de propriedades estará disponível via uma variável “rb”.
Para começar, crie uma classe PessoaDaoTest.java no diretório test/dao/**/dao. Esta classe deve estender [BaseDaoTestCase|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDAOTestCase.java.html], sub-classe da classe [AbstractDependencyInjectionSpringContextTests|http://www.springframework.org/docs/api/org/springframework/test/AbstractDependencyInjectionSpringContextTests.html] do Spring que já existe neste pacote. Esta classe pai é usada para carregar ApplicationContext do [Spring's|http://www.springframework.org] (Spring une todas as camadas), e para (opcionalmente) carregar um arquivo .properties (ResourceBundle) que tem o mesmo nome que sua classe *Test.class. Neste exemplo, se você colocar um arquivo PessoaDAOTest.properties no mesmo diretório que PessoaDAOTest.java, este arquivo de propriedades estará disponível via uma variável “rb”.
At line 208 removed 2 lines.
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
At line 191 added 1 line.
import org.springframework.dao.DataAccessException;
At line 212 removed 1 line.
At line 215 removed 3 lines.
//~ Instance fields ========================================================
At line 221 changed 4 lines.
//~ Methods ================================================================
protected void setUp() {
log = LogFactory.getLog(PersonDaoTest.class);
dao = (PersonDao) ctx.getBean("personDao");
public void setPersonDao(PersonDao dao) {
this.dao = dao;
At line 226 removed 8 lines.
protected void tearDown() {
dao = null;
}
public static void main(String[] args) {
junit.textui.TestRunner.run(PersonDaoTest.class);
}
At line 237 changed 1 line.
O código que você vê acima é o que precisamos para um teste JUnit básico, que inicializa e destrói nosso PessoaDAO. O objeto “ctx” é uma referência ao ApplicationContext do Spring, o qual é inicializado em um bloco estático da classe [BaseDaoTestCase's|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDaoTestCase.java.html] class.
O código que você vê acima é o que precisamos para um teste de integração Spring básico que inicializa e destrói nosso PessoaDAO. Spring irá usar autowiring (auto-ligamento) por tipo para chamar o método ''setPersonDao()'' e atribuir o bean "personDao" como uma dependência desta classe.
At line 225 added 1 line.
At line 266 changed 1 line.
assertTrue(person.getLastName().equals("Last Name Updated"));
assertEquals(person.getLastName(), "Last Name Updated");
At line 249 added 1 line.
At line 284 changed 1 line.
assertNull(dao.getPerson(person.getId()));
try {
person = dao.getPerson(person.getId());
fail("Person found in database");
} catch (DataAccessException dae) {
log.debug("Expected exception: " + dae.getMessage());
assertNotNull(dae);
}
At line 325 changed 1 line.
Primeiro, crie a interface PessoaDAO.java no diretório src/dao/**/dao e especifique os métodos CRUD básicos para qualquer classe de implementação. Eliminei as partes JavaDocs na classe abaixo apenas por propósito de visualização.''
Primeiro, crie a interface PessoaDAO.java no diretório src/dao/**/dao e especifique os métodos CRUD básicos para qualquer classe de implementação. Eliminei as partes JavaDocs na classe abaixo apenas por propósito de visualização.
At line 333 removed 2 lines.
import java.util.List;
At line 336 removed 3 lines.
public List getPeople(Person person);
At line 340 changed 3 lines.
public void savePerson(Object person);
public void savePerson(Person person);
At line 357 removed 3 lines.
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
At line 328 added 1 line.
import org.springframework.orm.ObjectRetrievalFailureException;
At line 363 removed 3 lines.
import java.util.List;
At line 368 changed 1 line.
private Log log = LogFactory.getLog(PersonDaoHibernate.class);
public Person getPerson(Long id) {
Person person = (Person) getHibernateTemplate().get(Person.class, id);
At line 370 changed 3 lines.
public List getPeople(Person person) {
return getHibernateTemplate().find("from Person");
}
if (person == null) {
throw new ObjectRetrievalFailureException(Person.class, id);
}
At line 374 changed 2 lines.
public Person getPerson(Long id) {
return (Person) getHibernateTemplate().get(Person.class, id);
return person;
At line 378 changed 1 line.
public void savePerson(Object person) {
public void savePerson(Person person) {
At line 383 changed 2 lines.
Object person = getHibernateTemplate().load(Person.class, id);
getHibernateTemplate().delete(person);
// object must be loaded before it can be deleted
getHibernateTemplate().delete(getPerson(id));
At line 389 removed 21 lines.
Você notará aqui que não estamos fazendo nada com o parâmetro pessoa. Isto é somente um “place holder” por enquanto – no futuro você pode filtrar suas propriedades usando [Hibernate's Query Language|http://www.hibernate.org/hib_docs/reference/en/html/queryhql.html] (HQL) ou usando [Criteria Queries|http://www.hibernate.org/hib_docs/reference/en/html/querycriteria.html].
''Um exemplo usando Criteria Query:''
[{Java2HtmlPlugin
Example example = Example.create(person)
.excludeZeroes() //exclude zero valued properties
.ignoreCase(); //perform case insensitive string comparisons
try {
return getSession().createCriteria(Person.class)
.add(example)
.list();
} catch (Exception e) {
throw new DAOException(e);
}
return new ArrayList();
}]
At line 423 removed 2 lines.
<value>org/appfuse/model/UserCookie.hbm.xml</value>
<value>org/appfuse/model/UserRole.hbm.xml</value>
At line 453 changed 1 line.
''Next Up:'' __Part II:__ [Creating new Managers|CreateManager] - A HowTo for creating [Business Delegates|http://java.sun.com/blueprints/corej2eepatterns/Patterns/BusinessDelegate.html] that talk to the database tier (DAOs) and the web tier (Struts Actions).
''Próxima:'' __Parte II:__ [Criando novos Managers|CreateManager_pt] - Um "HowTo" para criar [Business Delegates|http://java.sun.com/blueprints/corej2eepatterns/Patterns/BusinessDelegate.html] que comunicam-se com a camada de banco de dados (DAOs) e web (Spring Controllers).

Back to CreateDAO_pt, or to the Page History.