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_cn
Articles_pt
Articles_zh
CreateManager_zh
LeftMenu
SandBox




JSPWiki v2.2.33

[RSS]


Hide Menu

CreateDAO_zh


Difference between version 23 and version 13:

At line 1 changed 1 line.
__Part I:__ [在AppFuse建立DAO和对象|CreateDAO_zh] - 一个建立对象(代表数据库的表)和把这些对象存储到数据库的Java类的教程。
__Part I:__ [在AppFuse建立DAO和POJO |CreateDAO_zh] - 一个建立对象(代表数据库的表)和把这些对象存储到数据库的Java类的教程。
At line 43 changed 1 line.
%%note __注意:__ 直接拷贝本教程的代码 [在FireFox下无效|http://raibledesigns.com/page/rd?anchor=java2html_plugin_for_jspwiki_causes],但我们可以通过CTRL+Click选定一个代码所在的工作区(OS X下是Command+Click),然后再拷贝。%%
%%note __注意:__ [不能在FireFox中|http://raibledesigns.com/page/rd?anchor=java2html_plugin_for_jspwiki_causes]直接拷贝本教程的代码 ,但我们可以通过CTRL+Click选定一个代码所在的工作区(OS X下是Command+Click),然后再拷贝。%%
At line 62 changed 1 line.
这个类必须扩展[BaseObject|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/model/BaseObject.java.html],而这个BaseObject有三个抽象方法(equals(), hashCode()和toString())需要你在Person类里实现,前两个是Hibernate的需要。为了完成这部分工作最简单的方式是使用[Commonclipse|http://commonclipse.sf.net],关于这个工具更多的信息可以在[Lee Grey的网站|http://www.leegrey.com/hmm/2004/09/29/1096491256000.html]里看到,另外一个你可以使用的Eclipse的插件是[Commons4E|http://commons4e.berlios.de/],我还没有使用过,这里不便对其功能作出评论。
这个类必须扩展[BaseObject|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/model/BaseObject.java.html],而这个BaseObject有三个抽象方法(equals(), hashCode()和toString())需要你在Person类里实现,前两个是Hibernate的需要。为了完成这部分工作最简单的方式是使用[Commonclipse|http://commonclipse.sf.net],关于这个工具更多的信息可以在[Lee Grey的站点|http://www.leegrey.com/hmm/2004/09/29/1096491256000.html]里看到,另外一个你可以使用的Eclipse的插件是[Commons4E|http://commons4e.berlios.de/],我还没有使用过,这里不便对其功能作出评论。
At line 93 changed 1 line.
;:%%(color: blue)''我使用{{generator-class="increment"}}而不使用{{generate-class="native"}} 是因为我对数据库使用"native"时[发现了一些问题|AppFuseOnDB2],如果你只是希望使用MySQL,__推荐使用"native"值__,本教程使用increment。''%%
;:%%(color: blue)''我使用{{generator-class="increment"}}而不使用{{generate-class="native"}} 是因为我对数据库使用"native"时[发现一些问题|AppFuseOnDB2],如果你只是希望使用MySQL,__推荐使用"native"值__,本教程使用increment。''%%
At line 181 changed 1 line.
现在,我们要创建一个DaoTest来测试我们的DAO的工作,“等会儿”,你说,“我们还不曾创建DAO呢!”,你说得对。无论如何,我发现[测试驱动开发|http://www.artima.com/intv/testdriven.html]大大的促进了软件质量,在许多年里我一直认为__在写代码之前写测试__是胡说八道,这看起来很愚蠢,但当我尝试之后我认为这样非常好,现在我按照测试驱动的方式工作完全因为我发现这样可以大大提高我软件开发的效率。
现在,我们要创建一个DaoTest来测试我们的DAO的工作,“等会儿”,你说,“我们还不曾创建DAO呢!”,你说得对。无论如何,我发现[测试驱动开发|http://www.artima.com/intv/testdriven.html]大大的促进了软件质量,在许多年里我一直认为__在写代码之前写测试__是胡说八道,这看起来很愚蠢,但当我尝试之后我认为这样非常好,现在我按照测试驱动的方式工作完全因为我发现这样可以大大提高我软件开发的效率。
At line 199 changed 3 lines.
protected void setUp() throws Exception {
super.setUp();
dao = (PersonDao) ctx.getBean("personDao");
public void setPersonDao(PersonDao dao) {
this.dao = dao;
At line 203 removed 5 lines.
protected void tearDown() throws Exception {
super.tearDown();
dao = null;
}
At line 213 changed 1 line.
现在我们需要实际测试DAO中的CRUD(create, retrieve, update, delete)方法,为此我们需要为每个方法建立以test(全部小写)开头的测试方法,只要这个方法是公共的,返回类型是void,它们就会被我们build.xml中的Ant的<junit>任务<junit>调用,如下是一些简单的CRUD测试,需要注意的一点是所有的方法(或者叫做测试)必须是自治的,添加如下代码到文件{{PersonDaoTest.java}}:
现在我们需要实际测试DAO中的CRUD(create, retrieve, update, delete)方法,为此我们需要为每个方法建立以test(全部小写)开头的测试方法,只要这个方法是公共的,返回类型是void,它们就会被我们build.xml中的Ant的<junit>任务调用,如下是一些简单的CRUD测试,需要注意的一点是所有的方法(或者叫做测试)必须是自治的,添加如下代码到文件{{PersonDaoTest.java}}:
At line 304 changed 1 line.
在目前情况下,还不可以编译PersonDaoTest,因为在类路径里还没有PersonDao.class,我们需要创建它。PersonDAO.java是一个接口,PersonDAOHibernate.java是它的Hibernate实现,让我们继续,开始创建。
在目前情况下,还不可以编译PersonDaoTest,因为在类路径里还没有PersonDao.class,我们需要创建它。PersonDao.java是一个接口,PersonDaoHibernate.java是它的Hibernate实现,让我们继续,开始创建。
At line 317 added 75 lines.
;:''运行dao测试的ant任务叫做__test-dao__,如果你传递testcase参数(用__-Dtestcase=name__),它会查看{{**/*${testcase}*}}允许我们传递Person、PersonDao、或者PersonDaoTest以及所有会执行PersonDaoTest的类。''
让我们创建一个实现PersonDao的类PersonDaoHibernate并使用Hibernate来get/save/delete这个Person对象,为此,我们在{{src/dao/**/dao/hibernate}}创建一个新类{{PersonDaoHibernate.java}},它应该扩展[BaseDaoHibernate|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDAOHibernate.java.html],并且实现PersonDao。''为了简洁,省略Javadocs。''
[{Java2HtmlPlugin
package org.appfuse.dao.hibernate;
import org.appfuse.model.Person;
import org.appfuse.dao.PersonDao;
import org.springframework.orm.ObjectRetrievalFailureException;
public class PersonDaoHibernate extends BaseDaoHibernate implements PersonDao {
public Person getPerson(Long id) {
Person person = (Person) getHibernateTemplate().get(Person.class, id);
if (person == null) {
throw new ObjectRetrievalFailureException(Person.class, id);
}
return person;
}
public void savePerson(Person person) {
getHibernateTemplate().saveOrUpdate(person);
}
public void removePerson(Long id) {
// object must be loaded before it can be deleted
getHibernateTemplate().delete(getPerson(id));
}
}
}]
现在,如果你运行__ant test-dao -Dtestcase=PersonDao__,你会得到同样的错误,我们必须配置Spring来让它知道PersonDaoHibernate是PersonDao的实现,同样的,我们也要告诉它还有个Person对象。
!!配置Spring中的Person和PersonDao [#5]
首先我们要告诉Spring所有Hibernate文件的位置,为此,打开{{src/dao/**/dao/hibernate/applicationContext-hibernate.xml}},在以下代码块添加{{"Person.hbm.xml"}}。
[{Java2HtmlPlugin
<property name="mappingResources">
<list>
<value>org/appfuse/model/Person.hbm.xml</value>
<value>org/appfuse/model/Role.hbm.xml</value>
<value>org/appfuse/model/User.hbm.xml</value>
</list>
</property>
}]
&#29616;&#22312;&#25105;&#20204;&#38656;&#35201;&#28155;&#21152;&#19968;&#20123;XML&#25968;&#25454;&#26469;&#32465;&#23450;PersonDaoHibernate&#21040;PersonDao&#65292;&#20026;&#27492;&#65292;&#28155;&#21152;&#22914;&#19979;&#20195;&#30721;&#21040;&#25991;&#20214;&#24213;&#37096;&#65306;
[{Java2HtmlPlugin
<!-- PersonDao: Hibernate implementation -->
<bean id="personDao" class="org.appfuse.dao.hibernate.PersonDaoHibernate">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
}]
;:''&#20320;&#20063;&#21487;&#20197;&#20026;&lt;bean&gt;&#20351;&#29992;__autowire="byName"__&#23646;&#24615;&#26469;&#28040;&#38500;"sessionFactory"&#23646;&#24615;''&#12290;%%(color: blue)''&#20174;&#20010;&#20154;&#26469;&#35762;&#65292;&#25105;&#21916;&#27426;&#22312;XML&#25991;&#20214;&#37324;&#20445;&#30041;&#23545;&#35937;&#30340;&#20381;&#36182;&#12290;''%%
!!&#36816;&#34892;DaoTest[#6]
&#20445;&#23384;&#25152;&#26377;&#20462;&#25913;&#30340;&#25991;&#20214;&#65292;&#36816;&#34892;__ant test-dao -Dtestcase=PersonDao__&#12290;
__Yeah Baby, Yeah:__
%%(color:green)BUILD SUCCESSFUL\\
Total time: 9 seconds%%
----
''&#19979;&#19968;&#37096;&#20998;:'' __Part II:__ [创建新的Manager|CreateManager_zh] - &#26159;&#19968;&#20010;&#24314;&#31435;&#31867;&#20284;&#20110;[Session Facades|http://java.sun.com/blueprints/patterns/SessionFacade.html]&#30340;&#65292;&#20294;&#19981;&#20351;&#29992;EJBs&#30340;&#19994;&#21153;Facade&#35828;&#26126;&#65292;&#36825;&#20010;facades&#29992;&#26469;&#24314;&#31435;&#20174;&#21069;&#31471;&#21040;DAO&#23618;&#30340;&#32852;&#31995;&#12290;

Back to CreateDAO_zh, or to the Page History.