1.概念
完成对象模型和关系模型转换的开源框架
2.特点
(1)是一个开源的持久层轻量级框架(对操纵的组件没有任何的侵入性)
(2)ORM:通过元数据进行数据模型和对象模型之间的转换(将数据从一种状态转到另一种状态)
(3)非常好的缓存机制:有一级缓存,二级缓存,和查询缓存(介于一二级之间)提高缓存效率;
(4)对jdbc进行了轻量级的对象封装(默认使用dbcp连接池技术)
(5)不仅提供了从Java类到数据表的映射,也提供了数据查询和恢复机制(恢复/回滚)
(6)用配置文件的形式来定义对象和关系之间的映射
(7)使用HQL语句将复杂的关系算法用对象的方式描述(不再需要编写繁琐的sql语句)
3.hibernate架构
pojo:数据bean,不能实现任何接口或继承任何类,也叫实体类
阻抗不匹配:数据在内存和内存外存放的形式不同
3.ORM(Object Relational Mapping)对象关系映射
ORM是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。
4.为什么要进行对象关系映射
(1)面向对象的开发方法是当今企业级应用开发环境中的主流开发方法
(2)关系数据库是企业级应用环境中永久存放数据的主流数据存储系统
5.对象关系映射模式
属性映射,类映射,关联映射:一对一,一对多,多对多
6.一些其它持久层框架
(1)Apache OJB
(2)SUN JDO (java数据对象)
(3)oracle Toplink
(4) EJB2 CMP
(5)EJB3 JPA (java持久化API)
(6)java提供 J持久化标准规范(hibernate也是遵从这种规范),SpringData Jpa是hibernate的一个子集;
(7)Apache iBitis (基FSQL映射的轻星级的个O/R Mapping的解决方案) : Apache itis迁移到google code改名为MyBits;
(8) Gavin King hibernate 最流行的O/R Mapping工具。
好了,以上是对hibernate的一些基本概述,现在开始编写一个使用hibernate框架的案例
1.环境的搭建
(1)先创建一个java项目
(2)build path,-->add library; -->User Library (取名任意,我的是hibernateJAR)
(3)添加jar包
主要jar包有:HIBERNATE HOME/hibernate3.jar ;HIBERNATE HOME/lib/*.jar ;
mySql jdbc驱动: mysql-connector-java-5.0.4-bin.jar
(需要相关jar包的伙伴可以评论留言,可以发送给你)
(4)创建hibernate配置文件hibernate.cfg.xml,为了便于调试最好加入log4配置文件(放在src下面)
(5)创建一个包com.hibernate,创建一个User实体类(pojo)
package com.hibernate;
import java.util.Date;
public class User {
private String id;
private String name;
private String password;
private Date createTime;
private Date expireTime;
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getExpireTime() {
return expireTime;
}
public void setExpireTime(Date expireTime) {
this.expireTime = expireTime;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
(6)创建元数据(映射文件) hmb.xml, 把实体类和数据库关联,命名为实体类名.hmb.xml,且放在实体类的同-个包下;
(7)配置User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 映射表:指明实体类的包名+类名(类名就是数据库的表名) -->
<class name="com.hibernate.User">
<!-- 映射主键:User类里的属性id,也是数据库的主键 -->
<id name="id">
<!-- 主键生成策略,主键值自动生成,hibernate生成,人为设定没用 -->
<generator class="uuid"/>
</id>
<!-- 映射表里的普通字段 :会自动转化为数据库表字段相应的类型-->
<!-- eg:string映射为varchar util,Date映射为Datetime -->
<property name="name"/>
<property name="password"/>
<property name="createTime"/>
<property name="expireTime"/>
</class>
</hibernate-mapping>
(8)配置主配文件hibernate.cfg,xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置url,驱动名,用户名,密码 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_database</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 设置方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 特性配置(是否显示sql语句) -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 映射配置,元数据的包名+文件名 -->
<mapping resource="com/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
(9)利用Hibernate提供的工具类来创建数据库表 编写hbm2ddl工具类ExportDB
package com.hibernate;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class ExportDB {
public static void main(String[] args) {
//读取hibernate.cfg.xml文件
Configuration cfg=new Configuration().configure();
SchemaExport export=new SchemaExport(cfg);
//创建表
export.create(true, true);
}
}
执行结果:在数据库创建了相应的表(如下图):
(10)编写测试类,往User表里添加一条记录
package com.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import java.util.Date;
public class Client {
public static void main(String[] args) {
//读取hibernate.cfg.xml文件(若不调用configure,读取的则是bibernate.properties文件)
Configuration cfg = new Configuration().configure();
//创建SessionFactory对象,即创建session工厂
//重量级,耗时,线程安全,一般在程序初始化时创建
SessionFactory factory=cfg.buildSessionFactory();
Session session = null;
try {
//创建Session,持久层管理器-完成持久化ORM,但线程不安全 ,有一级缓存,可以管理事务,管理连接
session=factory.openSession();
//开启事物
session.beginTransaction();
User user=new User();
//不需要设置id值,设置了主键生成策略uuid ,由Hibernate生成主键
user.setName("wangwu");
user.setPassword("789");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//保存数据
/**
* session先通过user对象找到User类,
* 并在hibernate.cfg.xml文件里找到对应的User.hmb.xml的映射文件
* 通过映射文件找到对应的表,将实体类中各个属性的值存到表中对应的各个字段中
* eg:user对象的name属性值"wangwu" 转换成user表里的name字段的记录,类型为varchar;
* createTime属性值转换成表里的createTime:字段的记录,类型为datatime;
*
*/
session.save(user);
//提交事务,对提交数据库的数据做确认,确认完整性
/**
*若没提交事务,这些数据就是”脏数据"或者”垃圾数据
*因为没有确认数据,主键可能会与表里的数据相同,所有这些数据暂时是无效;
*/
session.getTransaction().commit();
} catch(Exception e) {
e.printStackTrace();
//回滚事务(数据不正确的时候)
session.getTransaction().rollback();
}finally{
if (session != null) {
if (session.isOpen()) {
session.close();//关闭session
}
}
}
}
}
结果(在User表中创建了一条记录):
好了,第一个hibernate案例到此结束
通过使用hibernate框架,你是否也发现了它的巨大好处呢,下面我们就来总结一下
hibernate优点:
(1)提高生产力
不用再写枯燥的jdbc语句了,代码量会明显的减少了,可提高代码质量;
(2) 使开发更对象化了
只操作对象就可把数据存入到数据库中;
(3)可移植性好
Hibernate会根据数据库的不同利用适配器(方言)的配置自动的转换成相应的sql语句
(4)支持透明持久化
业务对象没有继承任何对象,没有实现任何接口(pojo对象,没有侵入性), Hibernate就可以存到数据库表中,Dao的不同实现,改动量不会很大;