Hibernate 初识
在Struts学完模型后,本来是想做一个例子的,但已经发现要与Hibernate联系起来了。于是今天 新增了Hibernate分类。好了,废话不多说,进入主题!
Hibernate是对象模型与关系数据库模型之间的桥梁!Hibernate位于软件应用的持久化层,它应用了ORM机制,对象关系映射!随着软件规模的不断增大,软件的体系结构逐渐由向多层体系发展,现在一般的公司在招聘程序员的时候都要求有多层开发经验!那么我们先来看看分层体系的发展
从上图可以看到,软件分层的发展是离不开特定技术的支撑。如上,从单层应用程序发展至二层,分离出数据库层,这必然是得以数据库技术的出现,使得软件中永久存储数据,以及高效的操作数据的任务可以由数据库来完成,而发展到三层,应用程序层被分为表述层和业务逻辑层,表述层负责业务逻辑的界面,而业务逻辑层负责处理特定的业务逻辑,而发展到四层的时候,业务逻辑层被多分出了持久化层,它负责将 业务逻辑中的对象持久化到关系数据库中!
软件分层有二个特征,第一个是存在自上而下的依赖关系,上层会访问下层的接口。第二,为了保证每个层的相对独立性,每个层对外都公开接口而封装实现!
在目前非常流行的MVC设计模式中,软件被分为 视图,模型和控制器这三个层次,模型代表软件的业务模型和业务数据,下图列出了MVC三个层次与我们上面所说的四个层次之间的关系!
从上图可以看到模型对应了 业务逻辑层,持久化层和数据库层!
Hibernate是JAVA持久化层的一种通用实现,它不与特定的业务领域相关,能把任一的JAVA应用与相关的数据库系统连接,也因此它是一种中间件!
在struts 学习之04 "模型"中,已经提到对象模型!一般说来实体域对象都需要存储在关系型数据据中,Hibernate就是一种将 内存中的对象持久化到关系型数据库中的工具,Hibernate的英文原意是冬眠,那么冬眠和持久化对象之间有什么关系呢,我们知道 对象只能存在于内存中,当程序运行起来后会创建对象,当程序运行结果那么这些对象就随之消失,我们更多时候是需要将这些对象永久保存到数据库中,那么形象的理解Hibernate就是将这些对象在关系型数据库中冬眠!
其实我们知道,JAVA应用访问数据库最直接的方式就是直接访问JDBC API,它是由SUN公司制定的,在这个API中最主要的类和接口包括DriverManager,Connection,Statement,PreparedStatement,以及ResultSet! 其中DriverManager是具体的类,而其余的是接口,是由第三方的驱动程序包来实现,这也就是通常我们使用JDBC的时候要用到的第三方数据库厂商提供的JAR包!
用JDBC来开发系统的一个最大特点就是在程序代码中必须嵌入SQL语句,而SQL语句请问的是关系数据库中表的结构,这就使得我们的程序代码与关系型数据库紧紧的绑定在一起,如果之后关系型数据库发生变化就必须修改我们的 程序代码,使得我们程序代码没有独立性~这增加了维护软件的难度!
Hibernate的出现就是为了简化数据访问的编程以及提高数据访问代码的可性和可重用性!它采用的是ORM模式,它从业务逻辑层中分离出独立的持久化层,它负责建立域模型和关系数据库模型之间的映射,持久化向业务逻辑层公开了接口并且封装了具体实现细节,那么它如何进行域模型与关系型数据库模型的映射呢,实际具体的映射信息是在一个基于XML格式的对象关系映射文件中定义的!它们之间的对应类型如下:
类 -------表 对象------表的行 属性-------表的列
了解上面后,我们现在来结合前面的Struts创建一个Hibernate应用!
Step1:新建一个WebProject,加入Struts,方法不清楚可以回头看看Struts!
Step2: 加入Struts后,现在我们add Hibernate Capabilities具体如下图:
完成后我们可以在fengyan包下,发现有二个文件!hibernate.cfg.xml以及HibernateSessionFactory.java。前面的xml文件当然就是配置了!暂时先不管这些。
Step3:我们再在添加Struts组件 action form and jsp,这样我们就有了一个持久化类UserForm.java。
Step4:现在建立持久化类与关系型数据库模型数据库映射的信息文件,UserForm.hbm.xml
代码如下:
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="fengyan.struts.form.UserForm" table="testHibernate">
<id name="userName" type="java.lang.String"><!--UserForm属性userName,是主键-->
<column name="userName" length="20" /><!--对应的表中字段名userName-->
<generator class="assigned" /><!--主键类型为自然,即通过程序赋主键值-->
</id>
<property name="userPwd" type="java.lang.String"><!--持久化类普通属性userPwd-->
<column name="userPwd" length="20" /><!--对应表中userPwd字段-->
</property>
</class>
</hibernate-mapping>
补充说明:<class name="fengyan.struts.form.UserForm" table="testHibernate"> name为我们的持久化类,table即为数据库中对应的表名!
Step5:将 该文件在Hibernate配置文件中注册,hibernate.cfg.xml代码如下
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<property name="connection.url">
jdbc:sqlserver://127.0.0.1:1434;databaseName=study
</property>
<property name="dialect">
org.hibernate.dialect.SQLServerDialect
</property>
<property name="myeclipse.connection.profile">
MySqlServer2005
</property>
<property name="connection.driver_class">
com.microsoft.sqlserver.jdbc.SQLServerDriver
</property>
<property name="show_sql">true</property>
<mapping resource="fengyan/struts/form/UserForm.hbm.xml" />
</session-factory>
</hibernate-configuration>
可以看到里面是数据库的连接信息!我本机使用的数据库是SQLServer2005,如果使用其它数据库,如MYSQL,ORACLE等则对应的代码有所不同,Hibernate最终连接数据库的方式依然是JDBC,只是Hibernate将JDBC重新封装了!
一切准备就绪,我们在actionBean中修改execute方法即可验证!修改后的execute方法代码如下:
HttpServletRequest request, HttpServletResponse response) {
UserForm userForm = (UserForm) form;// TODO Auto-generated method stub
try
{
//配置信息对象
Configuration config = new Configuration().configure("/fengyan/hibernate.cfg.xml");;
//会话工厂
SessionFactory sessionFactory= config.buildSessionFactory();
//会话
Session session = sessionFactory.openSession();
//事物
Transaction tx = null;
tx = session.beginTransaction();
session.save(userForm);//我们只需要这句即可将 内存中的对象持久化
tx.commit();
System.out.println("OKOKOK");
}catch(Exception e)
{
System.out.print(e);
}
return null;
}
最后运行user.jsp输入用户名和密码即可将该用户添加到数据库中!整个过程我们可以发现,程序中是没有SQL语句的!这样才实现真正意义上的面向对象的编程,脱离了繁锁的SQL语句,将注意力集中在业务逻辑的处理上!
还有一点就是大家发现我并没有用到先前生动生成的HibernateSessionFactory.java。而是在execute中新写的,这样人帮,一是为了大家看的清楚,再一点就是二者不在同一包下,我也懒得引入!就一个方法简单的演示了!实际中还是应该分开的!就像以前JDBC的编程中,我们专门要写一个DBCon类是一样的!
好了就先写到这,下午还有事!