一、简介:
面向java环境的对象/关系数据库映射工具
不仅管理java类到库的映射们还提供数据查询和获取数据的方法
对于开发者通常的数据持久化关于的编程任务,解放95%
Hibernate对于中间层应用最好的场合。
相对于以数据操作的应用来说可能不是最好的选择。
可以帮助开发者消除或者包装那些针对特定厂商的sql代码。建立跨越数据库的应用平台。
二、能做什么:
减少乏味的编码,获取数据库连接,执行sql 关闭数据库连接。
更加面向对象设计。
更好的性能,持久层大多提供了优秀的性能优化机制,内置数据库连接池支持
更好的移植性,基于JAVA的跨平台特性,系统可以在不同操作系统之间切换。
三、学习Hibernate框架的动机:
我们初期做项目的时候,大部分为基于MVC的增删改查。在对数据库直流层操作时,需要大量的对数据库操作的代码,产生内置对象先封装再拆开很麻烦,想要把整个数据对象存入数据库的方法,就需要用到Hidernate。
使用Hibernate之后,Dao中连接数据库的大量代码就不需要了。Hibernate框架就是在业务层和数据库之间增加一个持久层。有很多持久层组件,获得到的对象取值不需要被拆开,一对多的问题,关联问题可以通过框架映射至数据库。
四、多层体系结构使Hibternate营运而生
最初双层体系结构
三层架构:视图层,业务层,数据库(直流层)
持久化技术:对象流,将内存对象固化到硬盘,用于永久性的保存数据。xml 格式化的文本文件都可以进行固化储存。
这个模式为四层模式,将三层模式中的业务分离出一个单独的持久层进行持久化操作。对象关系映射,将对象放入自动持久化的放入数据库中。
四层架构:表示层,业务逻辑层,持久层,数据层。
orm中间件常见产品: Hibernate iBatis 。为了解决面向对象和关系型数据库存在的互相不匹配的现象的技术。
业务实体在内存中表现为对象,数据库中表现为关系数据。问题在于数据库中,关系数据无法直接表达多对多关联和继承关系。
五、第一个Hibernate应用
1、在需要连接的数据库中建表。笔者用的时oracle,使用sqlplus进行创表
create table person(
pid number(5) primary key,
pname varchar2(20),
pwd varchar2(20)
);
Table created
2、jar包导入webContent下lib
3、创建实体类Person,添加getter,setter方法。
4、添加配置文件:hibernate.properties和hibernate.cfg.xml。目录为为project/etc下的文件。在文件中首次配置需要自动弹出提示,需要将dtd文件导入工程中。
hibernate.cfg.xml:
引用Person.hbm.xml文件。
在session-factory标签中配置从hibernate.properties中找到的oracle配置文件。
添加property标签,分别添加oracle的方言选择,会自动提供分页功能,oracle驱动,用户名和密码,url链接。
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.username">system</property>
<property name="hibernate.connection.password">Yuquan980730</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<mapping resource="com.demo.Bean/Person.hbm.xml"/>将person.hbm.xml配置进入文件。
hibernate.properties:
## Oracle
#hibernate.dialect org.hibernate.dialect.Oracle8iDialect
#hibernate.dialect org.hibernate.dialect.Oracle9iDialect
#hibernate.dialect org.hibernate.dialect.Oracle10gDialect
#hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver
#hibernate.connection.username ora
#hibernate.connection.password ora
#hibernate.connection.url jdbc:oracle:thin:@localhost:1521:orcl
#hibernate.connection.url jdbc:oracle:thin:@localhost:1522:XE
修改hibernate-distribution-3.6.6.Final\project\hibernate-core\src\test\java\org\hibernate\subclassProxyInterface
下的Person.hbm.xml文件。
Person.hbm.xml:
文件粘贴到Person实体类下,将实体向数据库中的表映射。
<hibernate-mapping package="com.Demo.Bean">//包名
<class name="Person" table="person">//第一个为类名,第二个为数据库表名,名字相同不区分大小写
<id name="pid" type="int" column="pid">//名字相同,也需要区分大小写。 id name=pid (类中属性) type=int (映射关系) cloumn=pid(对应表中的字段)
<generator class="sequence">//表示自增序列,序列为oracle用户设置
<param name="sequence">seq_newsId</param>//其中param name 为sequence,用于oracle数据库 内容为数据库序列号,在oracle中依照序列名称查询出select seq_newsid.nextval from dual
</generator>
</id>
<property name="pname" type="string" table="pname" />//为Bean中属性,相同可以省略
<property name="pwd" type="string"></property>
</class>
</hibernate-mapping>
下一步需要得到session。
5、编写实体类Util类和工具类
HibernateUtil.java:
public class HibernateUtil {
static SessionFactory sessionFactory;
static {
Configuration con=new Configuration();
con.configure();//configure方法重要,用于调用hibernate.cfg.xml
sessionFactory=con.buildSessionFactory();
}
public static Session getSession() {
return sessionFactory.openSession();
}
}
在使用Hibernate框架的过程中需要了解hibernate包中的session方法。
PersonDaoImpl.java:
package com.demo.Impl;
import org.hibernate.Session;
import com.demo.Bean.Person;
import com.demo.Util.HibernateUtil;
public class PersonDaoImpl {
public boolean addPerson(Person person) {
Session session=HibernateUtil.getSession();
int result=(Integer)session.save(person);//保存session对象,返回值为
boolean flag=false;
if(result>0) {
flag=true;
}session.close();
return flag;
}
}
Test.java:
public class Test {
public static void main(String[] args) {
Person person=new Person(0,"tom","123");
PersonDaoImpl personDao=new PersonDaoImpl();
boolean flag=personDao.addPerson(person);
System.out.println(flag);
}
此处测试出现一下结果:
flag为true,表示插入成功了,会因为oracle数据库自身的特性:增删改查的事务不会主动提交,程序执行成功,在oracle内存中,在oracle的命令行中commit不管用,自动开启事务,手动结束事务。需要在工具实现类中将其实现。
Session session=HibernateUtil.getSession();
Transaction tran=session.beginTransaction();
int result=(Integer)session.save(person);//保存session对象,返回值为
boolean flag=false;
if(result>0) {
flag=true;
tran.commit();
}session.close();
return flag;
运行成功。
增删改必须提交事务,同理,在工具类中添加方法updatePerson,
删改的返回值为void,所以在进入该方法后就表示执行完成,直接返回true,
按照id查询返回值为对象,传值pid,返回person对象。
public boolean updatePerson(Person person) {//更新操作
Session session=HibernateUtil.getSession();
Transaction tran=session.beginTransaction();
session.update(person);//void返回值
boolean flag=false;
tran.commit();
session.close();
return true;
}
public boolean deletePerson(Person person) {//删除操作
Session session=HibernateUtil.getSession();
Transaction tran=session.beginTransaction();
session.delete(person);//void返回值
tran.commit();
session.close();
return true;
}
public Person queryById(int pid) {//按照id查询操作
Session session=HibernateUtil.getSession();
Person person=(Person) session.get(Person.class, pid);
session.update(person);//void返回值
session.close();
return person;
}
运行结果:
id为3的数据修改成功,程序结束。
六,个人对使用Hibernate后的感想
作为一个初学者,在使用了Hibernate框架实现了常规的增删改查之后,深深感受到了框架的强大之处,将所有有关于数据库直流层的操作全部封装,使用者需要做的就是将session对象通过前台页面获得,并使用session对象分别执行相应的数据库操作,这里全部都是一个实体类对象可以搞定的,大大改变编码时对对象反复拆分和组合的困扰,很是喜欢,不过,针对于大部分以数据为中心的应用来说,Hibernate框架还有其局限性。