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 5:

At line 1 changed 1 line.
__Part I:__ [在AppFuse建立DAO和对象|CreateDAO_zh] - 一个建立对象(代表数据库的表)和把这些对象存储到数据库的Java类的教程。
__Part I:__ [在AppFuse建立DAO和POJO |CreateDAO_zh] - 一个建立对象(代表数据库的表)和把这些对象存储到数据库的Java类的教程。
At line 25 added 367 lines.
;:要在命令行下执行的命令是这个样子: __ant test-all__.
;:&#23545;&#30446;&#24405;&#25110;&#32773;&#21253;&#20013;&#30340;&#25991;&#20214;&#30340;&#24341;&#29992;&#26159;&#36825;&#20010;&#26679;&#23376;: <font size="2">{{build.xml}}</font>.
;:%%(color: blue)''&#25105;&#22312;“&#30495;&#23454;&#19990;&#30028;”&#20013;&#23454;&#38469;&#25805;&#20316;&#30340;&#26041;&#24335;&#29992;&#34013;&#33394;&#26012;&#20307;&#34920;&#31034;&#12290;''%%
&#35753;&#25105;&#20204;&#32487;&#32493;&#22312;AppFuse&#39033;&#30446;&#30340;&#32467;&#26500;&#19979;&#21019;&#24314;&#19968;&#20010;&#26032;&#30340;&#23545;&#35937;&#12289;DAO&#21644;&#27979;&#35797;&#12290;
!&#30446;&#24405;
* [1] &#24314;&#31435;&#19968;&#20010;&#23545;&#35937;&#65292;&#24182;&#19988;&#20316;[XDoclet|http://xdoclet.sf.net]&#26631;&#35760;
* [2] &#20351;&#29992;Ant&#26681;&#25454;&#23545;&#35937;&#24314;&#31435;&#25968;&#25454;&#24211;&#20013;&#30340;&#34920;
* [3] &#21019;&#24314;&#19968;&#20010;DaoTest&#26469;&#36816;&#34892;DAO&#23545;&#35937;&#30340;JUnit&#27979;&#35797;
* [4] &#21019;&#24314;&#19968;&#20010;&#26032;&#30340;DAO&#26469;&#25191;&#34892;&#20851;&#20110;&#36825;&#20010;&#23545;&#35937;&#30340;CRUD&#25805;&#20316;
* [5] &#22312;spring&#37324;&#37197;&#32622;Person&#21644;PersonDao
* [6] &#36816;&#34892;DaoTest
!!&#24314;&#31435;&#19968;&#20010;&#23545;&#35937;&#65292;&#24182;&#19988;&#20316;XDoclet&#26631;&#35760; [#1]
&#25105;&#20204;&#35201;&#20570;&#30340;&#31532;&#19968;&#20214;&#20107;&#24773;&#23601;&#26159;&#24314;&#31435;&#19968;&#20010;&#38656;&#35201;&#25345;&#20037;&#21270;&#30340;&#23545;&#35937;&#65292;&#25105;&#20204;&#35201;&#22312;{{src/dao/**/model}}&#30446;&#24405;&#19979;&#24314;&#31435;&#19968;&#20010;&#31616;&#21333;&#30340;Person&#23545;&#35937;&#65292;&#36825;&#20010;&#23545;&#35937;&#21253;&#25324;id&#12289;firstName&#21644;lastName&#23646;&#24615;&#12290;
%%note __&#27880;&#24847;&#65306;__ [不能在FireFox中|http://raibledesigns.com/page/rd?anchor=java2html_plugin_for_jspwiki_causes]&#30452;&#25509;&#25335;&#36125;&#26412;&#25945;&#31243;&#30340;&#20195;&#30721; &#65292;&#20294;&#25105;&#20204;&#21487;&#20197;&#36890;&#36807;CTRL+Click&#36873;&#23450;&#19968;&#20010;&#20195;&#30721;&#25152;&#22312;&#30340;&#24037;&#20316;&#21306;(OS X&#19979;&#26159;Command+Click)&#65292;&#28982;&#21518;&#20877;&#25335;&#36125;&#12290;%%
[{Java2HtmlPlugin
package org.appfuse.model;
public class Person extends BaseObject {
private Long id;
private String firstName;
private String lastName;
/*
Generate your getters and setters using your favorite IDE:
In Eclipse:
Right-click -> Source -> Generate Getters and Setters
*/
}
}]
&#36825;&#20010;&#31867;&#24517;&#39035;&#25193;&#23637;[BaseObject|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/model/BaseObject.java.html]&#65292;&#32780;&#36825;&#20010;BaseObject&#26377;&#19977;&#20010;&#25277;&#35937;&#26041;&#27861;(equals(), hashCode()&#21644;toString())&#38656;&#35201;&#20320;&#22312;Person&#31867;&#37324;&#23454;&#29616;&#65292;&#21069;&#20004;&#20010;&#26159;Hibernate&#30340;&#38656;&#35201;&#12290;&#20026;&#20102;&#23436;&#25104;&#36825;&#37096;&#20998;&#24037;&#20316;&#26368;&#31616;&#21333;&#30340;&#26041;&#24335;&#26159;&#20351;&#29992;[Commonclipse|http://commonclipse.sf.net]&#65292;&#20851;&#20110;&#36825;&#20010;&#24037;&#20855;&#26356;&#22810;&#30340;&#20449;&#24687;&#21487;&#20197;&#22312;[Lee Grey的站点|http://www.leegrey.com/hmm/2004/09/29/1096491256000.html]&#37324;&#30475;&#21040;&#65292;&#21478;&#22806;&#19968;&#20010;&#20320;&#21487;&#20197;&#20351;&#29992;&#30340;Eclipse&#30340;&#25554;&#20214;&#26159;[Commons4E|http://commons4e.berlios.de/]&#65292;&#25105;&#36824;&#27809;&#26377;&#20351;&#29992;&#36807;&#65292;&#36825;&#37324;&#19981;&#20415;&#23545;&#20854;&#21151;&#33021;&#20316;&#20986;&#35780;&#35770;&#12290;
;:''&#22914;&#26524;&#20320;&#20351;&#29992;[IntelliJ IDEA|http://www.jetbrains.com/idea]&#65292;&#20320;&#21487;&#20197;&#33258;&#21160;&#20135;&#29983;equals()&#21644;hashCode()&#65292;&#20294;&#27809;&#26377;toString()&#65292;&#26377;&#19968;&#20010; [ToStringPlugin|http://www.intellij.org/twiki/bin/view/Main/ToStringPlugin]&#25554;&#20214;&#20570;&#24471;&#38750;&#24120;&#19981;&#38169;''
&#29616;&#22312;&#25105;&#20204;&#24050;&#32463;&#21019;&#24314;&#20102;&#36825;&#20010;POJO&#23545;&#35937;&#65292;&#25105;&#20204;&#38656;&#35201;&#22686;&#21152;XDoclet&#26631;&#35760;&#26469;&#20135;&#29983;Hibernate&#30340;&#26144;&#23556;&#25991;&#20214;&#65292;&#36825;&#20123;&#25991;&#20214;&#29992;&#26469;&#26144;&#23556;&#23545;&#35937;&rarr; &#34920;&#21644;&#23646;&#24615;(&#21464;&#37327;) &rarr; &#23383;&#27573;&#12290;
&#39318;&#20808;&#65292;&#25105;&#20204;&#22686;&#21152;[@hibernate.class|http://xdoclet.sourceforge.net/tags/hibernate-tags.html#@hibernate.class%20(0..1)] &#26469;&#21578;&#35785;Hibernate&#25105;&#20204;&#23558;&#35201;&#21644;&#37027;&#20010;&#34920;&#20316;&#20851;&#32852;&#65306;
[{Java2HtmlPlugin
/**
* @hibernate.class table="person"
*/
public class Person extends BaseObject {
}]
&#25105;&#20204;&#20063;&#35201;&#22686;&#21152;&#20027;&#38190;&#30340;&#26144;&#23556;,&#21542;&#21017;XDoclet&#20250;&#22312;&#20135;&#29983;&#26144;&#23556;&#25991;&#20214;&#26102;&#20986;&#38169;,&#27880;&#24847;&#25152;&#26377;&#30340;@hibernate.*&#26631;&#31614;&#24517;&#39035;&#22312;__getters'__&#30340;Javadocs&#37324;&#38754;&#12290;
[{Java2HtmlPlugin
/**
* @return Returns the id.
* @hibernate.id column="id"
* generator-class="increment" unsaved-value="null"
*/
public Long getId() {
return this.id;
}
}]
;:%%(color: blue)''&#25105;&#20351;&#29992;{{generator-class="increment"}}&#32780;&#19981;&#20351;&#29992;{{generate-class="native"}} &#26159;&#22240;&#20026;&#25105;&#23545;&#25968;&#25454;&#24211;&#20351;&#29992;"native"&#26102;[发现一些问题|AppFuseOnDB2]&#65292;&#22914;&#26524;&#20320;&#21482;&#26159;&#24076;&#26395;&#20351;&#29992;MySQL&#65292;__&#25512;&#33616;&#20351;&#29992;"native"&#20540;__&#65292;&#26412;&#25945;&#31243;&#20351;&#29992;increment&#12290;''%%
!!&#20351;&#29992;Ant&#26681;&#25454;&#23545;&#35937;&#20135;&#29983;&#25968;&#25454;&#24211;&#34920;[#2]
&#22312;&#36825;&#31181;&#24773;&#20917;&#19979;,&#20320;&#21487;&#20197;&#36890;&#36807;&#36816;&#34892;__ant setup-db__&#26469;&#24314;&#31435;person&#34920;&#65292;&#36825;&#20010;&#20219;&#21153;&#20250;&#20135;&#29983;&#25991;&#20214;{{Person.hbm.xml}}&#24182;&#19988;&#20250;&#24314;&#31435;&#21483;&#20570;"person"&#30340;&#34920;&#65292;&#20174;Ant&#30340;&#25511;&#21046;&#21488;&#31383;&#21475;&#65292;&#20320;&#21487;&#20197;&#30475;&#21040;Hibernate&#20026;&#20320;&#24314;&#31435;&#30340;&#34920;&#32467;&#26500;&#30340;&#20869;&#23481;&#12290;
{{{
[schemaexport] create table person (
[schemaexport] id bigint not null,
[schemaexport] primary key (id)
[schemaexport] );
}}}
&#22914;&#26524;&#20320;&#26597;&#30475;Hibernate&#29983;&#25104;&#30340;&#25991;&#20214;{{Person.hbm.xml}}&#65292;&#21487;&#20197;&#21040;{{build/dao/gen/**/model}}&#30446;&#24405;&#65292;&#36825;&#37324;&#26159;{{Person.hbm.xml}}&#30340;&#20869;&#23481;(&#30446;&#21069;&#30340;&#20869;&#23481;):
[{Java2HtmlPlugin
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class
name="org.appfuse.model.Person"
table="person"
dynamic-update="false"
dynamic-insert="false"
>
<id
name="id"
column="id"
type="java.lang.Long"
unsaved-value="null"
>
<generator class="increment">
</generator>
</id>
<!--
To add non XDoclet property mappings, create a file named
hibernate-properties-Person.xml
containing the additional properties and place it in your merge dir.
-->
</class>
</hibernate-mapping>
}]
&#29616;&#22312;&#25105;&#20204;&#35201;&#20026;&#20854;&#23427;&#30340;&#23383;&#27573;(first_name, last_name)&#28155;&#21152;&#39069;&#22806;&#30340;[@hibernate.property|http://xdoclet.sourceforge.net/tags/hibernate-tags.html#@hibernate.property%20(0..1)]&#26631;&#31614;&#65306;
[{Java2HtmlPlugin
/**
* @hibernate.property column="first_name" length="50"
*/
public String getFirstName() {
return this.firstName;
}
/**
* @hibernate.property column="last_name" length="50"
*/
public String getLastName() {
return this.lastName;
}
}]
&#22312;&#36825;&#20010;&#20363;&#23376;&#37324;&#65292;&#28155;&#21152;''column''&#23646;&#24615;&#30340;&#21807;&#19968;&#21407;&#22240;&#26159;&#22240;&#20026;&#36825;&#20010;&#23383;&#27573;&#21517;&#19982;&#23427;&#30340;&#23646;&#24615;&#21517;&#19981;&#30456;&#21516;&#65292;&#22914;&#26524;&#20182;&#20204;&#30456;&#21516;&#65292;&#20320;&#27809;&#26377;&#24517;&#35201;&#26469;&#25351;&#23450;''column''&#23646;&#24615;&#65292;&#20851;&#20110;&#20854;&#23427;&#21487;&#20197;&#20351;&#29992;&#30340;&#26631;&#31614;&#35831;&#30475;[@hibernate.property|http://xdoclet.sourceforge.net/tags/hibernate-tags.html#@hibernate.property%20(0..1)]&#12290;
&#20877;&#27425;&#36816;&#34892;__ant setup-db__&#25226;&#26032;&#21152;&#30340;&#23646;&#24615;&#21152;&#21040;&#25968;&#25454;&#24211;&#34920;&#37324;&#12290;
{{{[schemaexport] create table person (
[schemaexport] id bigint not null,
[schemaexport] first_name varchar(50),
[schemaexport] last_name varchar(50),
[schemaexport] primary key (id)
[schemaexport] );}}}
&#22914;&#26524;&#26399;&#26395;&#20462;&#25913;&#23383;&#27573;&#30340;&#38271;&#24230;&#65292;&#20462;&#25913;@hibernate.property&#26631;&#31614;&#30340;''length''&#23646;&#24615;&#65292;&#22914;&#26524;&#24076;&#26395;&#25226;&#23383;&#27573;&#25913;&#20026;&#24517;&#28155;&#23383;&#27573;(NOT NULL)&#65292;&#21487;&#20197;&#22686;&#21152;&#23646;&#24615;not-null="true"&#12290;
!!&#24314;&#31435;&#26032;&#30340;DaoTest&#26469;&#23545;&#20320;&#30340;DAO&#36816;&#34892;JUnit&#27979;&#35797;[#3]
%%note <a name="appgen"></a>__&#27880;&#24847;:__&#20174;Appfuse&#29256;&#26412;1.6.1+&#24320;&#22987;&#21253;&#25324;&#20102;&#19968;&#20010;[AppGen]&#24037;&#20855;&#65292;&#21487;&#20197;&#29992;&#26469;&#29983;&#25104;&#26412;&#25945;&#31243;&#20313;&#19979;&#30340;&#25152;&#26377;&#30340;&#31867;&#30340;&#20195;&#30721;&#65292;&#19981;&#36807;&#65292;&#25105;&#20204;&#26368;&#22909;&#36824;&#26159;&#20808;&#36807;&#19968;&#36941;&#25945;&#31243;&#20877;&#20351;&#29992;&#36825;&#20010;&#24037;&#20855;&#20135;&#29983;&#20195;&#30721;&#12290;%%
&#29616;&#22312;&#65292;&#25105;&#20204;&#35201;&#21019;&#24314;&#19968;&#20010;DaoTest&#26469;&#27979;&#35797;&#25105;&#20204;&#30340;DAO&#30340;&#24037;&#20316;&#65292;“&#31561;&#20250;&#20799;”&#65292;&#20320;&#35828;&#65292;“&#25105;&#20204;&#36824;&#19981;&#26366;&#21019;&#24314;DAO&#21602;&#65281;”&#65292;&#20320;&#35828;&#24471;&#23545;&#12290;&#26080;&#35770;&#22914;&#20309;&#65292;&#25105;&#21457;&#29616;[测试驱动开发|http://www.artima.com/intv/testdriven.html]&#22823;&#22823;&#30340;&#20419;&#36827;&#20102;&#36719;&#20214;&#36136;&#37327;&#65292;&#22312;&#35768;&#22810;&#24180;&#37324;&#25105;&#19968;&#30452;&#35748;&#20026;__&#22312;&#20889;&#20195;&#30721;&#20043;&#21069;&#20889;&#27979;&#35797;__&#26159;&#32993;&#35828;&#20843;&#36947;&#65292;&#36825;&#30475;&#36215;&#26469;&#24456;&#24858;&#34850;&#65292;&#20294;&#24403;&#25105;&#23581;&#35797;&#20043;&#21518;&#25105;&#35748;&#20026;&#36825;&#26679;&#38750;&#24120;&#22909;&#65292;&#29616;&#22312;&#25105;&#25353;&#29031;&#27979;&#35797;&#39537;&#21160;&#30340;&#26041;&#24335;&#24037;&#20316;&#23436;&#20840;&#22240;&#20026;&#25105;&#21457;&#29616;&#36825;&#26679;&#21487;&#20197;&#22823;&#22823;&#25552;&#39640;&#25105;&#36719;&#20214;&#24320;&#21457;&#30340;&#25928;&#29575;&#12290;
&#24320;&#22987;&#65292;&#25105;&#20204;&#22312;{{test/dao/**/dao}}&#30446;&#24405;&#19979;&#24314;&#31435;&#31867;{{PersonDaoTest.java}}&#65292;&#36825;&#20010;&#31867;&#24517;&#39035;&#25193;&#23637;[BaseDaoTestCase|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDaoTestCase.java.html]&#65292;&#32780;BaseDAOTestCase&#36825;&#20010;&#31867;&#26159;JUnit&#31867;[TestCase|http://junit.sourceforge.net/javadoc/junit/framework/TestCase.html]&#30340;&#23376;&#31867;&#65292;&#36825;&#20010;&#31867;&#29992;&#26469;&#21152;&#36733;[Spring|http://www.springframework.org]&#30340;ApplicationContext&#65288;&#22240;&#20026;Spring&#25226;&#21508;&#20010;&#23618;&#32465;&#23450;&#65289;&#21644;&#21333;&#20803;&#27979;&#35797;&#31867;&#21516;&#19968;&#30446;&#24405;&#19979;&#21516;&#20320;&#30340;&#27979;&#35797;&#31867;&#25991;&#20214;&#21516;&#21517;&#30340;.properties&#25991;&#20214;&#65288;ResourceBundle&#65289;&#65292;&#36825;&#20010;&#23646;&#24615;&#25991;&#20214;&#30340;&#23646;&#24615;&#21487;&#20197;&#36890;&#36807;“rb”&#23646;&#24615;&#26469;&#35775;&#38382;&#12290;
;:%%(color: blue)''&#25105;&#32463;&#24120;&#25335;&#36125;(&#25171;&#24320;&rarr;&#21478;&#23384;&#20026;)&#19968;&#20010;&#24050;&#23384;&#22312;&#30340;&#27979;&#35797;(&#22914;UserDaoTest.java)&#65292;&#28982;&#21518;&#26597;&#25214;/&#26367;&#25442; [[Uu]ser&#20026;[[Pp]erson&#65292;&#25110;&#32773;&#20219;&#20309;&#20854;&#23427;&#38656;&#35201;&#26367;&#25442;&#30340;&#20869;&#23481;&#12290;''%%
[{Java2HtmlPlugin
package org.appfuse.dao;
import org.appfuse.model.Person;
import org.springframework.dao.DataAccessException;
public class PersonDaoTest extends BaseDaoTestCase {
private Person person = null;
private PersonDao dao = null;
public void setPersonDao(PersonDao dao) {
this.dao = dao;
}
}
}]
&#20197;&#19978;&#26159;&#25105;&#20204;&#20351;&#29992;JUnit&#27979;&#35797;&#32780;&#21021;&#22987;&#21270;&#21644;&#38144;&#27585;PersonDao&#30340;&#22522;&#26412;&#20195;&#30721;&#65292;&#23545;&#35937;“ctx”&#24341;&#29992;&#20102;Spring&#30340;ApplicationContext&#65292;&#23427;&#22312;[BaseDaoTestCase|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDaoTestCase.java.html]&#31867;&#30340;&#38745;&#24577;&#20195;&#30721;&#21306;&#37324;&#34987;&#21021;&#22987;&#21270;&#12290;
&#29616;&#22312;&#25105;&#20204;&#38656;&#35201;&#23454;&#38469;&#27979;&#35797;DAO&#20013;&#30340;CRUD(create, retrieve, update, delete)&#26041;&#27861;&#65292;&#20026;&#27492;&#25105;&#20204;&#38656;&#35201;&#20026;&#27599;&#20010;&#26041;&#27861;&#24314;&#31435;&#20197;test&#65288;&#20840;&#37096;&#23567;&#20889;&#65289;&#24320;&#22836;&#30340;&#27979;&#35797;&#26041;&#27861;&#65292;&#21482;&#35201;&#36825;&#20010;&#26041;&#27861;&#26159;&#20844;&#20849;&#30340;&#65292;&#36820;&#22238;&#31867;&#22411;&#26159;void,&#23427;&#20204;&#23601;&#20250;&#34987;&#25105;&#20204;build.xml&#20013;&#30340;Ant&#30340;&lt;junit&gt;&#20219;&#21153;&#35843;&#29992;&#65292;&#22914;&#19979;&#26159;&#19968;&#20123;&#31616;&#21333;&#30340;CRUD&#27979;&#35797;&#65292;&#38656;&#35201;&#27880;&#24847;&#30340;&#19968;&#28857;&#26159;&#25152;&#26377;&#30340;&#26041;&#27861;&#65288;&#25110;&#32773;&#21483;&#20570;&#27979;&#35797;&#65289;&#24517;&#39035;&#26159;&#33258;&#27835;&#30340;&#65292;&#28155;&#21152;&#22914;&#19979;&#20195;&#30721;&#21040;&#25991;&#20214;{{PersonDaoTest.java}}&#65306;
[{Java2HtmlPlugin
public void testGetPerson() throws Exception {
person = new Person();
person.setFirstName("Matt");
person.setLastName("Raible");
dao.savePerson(person);
assertNotNull(person.getId());
person = dao.getPerson(person.getId());
assertEquals(person.getFirstName(), "Matt");
}
public void testSavePerson() throws Exception {
person = dao.getPerson(new Long(1));
person.setFirstName("Matt");
person.setLastName("Last Name Updated");
dao.savePerson(person);
if (log.isDebugEnabled()) {
log.debug("updated Person: " + person);
}
assertEquals(person.getLastName(), "Last Name Updated");
}
public void testAddAndRemovePerson() throws Exception {
person = new Person();
person.setFirstName("Bill");
person.setLastName("Joy");
dao.savePerson(person);
assertEquals(person.getFirstName(), "Bill");
assertNotNull(person.getId());
if (log.isDebugEnabled()) {
log.debug("removing person...");
}
dao.removePerson(person.getId());
try {
person = dao.getPerson(person.getId());
fail("Person found in database");
} catch (DataAccessException dae) {
log.debug("Expected exception: " + dae.getMessage());
assertNotNull(dae);
}
}
}]
;:%%(color: blue)''&#22312;testGetPerson&#26041;&#27861;&#65292;&#25105;&#20204;&#21019;&#24314;&#20102;&#19968;&#20010;person&#24182;&#19988;&#35843;&#29992;get&#26041;&#27861;&#65292;&#25105;&#36890;&#24120;&#20250;&#22686;&#21152;&#19968;&#26465;&#25105;&#25152;&#38656;&#35201;&#30340;&#35760;&#24405;&#21040;&#25968;&#25454;&#24211;&#65292;&#22240;&#20026;&#22312;&#27979;&#35797;&#36816;&#34892;&#20043;&#21069;[DBUnit|http://www.dbunit.org]&#20250;&#20026;&#25968;&#25454;&#24211;&#20934;&#22791;&#27979;&#35797;&#25968;&#25454;&#65292;&#25105;&#20204;&#21487;&#20197;&#31616;&#21333;&#30340;&#22312;metadata/sql/sample-data.xml&#37324;&#28155;&#21152;&#27979;&#35797;&#25152;&#24517;&#39035;&#30340;&#35760;&#24405;''%%
<div style="color: blue !important; margin-left: 50px">
{{{
<table name='person'>
<column>id</column>
<column>first_name</column>
<column>last_name</column>
<row>
<value>1</value>
<value>Matt</value>
<value>Raible</value>
</row>
</table>
}}}
</div>
;:%%(color: blue)''&#36890;&#36807;&#36825;&#31181;&#26041;&#24335;&#20320;&#21487;&#20197;&#22312;testGetPerson&#26041;&#27861;&#37324;&#28040;&#38500;&#21019;&#24314;&#26032;&#32426;&#24405;&#30340;&#21160;&#20316;&#65292;&#22914;&#26524;&#20320;&#24895;&#24847;&#30452;&#25509;&#25554;&#20837;&#35760;&#24405;&#21040;&#25968;&#25454;&#24211;&#65288;&#20351;&#29992;SQL&#25110;&#32773;GUI&#65289;&#65292;&#20320;&#21487;&#20197;&#29992;__ant db-export__&#21644;__cp {{db-export.xml metadata/sql/sample-data.xml}}__&#37325;&#26032;&#26500;&#24314;&#20320;&#30340;{{sample-data.xml}}&#25991;&#20214;&#12290;''%%
&#22312;&#19978;&#38754;&#30340;&#20363;&#23376;&#37324;&#65292;&#20320;&#21487;&#20197;&#30475;&#21040;&#25105;&#20204;&#35843;&#29992;person.set*(value)&#26469;&#20934;&#22791;&#25105;&#20204;&#38656;&#35201;&#20445;&#23384;&#30340;&#23545;&#35937;&#65292;&#22312;&#36825;&#20010;&#20363;&#23376;&#37324;&#24456;&#31616;&#21333;&#65292;&#20294;&#26159;&#24403;&#20320;&#35201;&#25554;&#20837;10&#26465;&#24517;&#28155;&#23383;&#27573;(not-null="true")&#26102;&#23601;&#27604;&#36739;&#40635;&#28902;&#20102;&#65292;&#36825;&#23601;&#26159;&#25105;&#20026;&#20160;&#20040;&#35201;&#22312;BaseDaoTestCase&#20351;&#29992;ResourceBundle&#25991;&#20214;&#65292;&#21482;&#35201;&#22312;{{PersonDaoTest.java}}&#21516;&#19968;&#20010;&#30446;&#24405;&#21019;&#24314;&#19968;&#20010;{{PersonDaoTest.properties}}&#24182;&#19988;&#22312;&#37324;&#38754;&#23450;&#20041;&#20320;&#30340;&#23646;&#24615;&#20540;&#65306;
;:%%(color: blue)''&#25105;&#36890;&#24120;&#21482;&#26159;&#22312;Java&#37324;&#30828;&#32534;&#30721;&#65292;&#20294;&#26159;&#36825;&#20010;.properties&#23545;&#20110;&#22823;&#23545;&#35937;&#24456;&#26377;&#29992;&#12290;''%%
{{{
firstName=Matt
lastName=Raible
}}}
&#27492;&#26102;&#65292;&#20320;&#35201;&#36890;&#36807;&#35843;&#29992;BaseDaoTestCase.populate(java.lang.Object)&#26041;&#27861;&#26469;&#20934;&#22791;&#23545;&#35937;&#65292;&#32780;&#19981;&#26159;&#20351;&#29992;person.set*&#12290;
[{Java2HtmlPlugin
person = new Person();
person = (Person) populate(person);
}]
&#22312;&#30446;&#21069;&#24773;&#20917;&#19979;&#65292;&#36824;&#19981;&#21487;&#20197;&#32534;&#35793;PersonDaoTest&#65292;&#22240;&#20026;&#22312;&#31867;&#36335;&#24452;&#37324;&#36824;&#27809;&#26377;PersonDao.class&#65292;&#25105;&#20204;&#38656;&#35201;&#21019;&#24314;&#23427;&#12290;PersonDao.java&#26159;&#19968;&#20010;&#25509;&#21475;&#65292;PersonDaoHibernate.java&#26159;&#23427;&#30340;Hibernate&#23454;&#29616;&#65292;&#35753;&#25105;&#20204;&#32487;&#32493;&#65292;&#24320;&#22987;&#21019;&#24314;&#12290;
!!&#21019;&#24314;&#19968;&#20010;&#23545;&#23545;&#35937;&#25191;&#34892;CRUD&#25805;&#20316;&#30340;&#26032;DAO[#4]
&#39532;&#19978;&#65292;&#22312;{{src/dao/**/dao}}&#30446;&#24405;&#37324;&#24314;&#31435;PersonDao.java&#25509;&#21475;&#65292;&#24182;&#19988;&#25351;&#23450;&#25152;&#26377;&#23454;&#29616;&#31867;&#35201;&#23454;&#29616;&#30340;&#22522;&#26412;CRUD&#25805;&#20316;&#65292;&#20026;&#20102;&#26174;&#31034;&#26041;&#20415;&#65292;&#25105;&#24050;&#32463;&#21435;&#25481;&#20102;&#25152;&#26377;JavaDocs&#12290;
[{Java2HtmlPlugin
package org.appfuse.dao;
import org.appfuse.model.Person;
public interface PersonDao extends Dao {
public Person getPerson(Long personId);
public void savePerson(Person person);
public void removePerson(Long personId);
}
}]
&#27880;&#24847;&#65292;&#22312;&#20197;&#19978;&#30340;&#26041;&#27861;&#22768;&#26126;&#19978;&#24182;&#27809;&#26377;exceptions&#35828;&#26126;&#65292;&#36825;&#26159;&#22240;&#20026;[Spring|http://www.springframework.org]&#20351;&#29992;RuntimeExceptions&#26469;&#21253;&#35065;Exceptions&#30340;&#26041;&#24335;&#65292;&#27492;&#26102;&#65292;&#20320;&#24050;&#32463;&#21487;&#20197;&#20351;&#29992;__ant compile-dao__&#26469;&#32534;&#35793;{{src/dao}}&#21644;{{test/dao}}&#19979;&#30340;&#25152;&#26377;&#28304;&#25991;&#20214;&#65292;&#28982;&#32780;&#24403;&#20320;&#36816;&#34892;__ant test-dao -Dtestcase=PersonDao__&#36827;&#34892;&#27979;&#35797;&#26102;&#65292;&#20320;&#20250;&#24471;&#21040;&#19968;&#20010;&#38169;&#35823;&#65306;<span style="color: red">No bean named 'personDao' is defined</span>&#65292;&#36825;&#26159;&#19968;&#20010;Spring&#30340;&#38169;&#35823;&#65292;&#35828;&#26126;&#20320;&#24517;&#39035;&#22312;{{applicationContext-hibernate.xml}}&#25351;&#23450;&#19968;&#20010;&#21517;&#23383;&#20026;''personDAO''&#30340;bean&#65292;&#22312;&#27492;&#20043;&#21069;&#25105;&#20204;&#38656;&#35201;&#21019;&#24314;PersonDao&#30340;&#23454;&#29616;&#31867;&#12290;
;:''&#36816;&#34892;dao&#27979;&#35797;&#30340;ant&#20219;&#21153;&#21483;&#20570;__test-dao__&#65292;&#22914;&#26524;&#20320;&#20256;&#36882;testcase&#21442;&#25968;(&#29992;__-Dtestcase=name__)&#65292;&#23427;&#20250;&#26597;&#30475;{{**/*${testcase}*}}&#20801;&#35768;&#25105;&#20204;&#20256;&#36882;Person&#12289;PersonDao&#12289;&#25110;&#32773;PersonDaoTest&#20197;&#21450;&#25152;&#26377;&#20250;&#25191;&#34892;PersonDaoTest&#30340;&#31867;&#12290;''
&#35753;&#25105;&#20204;&#21019;&#24314;&#19968;&#20010;&#23454;&#29616;PersonDao&#30340;&#31867;PersonDaoHibernate&#24182;&#20351;&#29992;Hibernate&#26469;get/save/delete&#36825;&#20010;Person&#23545;&#35937;&#65292;&#20026;&#27492;&#65292;&#25105;&#20204;&#22312;{{src/dao/**/dao/hibernate}}&#21019;&#24314;&#19968;&#20010;&#26032;&#31867;{{PersonDaoHibernate.java}}&#65292;&#23427;&#24212;&#35813;&#25193;&#23637;[BaseDaoHibernate|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDAOHibernate.java.html]&#65292;&#24182;&#19988;&#23454;&#29616;PersonDao&#12290;''&#20026;&#20102;&#31616;&#27905;&#65292;&#30465;&#30053;Javadocs&#12290;''
[{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));
}
}
}]
&#29616;&#22312;&#65292;&#22914;&#26524;&#20320;&#36816;&#34892;__ant test-dao -Dtestcase=PersonDao__&#65292;&#20320;&#20250;&#24471;&#21040;&#21516;&#26679;&#30340;&#38169;&#35823;&#65292;&#25105;&#20204;&#24517;&#39035;&#37197;&#32622;Spring&#26469;&#35753;&#23427;&#30693;&#36947;PersonDaoHibernate&#26159;PersonDao&#30340;&#23454;&#29616;&#65292;&#21516;&#26679;&#30340;&#65292;&#25105;&#20204;&#20063;&#35201;&#21578;&#35785;&#23427;&#36824;&#26377;&#20010;Person&#23545;&#35937;&#12290;
!!&#37197;&#32622;Spring&#20013;&#30340;Person&#21644;PersonDao [#5]
&#39318;&#20808;&#25105;&#20204;&#35201;&#21578;&#35785;Spring&#25152;&#26377;Hibernate&#25991;&#20214;&#30340;&#20301;&#32622;&#65292;&#20026;&#27492;&#65292;&#25171;&#24320;{{src/dao/**/dao/hibernate/applicationContext-hibernate.xml}}&#65292;&#22312;&#20197;&#19979;&#20195;&#30721;&#22359;&#28155;&#21152;{{"Person.hbm.xml"}}&#12290;
[{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.