惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
V
Vulnerabilities – Threatpost
TaoSecurity Blog
TaoSecurity Blog
C
Cybersecurity and Infrastructure Security Agency CISA
P
Proofpoint News Feed
G
GRAHAM CLULEY
S
Securelist
P
Palo Alto Networks Blog
MongoDB | Blog
MongoDB | Blog
A
Arctic Wolf
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
WordPress大学
WordPress大学
Project Zero
Project Zero
T
Threat Research - Cisco Blogs
L
Lohrmann on Cybersecurity
C
Cyber Attacks, Cyber Crime and Cyber Security
F
Fortinet All Blogs
博客园 - 叶小钗
B
Blog RSS Feed
C
Cisco Blogs
Google DeepMind News
Google DeepMind News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Apple Machine Learning Research
Apple Machine Learning Research
G
Google Developers Blog
K
Kaspersky official blog
D
Docker
Latest news
Latest news
Cisco Talos Blog
Cisco Talos Blog
T
Tor Project blog
Cyberwarzone
Cyberwarzone
Security Latest
Security Latest
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Spread Privacy
Spread Privacy
Microsoft Azure Blog
Microsoft Azure Blog
C
Check Point Blog
J
Java Code Geeks
Simon Willison's Weblog
Simon Willison's Weblog
T
Tenable Blog
Recent Announcements
Recent Announcements
T
Tailwind CSS Blog
H
Help Net Security
L
LINUX DO - 热门话题
T
The Exploit Database - CXSecurity.com
Jina AI
Jina AI
S
SegmentFault 最新的问题
MyScale Blog
MyScale Blog
NISL@THU
NISL@THU
美团技术团队
腾讯CDC

博客园 - 书生无用

Improve the speed to display a transparent background winform Replace the with CR in Microsoft Excel using maven and eclipse created a mutiple module project for eclipse 开源的codecoverage(测试代码覆盖率)检测工具 使用zoudry编辑blog的设置 wiki为什么会流行 实现 DWR Sample 的几个要注意的问题(2) DWR Sample的两个问题 几个有意思的在线服务网站 静悄悄的变化 APPFUSE wiki中文文档问题解决了 appfuse使用Taperstry框架(一)——创建Tapestry框架页面 又是一个艳阳天 有几个Gmail、Wallop邀请 Appfuse开发实践(五)—— 增加校验和列表页面 Appfuse开发实践(四)——创建Webwork 框架的 Actions和JSP Appfuse开发实践(三) —— 创建Manager类 Appfuse里面带的Ant任务列表 Appfuse实践(一)——配置安装
Appfuse开发实践(二)——创建DAO对象
书生无用 · 2004-12-20 · via 博客园 - 书生无用

Appfuse开发实践(二)——创建DAO对象


     第一部分: 在Appfuse中创建新的DAO对象 - 本部分描述如何创建一个POJO并且创建一个Java类把这个对象存储到数据库中实现持久化。  
     我们将使用Hibernate作为示例,如果需要使用其他的持久化方案,可以参考Appfuse的相关文档。 
 
内容提要

[1] 创建一个新的POJO对象并且加入xdoclet标签
[2] 使用Ant创建数据库表
[3] 创建一个DAOTest对象并且用JUnit测试你的DAO对象 
[4] 创建一个DAO对象执行CRUD操作
[5] 在Spring配置Person和PersonDAO对象
[6] 执行DAOTest


1、创建一个新的POJO对象并且加入xdoclet标签


     首先要创建一个需要持久化的对象。我们将创建一个简单的Person对象(包括id,firstName,lastName三个属性)把这个对象放在src/dao/**/model目录中

      这个类必须继承基类org.appfuse.model.BaseObject,必须实现三个抽象方法equals(), hashCode() and toString().前两个方法是Hibernate需要的.比较容易的方法是使用Commonclipse 插件自动产生着几个方法的实现.


      使用IntelliJ IDEA可以产生generate equals() 和 hashCode()方法, 不过没有toString()方法. 可以使用 ToStringPlugin 插件。

现在创建了POJO对象,接下来需要加入XDoclet标签以便产生Hibernate映射文件。这个映射文件描述了对象→表和属性 →字段的映射关系。

用@hibernate.class标签说明表和对象的对应关系:

      这里使用generator-class="increment" 代替 generate-class="native" 因为作者在使用某些数据库时发现了一些问题。如果仅仅使用MySQL,建议使用"native" value。


2、使用Ant创建数据库表

      这是,可以运行"ant setup-db"任务来创建Person表,这个任务将创建Person.hbm.xml 文件并且在数据库中创建"person."表。 在控制台上,你可以看见Hibernate创建的table schema:

    如果你Hibernate产生的Person.hbm.xml的文件,可以在build/dao/gen/**/hibernate 目录下找到它,这是这个文件的具体内容 :

     现在加入@hibernate.property描述我们的其他字段信息:

      在这个例子中,加入column属性是因为创建的数据表的字段名和对应的类中的属性名不一样,如果是一样的,不需要加入这个属性说明。

运行 "ant setup-db"创建数据表.


       如果需要改变字段的长度,修改@hibernate.property 标签对应的属性值。如果希望他是一个必须的字段(NOT NULL),,加上not-null="true"这样的属性。


3、创建一个DAOTest对象并且用JUnit测试你的DAO对象


      现在我们创建一个DAOTest类来测试我们的DAO的工作状况。 “等一下”你说,“我们还没有创建一个DAO对象”你是对的。然而我们发现测试驱动开发(Test-Driven Development)是开发高质量软件的有效手段。在过去的几年里,我认为先编写测试再编写实现是无稽之谈。现在看起来我错了。现在我发现这是一个很伟大的方法。我现在推崇测试驱动的开发方式是因为我发现使用这种方法可以极大地加速软件开发过程。

      首先,在test/dao/**/dao目录下创建一个PersonDAOTest.java对象。这个对象必须继承 BaseDAOTestCase对象。这个父对象用来加载一个Spring的.properties文件 (资源邦定文件),此文件的文件名
和*Test.class一样。在这个例子里面如果你把PersonDAOTest.properties、PersonDAOTest.java放在一个目录下面, 这个文件的属性可以自动被赋值。

        现在我们需要编写代码测试DAO对象中的CRUD (create, retrieve, update, delete)方法。我们创建的这个方法必须以"test" (all 全部小写字母)开头。只要这些方法是public类型的,它必须是一个void类型返回值,并且不带任何参数,这些测试方法将会被定义在Ant build.xml的<junit>任务自动调用。这是一个对CRUD方法的简单测试方法。一个重要的需要记住的事情是每个方法应该是独立的。在这个例子里我们在PersonDAOTest.java文件中加入下面的代码:

    在testGetPerson方法中,我们创建了一个Person对象并且调用了get方法。实际上我们这样做必须保证在数据库中有一条对应的纪录。因为采用了DBUni可以以我们需要的测试数据自动填充数据库,你只需要在metadata/sql/sample-data.xml文件中简单的说明需要增加的纪录详细信息即可:


person = new Person();
person = (Person) populate(person);  

     
      此时,PersonDAOTest类无法通过编译,因为我们没有创建 PersonDAO.class,我们要创建它。 PersonDAO.java是一个接口,PersonDAOHibernate.java是一个基于这个接口的Hibernate持久化实现。下面我们将继续创建这些对象。
4、创建一个DAO对象执行CRUD操作

      首先在src/dao/**/dao目录中创建一个PersonDAO.java接口,并且说明实现类必须实现的CRUD方法。为了显示方便这里去掉了JavaDoc信息。

      你可能注意到上面的类的方法说明上没有exception处理。这是因为Spring的强大例外处理功能能把Exception封装成为RuntimeExceptions。此时,您可以运行"ant compile-dao"来编译源文件。然而如果你运行"ant test-dao -Dtestcase=PersonDAO",你将看到一个错误提示:No bean named 'personDAO' is defined。这是一个Spring产生的错误信息 - 我们需要给applicationContext-hibernate.xml指定一个具体的java Bean 到personDAO属性上。在此之前我们首先要创建一个PersonDAO的实现类。


      执行测试任务的ant命令是"test-dao"。如果传递特定的参数(用 -Dtestcase=name), 他将会搜索 **/*${testcase}*目录 - 允许我们执行PersonDAOTest测试。

接下来我们创建PersonDAOHibernate类实现PersonDAO接口使用Hibernate来实现Person对象的get/save/delete操作。为了实现这个目标在src/dao/**/dao/hibernate 目录下创建PersonDAOHibernate.java.
他需要继承 BaseDAOHibernate 对象并且实现PersonDAO接口。

      现在如果运行"ant test-dao -Dtestcase=PersonDAO",会看到同样的错误。我们需要配置Spring让它知道PersonDAOHibernate是PersonDAO的实现,我们也需要告诉它Person对象的信息。


5、在Spring配置Person和PersonDAO对象


       首先要告诉Spring Hibernate mapping映射文件的位置。打开src/dao/**/dao/hibernate/applicationContext-hibernate.xml并且加入Person.hbm.xml信息。

     现在我们需要增加一些XML标记绑定PersonDAOHibernate到PersonDAO。在文件的结尾处加入下面的内容:


     你也可以使用autowire="byName" 这样不用对"sessionFactory"属性赋值。个人习惯,我喜欢在xml文档说明对应关系。


6、执行DAOTest

     保存文件再一次运行 "ant test-dao -Dtestcase=PersonDAO"。

OK,成功了^_^

BUILD SUCCESSFUL
Total time: 9 seconds