2、 生成DAO接口
Persistence->DAO->DAOInterface
3、 生成Hibernate Abstract DAO
Persistence->Hibernate->3 - Hibernate Abstract DAO DAO Interface选择DAO 如使用spring要勾选
4、 生成Model DAO
Persistence->DAO->ModelDAO(extends DAO) POJO选择反向生成的类,如JobInfo.java extends DAO选择上面生成的DAO接口
5、 生成Hibernate Model DAO
Persistence->Hibernate->4 -Hibernate Model DAO POJO选择SmUsers
Hibernate DAO(superclass)选择HibernateDAO DAO Model Interface:选择SmUsersDAO
6、 以后每次只需要进行第4步和第5步:
4、生成Model DAO
5、生成Hibernate Model DAO
对dwsys.sm_announce表的执行4、5操作,这里不描述。 第四步:测试类
Hibernate、Spring入门指南
前言:
本培训教程旨在引导初次接触Hibernate和Spring的技术人员,能够快速的掌握和运用这两种工具。
一、 Hibernete应用
(一)
Hinernate 概念与原理
1. 什么是Hibernate
Hibernate是一个开放源代码的对象关系映射(Object Relational Mapping ,简称ORM)框架。ORM可以简单理解为Java对象和关系数据库中表的对应关系。Hibernate采用ORM技术,不仅仅管理Java类到数据库表的映射,还提供数据查询和获取数据的方法。相对于使用 JDBC 和 SQL 来手工操作数据库,Hibernate 可以大大减少操作数据库的工作量。
2. Hibernate工作原理
Hibernate工作原理,听起来好像是个很神秘的东东,其实并不神秘。Hibernate无非是一个中间件,它对JDBC进行了一次对象封装,负责把sql语句发送到数据库,而数据库返回来的信息hibernate接收之后直接生成一个对象传给java。下图显示了Hibernate的工作原理:
正如图中所示,Hibernate是利用数据库以及其他一些配置文件如 Hibernate .properties ,
XML Mapping 等来为应用程序提供数据持久化服务的。通过Hibernate .properties或者Hibernate.cfg.xml,Hibernate可以获取所操作的数据库;通过XML Mapping,Hibernate可以获取要操作的数据库表的信息。 要操作一个数据库表,Hibernate首先是操纵JAVA对象,通过JAVA对象找到对应的XML Mapping文件,再通过XML Mapping 文件找到对应的数据库表,通过把对JAVA对象的操作转换为SQL对数据库表的操作,从而完成所谓ORM的全过程。
(二) Hinernate插件与安装
1. Hibernatetools:
作用:顾名思义,Hibernate工具,Hibernete必不可少的插件。
安装:解压缩hibernatetools-3.1.0.beta4.zip到磁盘,将生成的features和plugins包整个拷贝覆盖到eclipse下即可,打开eclipse可以看到。 2. Easysql:
作用:包含SQL编辑器和执行器,表格编辑器,数据导出工具。若不安装则eclipse?Window?Preferences中无Eclipsework菜单。 安装:解压缩easysql-1.0.6.zip到磁盘,将生成的plugins包整个拷贝覆盖到eclipse下即可。
3. Eclipsework:
作用:EclipseWork是一个代码生成插件。可以利用它从POJO's或数据库的表格中快速生成你所需要的代码。EclipseWork根据XML文件创建自定义的代码生成向导,然后 依据配置的Velocity模板来生成代码。 安装步骤:
(1) 解压缩eclipsework-0.1.zip到磁盘,打开eclipse?Help?SoftWare Updates?Find
and Install…
(2) ? Search for new features of install
(3) ?New Local Site
(4) ?选择eclipsework-0.1解 压缩后的目录(包含features和plugins包以及site.xml
的包)
(5) ?给site命名?Finish
(6) ?勾上刚才的命名
(7) ?Next
(8) ?选择I accept the terms in the license agreement? Next
(9) ?
Finish
(10) ?Install?Yes重启eclipse
4. templates:
作用:顾名思义,起模板的作用。EclipseWork用该模板快速生成代码。
安装:解压缩templates-0.1.zip到磁盘,打开eclipse?Window?Preferences…?选择EclipseWork?wizards.xml选择解压出来的wizards.xml?Velocity Templatees’Folder选择解压出来的templates目录?勾选Open Editor when finish the wizard和Enable wizard’s cache?Apply?OK
打开templates视图:eclipse? Window?Show View?Other…?EclipseWork?Templates
(三) Hibernate工程
1.
HibernateProject工程创建步骤
(1) 创建一个动态web工程
(2) 给工程取名HibernateProject,工程如图
(3) 导入需要的jar,把需要用到的jar包拷贝到工程的lib目录下,也就放到了工程
的classpath中,jar包如下图
(4) 创建需要的包,如下图所示
2.
配置和生成Hibernate的相关文件
第一步:配置Hibernate Configuration File(.cfg.xml)
添加:选择工程,点右键?New?Other…
?Hibernate?Hibernate Configuarion File
?Next
?Next
?选中Database dialect ?选择Driver class ?选择或填写Connection URL为相应数据库的URL?填写Default Schema(如DWSYS)?填写Username和Password(数据库用户与密码)?勾上Create a console configuration ?Finish,生成配置文件如图
第二步:设置反向工程(.reveng.xml) 添加工具栏的
hibernate
的图标
边的向下三角
hibernate.cfg.xml中配置的信息有:数据库驱动程序名、驱动程序URL、数据库名、数据库用户名及密码、表模式名等。
?Hibernate Code Generation…
?New一个新的Hibernate Code Generation,
Name命名自取,在Main中Console configuration选择上面配置的?Output directory选择上面配置的hibernate.cfg.xml存放的路径?勾选Reverse engineer from JDBC Connection?在Package中选择数据库表映射对象生成的路径(如cn.domain)?点击reveng.xml后的Setup…?Create new…
?选中parent folder?Next
?Refresh?选择需要反向功能的表(一次可以多选)?Include…
?Finish
?Package填写反向生成类存放的包路径?Exporters卡片中勾选Generate domain code(.java)、Generate mappings(hbm.xml)和Generate hibernate configuration(hibernate.cfg.xml)
?Run?刷新工程能看到生成的java类,hibernate.cfg.xml中的内容也有新的变化。
hibernate.reveng.xml配置了用到数据库中的哪些表;映射文件(这里的SmAnnounce.hbm.xml和SmUsers.hbm.xml)配置了数据库表和java类之间的关联;反向类(这里的SmAnnounce.java和SmUsers.java)是可以看作一个简单的VO类。
3.
生成POJO:
POJO:Plain Ordinary Java Object无格式普通Java对象,可以简单的理解为一个不包含逻辑代码的值对象(Value Object 简称VO)。
1、 生成HibernateUtil
Templates?Persistence->Hibernate->1 – Hibernate Util – ThreadLocal?生成 HibernateUtil.java文件
(四) Hibernate配置文件
1. xxx.cfg.xml配置文件详解
hibernate配置文件:cfg(config的缩写),是sessionFactory的配置文件,session工厂用于生产session(^_^)。
hibernate.cfg.xml内容如下:
2. xxx.reveng.xml反向工程文件详解
Hibernate反向工程文件:reveng(reverse engineer),把数据库中的表反射到工程中来。在reveng
文件中可以过滤出数据库中需要的表到工程中。
3. xxx.hbm.xml映射文件详解
Hibernate 映射文件: ORM(Object Relational Mapping)中的M。Mapping文件将对象(Object)与关系型数据(Relational)相关联的桥梁。 Hibernate 映射文件内容如下:
注意:延迟加载等在此没有提到
(五) Hibernate基本操作
获取数据源
结合实例分析,代码摘要: HibernateUtil.java代码
Configuration configuration = new Configuration(); //默认单数据源
SessionFactory sessionFactory = configuration.configure().buildSessionFactory(); Session session = sessionFactory.openSession(); //多数据源自选,用path表示你的xml路径
SessionFactory sessionFactory = configuration.configure(path); 注意:这里没有介绍多数据源的获取
(六) HQL语句
实例讲解createQuery
(七) SQL语句在Hibetnate中的运用
实例讲解createSQLQuery
注意:这里sql语句只谈到查询语句
(八) Hibernate事务
Hibernate是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction处理功能的,Hibernate的Transaction实际上是底层的JDBC Transaction的封装,或者是JTA Transaction的封装(默认情况下使用JDBCTransaction)。后面还会谈到Spring对事务的管理,这里对Hibernate事务管理只是简单介绍。
1. JDBC Transaction
try { connection.setAutoCommit(false); ..... // 一连串SQL操作 connection.commit();// 必须commit才会更新数据库 } catch(Exception) {
connection.rollback();// 发生错误,撤消所有变更 }
2. Hibernate 的JDBCTransaction
try { session = sessionFactory.openSession(); Transaction tx = session.beginTransaction();
.... // 一连串SQL操作 tx.commit(); // 必须commit才会更新数据库 } catch(HibernateException e) { tx.rollback(); }
二、 Spring应用
(一)
Spring 概念与原理
1.
什么是Spring
I). 简化的Spring
什么是Spring?简单的说,Spring就是一个框架,一个采用的控制反转(Inversion of Control,IoC) 技术的框架。Spring另外采用了面向切面编程的(Aspect Oriented Programming 简称AOP)思想。综合来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
■ 框架——所谓框架,可以想象一个现实的例子就是房产开发商开发的房子,采用的都是框架式结构。Spring框架提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
■ 容器——容器是置于框架内的,可以容放一定物品的东东。Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean,包括如何被创建、如何实例化、如何相互依赖等等。
■ 轻量级——可以从三方面来讲:一是工具大小,完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布;二是运行开销,并且Spring所需的处理开销也是微不足道的;三是依赖性,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。 ■ 控制反转——在原理中专门介绍。 ■ 面向切面——在原理中专门介绍。
II). 完整的Spring
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。 Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如下图所示。
组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下: 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(Inversion of Control,IoC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。 Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。 Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。 Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 Hibernate等。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。 Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。 Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。Spring MVC完全可以与Struts媲美。 这部分内容可以在对Spring有一定掌握后深入学习,相信你会受益匪浅。
2.
Spring工作原理
I). 控制反转&依赖注入
―控制反转(Inversion of Control,IoC)‖原理是Spring 框架的核心。所谓控制反转,含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java 实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用的者的实例。但在Spring 里,创建被调用者的工作不再由调用者来完成,因此被称作控制反转。创建被调用者实例的
工作通常由Spring 容器来完成,然后注入调用者,因此也称作依赖注入(Depedency Injection)。 使用依赖注入让bean 与bean 之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起。这也是Spring轻量级的一种体现。
II). 面向切面编程(AOP)
Spring的另一个特色是采用了面向切面编程原理(Aspect Oriented Programming 简称AOP)。AOP基于IoC基础,是对OOP的有益补充。AOP将应用系统分为两部分,核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的切面Crosscutting enterprise concerns,例如,所有大中型应用都要涉及到的持久化管理(Persistent)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging)等。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
(二) Spring插件与安装
Spring的概念与原理比Hibernate讲起来复杂得多,但是Spring插件的安装却简单多了,把需要的jar如spring.jar拷贝到lib下就OK啦。
(三) Spring工程(HelloWorld)
讲解了Spring的概念与原理后,你可能对对Spring的控制反转原理的理解还很模糊很抽象,下面通过Spring的HelloWorld实例,加深对原理的理解,看看代码究竟是怎样体现控制反转原理的。
第一步:创建工程
步骤同hibernate中的工程创建步骤,创建好的工程如下图
第二步:写一个对象类,代码如下:
第二步:创建一个Xml文件,内容如下:
第三步:测试类,内容如下:
第四步:运行并查看结果。
运行Java App后,控制台输入内容如下: Hi,吴宜水
My God!太简单了吧!这就是Spring的Ioc?不敢相信吧! 祝贺你,你说对了,这就是
Ioc,只不过是简化了一下,实际应用中无非就是多个对象类、多个Xml文件、多个服务类(这里的测试类),然后就是Xml的内容更丰富一点(这里xml文件里只有一个bean,bean只有一个属性,实际应用中会是多个bean多个属性,属性中注入的可能不只是字符,还可能是其他的bean)。
下面看一看程序与以往程序究竟有啥不同。 可以看到多用了一个Xml文件外,其他地方与以往基本一样。是的这里就是在这个Xml文件配置了一个bean――Message类。以往,我们都是自己new 一个Message的实例对象message,然后message. setMsg(―吴宜水‖)。
这么简单的东西为什么要这么折腾一下,用什么Ioc?!没错,这里是很简单,但是如果这里不再是用“吴宜水”了,而是换成了你,那么你就要找到对应的文件,修改里面的message. setMsg(―吴宜水‖)语句。修改一条这样的语句不要紧,但是如果有n条这样的语句,n个文件里用到了,哇哇!你是不是要哭了呢!这可能是个极端的例子,另外一个现实就是,如果以前用的是all.bean.Message,现在改用其他的了,怎么办呢?恐怕就不是很简单的事了。也许你已经想到了,通过Ioc可以减少因变动带来工作量。没错,这正是Ioc的优势所在,它可以灵活配置各种信息。这里为了简单起见,作了简化处理,真正的应用中,Ioc的优势可能超乎你的想象。
下面再来看一看究竟是怎么实现的。
首先,应用程序去加载应用程序的上下文,实际上也就把配置文件中的配置信息加载一遍。代码如下:
ApplicationContext actx= new ClassPathXmlApplicationContext(\
然后,根据配置文件加载要用的bean,找到具体的实现类,代码如下: TestBean testBean= (TestBean)actx.getBean(\
这里,实现类可配置,不但可配置类的属性( 接下来的语句直接就用testBean.getMsg()把结果输出来了,并没有看到Message类的实例化语句,也没有看到类似message. setMsg(―吴宜水‖)语句。究竟Message是怎样实例化的,它的msg属性又是怎样被赋值了呢?所有这些工作,spring都交给了容器去处理了,就不用我们自己去管这些事了。实际上,在容器启动时将Message提前进行实例化了,它的属性也正是在实例化的过程中赋值的,如果你也可以设置成不提前实例化,后面会告诉你怎么做。 通过这个简单的HelloWorld,你是不是似乎理解Spring的控制反转或者依赖注入原理了呢?不明白?不要紧,在网上这方面的文章很多,他们讲解会更透彻,多看自然就明白了。 (四) Spring配置文件及加载 1. 2. Spring xml配置文件的作用 Spring xml配置文件里用来配置需要依赖注入的bean。 Spring xml配置文件的组成: I). xml配置文件示例
II).
Id : 标识该bean的名称,通过factory.getBean(―id‖)来获得实例。 Class : 该bean的类路径。
Singleton : 默认为true,即单实例模式,每次getBean(―id‖)时获取的都是同一个实例,如果设置为false,即原型模式,则每次获取的是新创建的实例。
Init-method : 在bean实例化后要调用的方法(bean里定义好的方法)。 Destroy-method : bean从容器里删除之前要调用的方法。 Autowire : 其属性要通过何种方法进行属性的自动装配。
对于上述的各个属性,id和class是必要的,其他的则可以省略。例如如果设置了autowire的值,则表明需要自动装配,否则是手动装配。
III).
Bean里的属性通过
● 引用其他bean
也可以将改为
这样叫做内部bean,缺点是无法在其他地方重用这个bean的实例。 ● 装配集合
共有以下几种集合的装配: ****装配List和数组****
****装配Map****
****装配Properties****
要将一个属性null,需要通过
3.
Spring xml配置文件的装载:
从前面的HelloWorld实例可以看出,加载Spring 的xml配置文件很简单,代码如下: ApplicationContext actx= new ClassPathXmlApplicationContext(yourXmlPath); Xml还有另外一种加载方式,代码如下:
ApplicationContext actx= new FileSystemXmlApplicationContext(yourXmlPath); 当然,xml的加载方式还不止这两种,这里不详细描述。正如前面讲的,Spring在加载xml的时候将会实例化符合条件的bean。
(五) Spring事务管理
Spring中提供了声明式事务管理,与传统的编程式事务管理相比,编程式的重复代码较多,声明式比编程式更灵活。 声明式事务管理原理是AOP,也就是说声明式事务管理是AOP思想的明显体现。通过声明式事务处理,具体的业务代码再不必去写一堆try…catch…之类的代码,去处理事务和日志之类,尽关心业务本身。 那么声明式事务管理是如何做到的呢?下面通过一个实例,来看看如何进行声明式事务管理,同时,通过这个这个实例,进一步理解AOP原理(前面只有一个Ioc的实例,刚好这里是一个AOP实例)。
1.
不用Hibernate的事务管理
下面来看一个不用Hibernate的事务管理实例,这个实例尽可能的简单,首先我们抛弃了Hibernate,另外我们抛弃了继承的接口,为的就是一个目的,直接剖析Spring的事务管理。实例的具体步骤如下: 步骤一、编写DAO类
class=\ xyFactoryBean\> key=\>PROPAGATION_REQUIRED,-java.lang.Exception
步骤四、编写并运行测试类 测试类代码如下:
可以看到,运行结构和前面的完全一样。 在上面两个实例中,第一个实例里用的是DataSourceTransactionManager来管理事务,第二个实例中用的是HibernateTransactionManager来管理事务。两者实现了同一个目的,事务管理。 另外,第一个实例中MyDAO没有实现任何的接口,而第二个实例中MyService 扩展了 HibernateDaoSupport。实际上这有分别是两种代理方式:动态代理和cglib代理。动态代理强制要求实现接口,而动态代理则不需。两者的共同点是不管是用动态代理还是用cglib代理,两者都是通过Spring容器来管理。
三、 作业
使用Hibernate和Spring结合的方式,实现下面四张表的查询以及增删改操作,注意事务的控制。
数据库:8号机、WHJYDW
物品表:SCXS.ITEM_INFO Name Code Data Type Primary Foreign Key allowNull 物品ID 物品名称 备注 ITEM_ID ITEM_NAME MEMO VARCHAR2(10) VARCHAR2(30) VARCHAR2(60) TRUE not null not null 储柜表:SCXS.CAB_INFO Name Code Data Type Primary Foreign Key allowNull 储柜ID 储柜名称 备注 CAB_ID CAB_NAME MEMO VARCHAR2(10) VARCHAR2(30) VARCHAR2(60) TRUE not null not null
库存表:SCXS.SALE_INFO Name Code Data Type Primary Foreign Key allowNull 储柜ID 物品ID 存储数量 创建时间 修改时间 CAB_ID ITEM_ID STORE_NUM GEN_TIME UPDATE_TIME VARCHAR2(10) VARCHAR2(10) NUMBER(9,2) DATE DATE TRUE TRUE not null not null not null not null not null
销售表主表:SCXS.SALE_INFO Name Code Data Type Primary Foreign Key allowNull 销售ID 物品ID 创建时间 修改时间 Name SALE_ID ITEM_ID GEN_TIME UPDATE_TIME Code VARCHAR2(10) VARCHAR2(10) DATE DATE Data Type TRUE Primary TRUE Foreign Key not null not null not null not null allowNull 销售表明细表:SCXS.SALE_INFO 销售ID 销售数量 销售价格 创建时间 修改时间
create user SCXS identified by \ default tablespace USERS temporary tablespace TEMP profile DEFAULT; grant connect to SCXS; grant dba to SCXS;
grant unlimited tablespace to SCXS;
create table SCXS.ITEM_INFO (
ITEM_ID VARCHAR2(10) not null, ITEM_NAME VARCHAR2(30) not null, MEMO VARCHAR2(60) not null );
alter table SCXS.ITEM_INFO
add constraint PK_ITEM_INFO primary key (ITEM_ID);
create table SCXS.CAB_INFO (
CAB_ID VARCHAR2(10) not null,
SALE_ID SALE_NUM SALE_PRICE GEN_TIME UPDATE_TIME VARCHAR2(10) NUMBER(9,2) NUMBER(9,2) DATE DATE TRUE not null not null not null not null not null CAB_NAME VARCHAR2(30) not null, MEMO VARCHAR2(60) not null );
alter table SCXS.CAB_INFO
add constraint PK_CAB_INFO primary key (CAB_ID);
create table SCXS.STORE_INFO (
CAB_ID VARCHAR2(10) not null, ITEM_ID VARCHAR2(10) not null, STORE_NUM NUMBER(9,2),
GEN_TIME DATE default sysdate not null, UPDATE_TIME DATE default sysdate not null );
alter table SCXS.STORE_INFO
add constraint PK_STORE_INFO primary key (CAB_ID,ITEM_ID);
create table SCXS.SALE_INFO (
SALE_ID VARCHAR2(10) not null, ITEM_ID VARCHAR2(10) not null, SALE_NUM NUMBER(9,2),
GEN_TIME DATE default sysdate not null, UPDATE_TIME DATE default sysdate not null );
alter table SCXS.SALE_INFO
add constraint PK_SALE_INFO primary key (SALE_ID);
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Hibernate Spring入门指南(1)在线全文阅读。
相关推荐: