1.什么叫hibernate?
Hibernate是一个框架(framework)是一个orm(objectrelation mapping对象映射关系)框架,hibernate处于项目持久层位置(又有人称为持久层框架),hibernate实际上是对jdbc进行了轻量级的封装。
可以这样来说:Hibernate是对jdbc进行轻量级封装的orm框架,充当项目的持久层,基础是java的反射机制。
什么是数据持久层?
(J2EE的三层结构是指表示层(Presentation),业务逻辑层(Business Logic)以及基础架构层(Infrastructure),这样的划分非常经典,但是在实际的项目开发法中,开发者通常对三层结构进行扩展来满足一些项目的具体要求,一个最常用的扩展就是将三层体系扩展为五层体系,即表示层(Presentation)、控制/中介层(Controller/Mediator)、领域层(Domain)、数据持久层(Data Persistence)和数据源层(Data Source)。它其实是在三层架构中增加了两个中间层。控制/中介层位于表示层和领域层之间,数据持久层位于领域层和基础架构层之间。由于对象范例和关系范例这两大领域之间存在“阻抗不匹配”,所以把数据持久层单独作为J2EE体系的一个层提出来的原因就是能够在对象-关系数据库之间提供一个成功的企业级映射解决方案,尽最大可能弥补这两种范例之间的差异。)
--摘自于百度百科
说白了就是在业务层和数据库之间增加一个转换,数据库本身是关系模式,体现的是关系(比如外键,主键什么的),而业务层(java操纵的是对象)操作的是对象模型,对象模型向关系模式转换时形成了一个阻抗,为了解决这个阻抗,必须在他们之间搭一个桥,这个桥就是数据持久层。
2、使用hibernate的好处:
1, 引入hibernate可以是工作人员角色细化,让程序员更关心业务流程,让数据库人员关注数据库相关的操作。
2, 分层更清晰,耦合性更小(耦合性:软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差)。
3, 通用性强:可以更轻松的从一个数据库平台转移到别的平台。
4, 对象化:把关系数据库变成了java的对象,更加方便操作。
5, 性能保证:hibernate可以按照不同的数据库,处理不同的操作是用最优化的sql语句,不用我们去想,对于分等算法,在hibernate中会显得更加简单,可靠。
6, 增加了程序的鲁棒性(指程序的健壮性和强壮性)。
快速入门的一个小案例(手动配置)
开发流程:
1、 创建一个项目
打开myeclipse,新建一个Java Program
2、 引入hibernate开发包(从网上下载:http://www.hibernate.org(官方网站)),
3、 Hibernate开发有三种方式:
(1) 由Domain object->mapping->db。(官方推荐)(Domain类,然后再映射关系,在根据Domain自动在数据库生成相应的表)
(2) 由DB开始,用工具生成mapping和Domain object。(使用较多)。
(3) 由映射文件开始。
我们使用第二种方法开发项目:
创建表employee
Create tableemployee(
Id number primary key,
Name varchar2(64) not null,
Email varchar2(64) not null,
)
数据库创建成功后建立Domain对象,然后再写对象关系映射文件(数据持久层)
4、 开发Domain和对象关系映射文件
package com.domain;
public class Employee{
//建议domain对象的名称就是对应表的首字母大写的名字,因为以后用工具生成默认也是这样的。有人称这为javabean,也有人称为domain的对象,pojo(plain old/ordinary java object 译:简单的java对象)的,其实都是一样的。
}
对象关系映射文件:作用是用于指定 domain对象和表的映射关系. ,该文件的取名有规范:
domain对象.hbm.xml,一般放在和domain对象同一个文件夹下(包下)
Employee.hbml.xml配置文件 :
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mappingpackage="com.hsp.domain">
<classname="Employee" table="employee">
<!--id元素用于指定主键属性-->
<id name="id" column="id"type="java.lang.Integer">
<!--该元素用于指定主键值生成策略-->
<generatorclass="sequence">
<paramname="sequence">emp_seq</param>
</generator>
</id>
<!--对其它属性还有配置-->
<propertyname="name" type="java.lang.String">
<columnname="name" not-null="false" />
</property>
<propertyname="email" type="java.lang.String" >
<columnname="email" not-null="false"/>
</property>
<propertyname="hiredate" type="java.util.Date">
<columnname="hiredate" not-null="false" />
</property>
</class>
</hibernate-mapping>
5. 配置hibernate.cfg.xml文件,该文件用于配置连接的数据库的类型,driver,用户名,密码 ,url同时管理对象关系映射文件 ,该文件的名称
<?xml version="1.0"encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.url">jdbc:mysql://localhost/hibernate</property>
<propertyname="show_sql">true</property>
<mappingresource="com/domain/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
然后再编写测试文件:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.*;
import com.domain.Employee;
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
//查询[load]->hql语句(hibernate query language)
}
public static void delEmp() {
//删除
//获取一个session
Session session=MySessionFactory.getSessionFactory().openSession();
Transaction ts=session.beginTransaction();
Employee emp=(Employee) session.load(Employee.class, 3);
session.delete(emp);
ts.commit();
session.close();
}
public static void updateEmp() {
// TODO Auto-generated method stub
//修改用户
//获取一个会话
Session session=MySessionFactory.getSessionFactory().openSession();
Transaction ts=session.beginTransaction();
//修改用户1. 获取要修改的用户,2.修改
//load是通过主键属性,获取该对象实例.<--->表的记录对应
Employee emp=(Employee) session.load(Employee.class, 3);
emp.setName("chen");//update...
emp.setEmail("abc@sohu.com");
ts.commit();
session.close();
}
public static void addEmployee() {
//我们使用hibernate完成crud操作[这里我们只见对象,不见表]
//现在我们不是用service ,直接测试.
//1。创建Configuration,该对象用于读取hibernate.cfg.xml,并完成初始化
Configuration configuration=new Configuration().configure();
//2.创建SessoinFactory[这是一个会话工厂,是一个重量级的对象]
SessionFactory sessionFactory=configuration.buildSessionFactory();
//3.创建Sessoin 相当于jdbc Connection[ servelt HttpSession ,也不是 jsp session]
Session session=sessionFactory.openSession();
//4.对hiberate而言,要求程序员,在进行 增加,删除,修改的时候使用事务提交,
Transaction transaction = session.beginTransaction();
Employee employee=new Employee();
employee.setName("chenxin");
employee.setEmail("aec@sohu.com");
employee.setHiredate(new Date());
//insert .............
//保存
session.save(employee);//save employee就是持久化该对象 (把对象保存到了数据库中称为一条记录)
//==>insert into ....[被hiberante封装]
//提交
transaction.commit();
session.close();
}
}
这样就完成了一个小的入门程序。