基于Webwork+Hibernate的J2EE开发入门实例_第1页
基于Webwork+Hibernate的J2EE开发入门实例_第2页
基于Webwork+Hibernate的J2EE开发入门实例_第3页
基于Webwork+Hibernate的J2EE开发入门实例_第4页
基于Webwork+Hibernate的J2EE开发入门实例_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于webwork+hibernate的j2ee开发入门实例广东省电信规划设计院有限公司信息系统咨询研究院guangdong planning and designing institute of telecommunications co.,ltd2008年8月文档更改历史记录序号主要更改内容版本号更改人更改时间1编写文档主体内容1.0.0薛珂2008-08目录1.概述42.搭建j2ee开发环境42.1 软件获取安装42.2 环境配置53.hibernate入门93.1 hibernate简介93.2开始前的准备103.2 jdbc直接操纵数据库113.3 hibernate操作数据库173

2、.3.1 第一个hibernate程序173.3.2 表与表关联293.4 本章小结344.使用webwork进行b/s开发354.1 第一个b/s程序354.2 处理变量输入输出414.3 另外一种处理变量的方法454.4 最常用的一种变量处理方法464.5 本章小结485.hibernate和webwork结合491.概述使用java技术进行b/s项目开发经过多年的研究发展,目前主要有两种主要的方式: 一种是重量级的ejb(enterprise java bean),另一种是轻量级的struts(2)+hibernate+spring. 由于ejb编程复杂性很高,一般的中小型应用系统大多会

3、采用轻量级的j2ee开发.本文所介绍的webwork+hibernate+spring的技术,就是属于轻量级j2ee开发.struts2本质上是webwork(具体内容可参见 /),但由于struts2目前文档方面欠缺,因此大多数人学习struts2均从webwork入手。本文的组织结构如下:第2章介绍如何搭建j2ee开发环境,第3章介绍hibernate数据库开发基本方法,第4章介绍webwork基本使用方法,第5章以实例介绍如何将hibernate和webwork结合起来用于j2ee开发。2. 搭建j2ee开发环境2.1 软件获取安装1) 本教

4、程所使用的所有软件都打包在 file-server-1新同事交换目录x薛珂env.rar 里面,将env.rar下载至本地。2) 建立目录e:j2eeenv (也可以是其它路径,为简单起见,建议设为该路径)3) 将env.rar移动至e:j2eeenv。4) 将env.rar 解压至当前目录。解压后将会看到以下目录结构:e:j2eeenv- ant1.7- apache-tomcat-5.5.20- eclipse- java- myeclipse- mysql- setenv.bat5) 如果你的目录结构如上图所示,那么软件安装工作已经完成!下面进行配置。2.2 环境配置1) 设置环境变量。

5、右键编辑setenv.bat,将看到以下内容:set jdir=e:j2eeenvset java_home=%jdir%javajdk1.5.0_10set ant_home=%jdir%ant1.7set catalina_base=%jdir%apache-tomcat-5.5.20set catalina_home=%jdir%apache-tomcat-5.5.20set classpath=%java_home%libdt.jar;%java_home%libtools.jar;.;set path=%path%;%ant_home%bin;%java_home%bin;%jdir

6、%mysql5bin上面是我们要设置的环境变量。进入桌面右键我的电脑高级环境变量。在系统变量栏点击 新建(w),填写变量名和变量值后点确定依次将setenv.bat里的项和值添加进去。2) 在开始运行输入 cmd,打开命令行, 输入 echo %java_home% ,测试环境变量是否建立成功。成功的界面如下:3) 将mysql注册为系统服务,并且启动。(当然可以采用其它数据库,如果使用其它数据库,直接跳过这步)a. 从命令行进入 cd e:j2eeenvmysqlbinb. 输入命令 mysqld-nt install-manual mysql5该命令的意思是将mysql安装为系统服务,服务

7、名称为mysql5,但是必须手工启动才可以运行,开机不会自动运行。c. 启动mysql5服务。输入命令 net start mysql5d. 安装mysql客户端工具sqlyog。从file-server-1新同事交换目录x薛珂tools下载sqlyog.rar,解压后安装。e. 安装成功后,运行sqlyog.exe。点 new按钮,弹出如入对话框。user name为:rootpassword为: 442_dylan点击 connect。4) 新建目录 e:j2eeworkdir5) 进入e:j2eeenveclipse目录,双击eclipse.exe运行eclipse。6) 第一次运行ec

8、lipse会要求选择工作目录,请选择为e:j2eeworkdir。7) 点击 myeclipse-update subscription在此输入subscriber: subscriber code: jlr8zc-444-55-4467865481680090注册成功后会发现:subscriber: product id: e3mp (myeclipse professional subscription)license version: 9.99full maintenance includedsubscription expiration d

9、ate (yyyymmdd): 20991231number of licenses: unlimited至此,环境搭建完毕。3.hibernate入门3.1 hibernate简介hibernate 是一个开放源代码的对象关系映射(r/o映射)框架,它对 jdbc 进行了轻量级的对象封装,使 java 程序员可以随心所欲的使用对象编程思维来操纵数据库。它不仅提供了从 java 类到数据表之间的映射,也提供了数据查询和恢复机制。相对于使用 jdbc 和 sql 来手工操作数据库,hibernate 可以大大减少操作数据库的工作量。 另外 hibernate 可以利用代理模式来简化载入类的过程,

10、这将大大减少利用 hibernate ql 从数据库提取数据的代码的编写量,从而节约开发时间和开发成本。 hibernate 可以和多种web 服务器或者应用服务器良好集成,如今已经支持几乎所有的流行的数据库服务器。3.2开始前的准备我们以 地址员工部门 关系为实,来进行简单的数据库操作,首先需要建立数据库,并导入模拟数据。三者关系如下:1个员工对应1个部门,但对应多个地址(1人拥有多处地址)。-mysql版create table department( id bigint(15) not null auto_increment, dname varchar(50), primary key

11、 (id);insert into department (dname) values (xxy);create table employee( id bigint(15) not null auto_increment, ename varchar(40), departmentid bigint(15), age int(3), primary key (id);insert into employee (ename,departmentid,age) values (dylan,1,25);create table address( id bigint(15) not null auto

12、_increment, addressname text, postcode varchar(10), employeeid bigint(15), primary key (id);insert into address (addressname,postcode,employeeid) values (guangzhou,510000,1);3.2 jdbc直接操纵数据库为了更好地理解hibernate的工具原理,最好的方法就是与传统的jdbc/odbc直接操作数据库方法做比较。因此本小节首先讲述如何直接使用jdbc进行数据库操作。1 打开eclipse,选择file-new-projec

13、t,选择 java project,点击next.2 输入项目名称 jdbctest, 之后点击finish3 点击finish,可以看到一个新项目被建立出来。4 右键点击 jdbctest,在弹出菜单中选择 new-folder, 新建一个名称为lib的目录。5 下载 file-server-1新同事交换目录x薛珂jarsmysql.jar,把它复制到lib目录下。6 右键点击jdbctest,在弹出菜单中选择build path - configure build path点击 add jars选中我们刚刚添加的mysql.jar,之后点击ok。于是mysql驱动就加载完毕。7 右键点击j

14、dbctest,在弹出菜单中选择 new-source folder。8 右键点击src 目录,在弹出菜单中选择 new-package。在name一栏输入: org.gpdi.jdbctest 作为包(package)的名称。9 右键点击刚刚建好的package ,在弹出菜单中选择 new-class,开始真正写程序。我们建立了一个名称为 controldb的类,点击finish。10 下面要做的事情就是在该类里面写操作数据库的代码,代码请参考file-server-1新同事交换目录x薛珂sourcesjdbctestcontroldb.java。11 右键点击controldb,在弹出菜单

15、中选择 run as - java application.运行该程序。在console会输出程序运行的结果。在数据库会看到刚刚插入的数据。本节通过step by step的方法,介绍了使用eclipse进行开发的详细步骤。并且通过简单的jdbc连接程序,介绍了使用java进行数据库操作的原始方法。由于java是高度面向对象的编程语言,它要求一切皆是对象,因此使用jdbc这样的方式读写数据库,与java的设计思想是格格不入的,因此人们就提出来,可否将对数据表的存取转换为对对象的存取,即如何把关系表映射成为对象,这就是hibernate所要做的工作。在下节将介绍使用hibernate方法进行数据

16、库操作。3.3 hibernate操作数据库本节使用hibernate对地址员工部门三个关系表进行操作,由于hibernate功能非常强大,本节只能简约介绍其最基本的使用方法。主要分为以下几个内容:1)基本配置 2)单表操作3)关联操作。3.3.1 第一个hibernate程序hibernate实质是通过配置文件把数据库(table)和类(class)联系起来,把数据库的字段(field)和类的属性(property)联系起来。表 department类 departmentid bigint(15) keyprivate long iddname varchar(40)private str

17、ing dname表1. department表和department对象的映射表 employee类 employeeid bigint(15) keyprivate long idename varchar(40)private string enamedepartmentid bigint(15)private department departmentage int(3)private int age表2. employee表和employee对象的映射表 address类 addressid bigint(15) keyprivate long idaddressname varch

18、ar(40)private string addressnameemployeid bigint(15)private employee employeepostcode varchar(10)private string postcode表3. address表和address对象的映射下面具体讲述如何进行映射及操作。关于eclipse的基本使用方法请参阅3.2节。本节不再赘述。1) 新建一个java project项目,项目名称为 hibernatetest。2) 在项目下新建一个目录folder,名称为lib。3) 把file-server-1新同事交换目录x薛珂sourceshiber

19、natetestlib下所有文件下载到lib目录。4) 把lib目录下所有jar加入build path(右键-build path-configure build path-add jars)。5) 建立source folder ,名称为src。6) 在src下面建立package,名称为org.gpdi.hibernatetest7) 把file-server-1新同事交换目录x薛珂sourceshibernatetestsrc下面的hibernate.cfg.xml文件复制到 src 目录下面,双击打开。点击下面的 source,进入手工编辑界面。!doctype hibernate-

20、configuration public -/hibernate/hibernate configuration dtd/en jdbc:mysql:/localhost/sampleorg.gjt.mm.mysql.driverroot442_dylannet.sf.hibernate.dialect.mysqldialecttruetruenet.sf.hibernate.transaction.jdbctransactionfactory上面就是 hibernate的配置文件,其中:hibernate.connection.url: 连接字符串 hibernate.connection.

21、driver_class : 驱动名称hibernate.connection.username : 数据库用户名 hibernate.connection.password : 数据库密码 而下面这句:是至为关键的,它真正将数据表和类进行关联,这在下面会再次提及。到目前为止,该文件无须做任何修改,可以直接使用。8) 在org.gpdi.hibernatetest包下面建立一个新的类,名称为department,它需要实现java.io. serializable接口。添加方法是 a. 右键点击 org.gpdi.hibernatetest包,在弹出菜单中选择new-classb. 在弹出的对

22、话框中,在interfaces一栏,点击add,在choose interfaces一栏输入serializable,在matching types列表里选择java.io.serializable,点击ok。 点击finish,结束创建。新建成的department.java内容如下:/* * */package org.gpdi.hibernatetest;import java.io.serializable;public class department implements serializable 9) 下面我们为department添加属性id和dname,添加后代码如下:/*

23、* */package org.gpdi.hibernatetest;import java.io.serializable;public class department implements serializable private long id;private string dname;10) hibernate要求我们的类必须实现serializable接口,并且有一个参数为空的构造函数,因此我们添加一个空的构造数。在代码编辑窗口department类定义范围内(两个大括号之间)点击右键,在弹出菜单里选择 source-generate constructor using field

24、s.点击ok,生成代码如下:/* * */package org.gpdi.hibernatetest;import java.io.serializable;public class department implements serializable private long id;private string dname;public department() super();当然,构建函数完全可以手工输入,只是借此介绍下一些小技巧。11) 此时我们已经生成了一个department类,我们称它为pojo(pure old java object)。pojo必须通过getter 和 se

25、tter来对其属性进行取和写,因此我们需要添加getter和setter。右键点击department类定义的空白地方,在弹出菜单里选择 source-generate getters and setters.选中所有的属性select all,之后点击ok。现在一个完整的pojo就建立成功了。其完整代码如下:package org.gpdi.hibernatetest;import java.io.serializable;/* * author xueke * */public class department implements serializable private long id

26、;private string dname;public department() super();public string getdname() return dname;public void setdname(string dname) this.dname = dname;public long getid() return id;public void setid(long id) this.id = id;12) 上面我们建立了同数据表department对应的pojo定义department。下面我们需要将告诉hibernate,将他们关联起来。13) 在org.gpdi.hi

27、bernatetest下,建立一个新的文件,文件名为department.hbm.xml。右键点击org.gpdi.hibernatetest-new-file。点击finish结束创建文件。把下面内容写入department.hbm.xml。(该文件可以由file-server-1新同事交换目录x薛珂sourceshibernatetestsrc获取)。!doctype hibernate-mapping public -/hibernate/hibernate mapping dtd 3.0/en 这个文件的作用就是告诉hibernate如何把department表和department类

28、关联起来,我们来逐个分析其每部分的意义。!doctype hibernate-mapping public -/hibernate/hibernate mapping dtd 3.0/en是该xml文档的模式定义,它定义了xml文档的格式。package指department类所在的包名称把数据表和类名关联,此处的类名为department,相关联的数据表名称为 department.department类的属性名 id type=java.lang.long -映射类型 column=id department 表的字段名 id 告诉hibernate在插入数据的时候,主键如何生成.nati

29、ve的意思是hibernate不用处理,直接交给数据库即可,因此我们建立的数据表都有一项自增的字段id. 在mysql中通过auto_increment定义,在oracle中可以通过sequence和触发器实现.每个提供给hibernate管理的数据表必须有主键(primary key),并且要告诉hibernate主键如何处理,此处的generator有多种取值方式,我们使用的native,是指把处理权交给数据库,这里如若不明白,直接copy即可.映射类型 column=dname department 表的字段名 dname /通过property关键字把数据表的字段和pojo的属性关联起

30、来.14) 到此为止,我们已经建立了数据表,pojo类,以及将两者关系起来的hbm文件.最后一步是告诉hibernate运行时读取该关联文件,即把这个映射关系生效.打开src/ hibernate.cfg.xml.加入如下内容(如若存在,无须重复添加).15) 到此为止,hibernate的配置全部完成. 如需添加多个数据表映射,重复进行上述步骤即可.16) 下面我们使用hibernate对department表进行添查删改操作.在org.gpdi.hibernatetest包下面建立新的类 controldb.该类可由 file-server-1新同事交换目录x薛珂sourceshibern

31、atetestsrc获取.该类实现了4个方法,controldb.testinsert();controldb.testupdate();controldb.testdelete();controldb.testselect();分别用于对department表进行插入,更新,删除,查询操作.具体使用方法请参阅源代码及注释.3.3.2 表与表关联在地址-员工-部门的关系中,有两对很明显的关系: 地址-员工, 员工-部门.一个员工可以拥有多个地址,一个地址只对应一个员工,所以员工与地址之间是1:n的关系.一个员工必然属于一个部门,一个部门包括若干员工,所以员工与部门存在n:1的关系. 由于员工必

32、定属于某个部门,因此,在建立员工对象时,需要在其属性中添加一项部门属性,以表明该员工属于哪个部门.同样,在建立地址对象的时候,需要定义其员工属性.在获取数据的时候,获得了员工,应该相应地就立刻得到员工所在的部门,在更新时员工时,如果更新了其部门的属性,这些更改也应可以相应地写入数据库.下面我们用hibernate来处理这些级联关系.1) 在org.gpdi.hibernatetest下建立employee对象,employee对象内容如下:package org.gpdi.hibernatetest;import java.io.serializable;public class employ

33、ee implements serializable private long id;private string ename;private int age;private department department;/数据库里面该字段名称为departmentidpublic employee() super();public int getage() return age;public void setage(int age) this.age = age;public department getdepartment() return department;public void se

34、tdepartment(department department) this.department = department;public string getename() return ename;public void setename(string ename) this.ename = ename;public long getid() return id;public void setid(long id) this.id = id;2) 在org.gpdi.hibernatetest下建立文件employee.hbm.xml,内容如下:!doctype hibernate-ma

35、pping public -/hibernate/hibernate mapping dtd 3.0/en 前面的内容我们不再重述,重点在于以下这句配置: 下面我们来看看如何使用many to one关联.3) 在controldb类中增加一个方法testcascadeinsert(),其代码如下:private void testcascadeinsert()department department = new department();department.setdname(总工室);employee employee = new employee();employee.setage(2

36、0);employee.setename(dylan sit);employee.setdepartment(department);transaction tran = session.begintransaction();session.saveorupdate(employee);mit();/结果会插入两条数据入数据库,第一条为 insert into department (dname) values (总工室);/第二条为insert into employee (ename,age,departmentid) values (dylan sit,20,9);/其中 (dylan

37、sit,20,9) 为刚刚插入的department的id.请将many-to-one配置改为以下内容后再运行testcascadeinsert(),看有何变化.在上面的配置中,我们将cascade的值设为none,那么在保存employee的时候,不会保存department,从而导致employee的department属性悬空,编译不通过.4) 在controldb中增加另外一个方法testcascadeupdate(),其代码如下:private void testcascadeupdate()employee employee = (employee)session.get(empl

38、oyee.class, new long(2);if(employee = null)system.out.println(找不到员工记录);return;employee.setage(44);employee.setename(kekekeke);employee.getdepartment().setdname(cascadeupdate);transaction tran = session.begintransaction();session.saveorupdate(employee);/更新employee对象mit();运行结束后,可以看到, 数据库库里面的 departmen

39、t表有一项的值被更改为”cascadeupdate”,说明更新employee时同时更新了其关联的department对象.请将many-to-one配置改为以下内容后再运行testcascadeinsert(),看有何变化.在上面的配置中,我们将cascade的值设为none,那么在保存employee的时候,不会保存department. 数据库中department的值不会发生变化.5) 在controldb中增加另外一个方法testcascadeselect(),其代码如下:private void testcascadeupdate()employee employee = (emp

40、loyee)session.get(employee.class, new long(2);if(employee = null)system.out.println(找不到员工记录);return;employee.setage(44);employee.setename(kekekeke);employee.getdepartment().setdname(cascadeupdate);transaction tran = session.begintransaction();session.saveorupdate(employee);/更新employee对象mit();运行结束后,可

41、以看到, 数据库库里面的 department表有一项的值被更改为”cascadeupdate”,说明更新employee时同时更新了其关联的department对象.请将many-to-one配置改为以下内容后再运行testcascadeinsert(),看有何变化.在上面的配置中,我们将cascade的值设为none,那么在保存employee的时候,不会保存department. 数据库中department的值不会发生变化.6) 在controldb类中增加另外一个方法testcascadeselect(),其代码如下:private void testcascadeselect()e

42、mployee employee = (employee)session.get(employee.class, new long(2);if(employee = null)system.out.println(找不到员工记录);return;/获取employee的时候,可以关联地获取其属性对象,而无须重复进行数据库操作.department dep = employee.getdepartment();system.out.println(查到数据:+dep.getdname();7) 在controldb类中增加另外一个方法testcascadedelete(),其代码如下:private void testcascadedelete()employee employee = (employee)session.get(employee.class, new long(2);transaction tran = session.begintransaction();/如果cascade=delete,则此处会删除employee对应的department数据/当前我们设置为cascade=save-update,因此,department不受影响.session.delete(employee);mit();8) 通过修改controldb的main函数,分

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论