Hibernate构架
Hibernate
什么是hibernate?
在了解hibernate之前我们先来了解一下什么是ORM:
对象关系映射(Objevt Relational Mapping,ORM)是一种为了解决面对对象与关系数据库存在的互不匹配的现象的技术。将数据从一种形式转换到另外一种形式。
ORM是怎么工作的?
ORM通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据中。Hibernate就是典型的ORM框架。
hibernate概念:
hibernate是一种开源的持久层框架,是一种实现对象和关系之间映射的工具。它对JDBC进行了轻量级的数据封装,使程序员可以使用对象编程的思想来操作数据库。
hibernate的优点:
1. 提高生产力:
不需要写jdbc语句,减少了代码量,提高了代码质量;
2. 使开发对象化:
只需操作对象就能把数据存入到数据库中;
3. 可移植性好:
Hibernate能根据数据库的不同,利用适配器(方言)的配置自动转换层相应的sql语句;
4. 支持透明持久化:
业务对象不需要继承任何对象,不需要实现任何接口(pojo对象,没有侵入性),Dao层的不同实现,改动量不会很大。
Hibernate环境配置
在eclipse上配置Hibernate
1. 用eclipse创建java Project项目
2. 创建User Library

3. 按Add jars键,加入如下jar
HIBERNATE_HOME/hibernate3.jar
HIBERNATE_HOME/lib/*.jar
MySql jdbc驱动:
mysql-connector-java-5.0.1-bin.jar
4. 导入项目库



5. 创建hibernate配置文件hibernate.cfg,xml,为了便于调试最好加入log4j配置文件
从安装包hibernate-3.2\etc下把hibernate.cfg.xml、log4j.properties文件复制到src目录下,病配置hibernate.cfg.xml文件如下:(以mysql为例参见hibernate.properties文件)
<!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="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/hibernate_fistb?characterEncoding=UTF-8</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>
<!--注意下面这一行,如果MySql的版本在5.0以上,必须在MySQL后面加上5
如:<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<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>
在IDEA上配置Hibernate
说明:
在使用IEDA创建项目时,找不到创建hibernate项目的选项
通过查阅资料得知,IEDA中提供了hibernate框架的所有插件,因此我们只需通过IEDA下载插件并添加,就可以创建hibernate项目了。
Hibernate配置步骤:
1. 在最开始前,添加 Hibernate 的插件。
在File | Settings | Plugins中直接搜索hibernate即可快速找到hibernate插件
2. 新建 Hibernate 的 Module
在Java Enterprise 下的右侧找到Hibernate并选中
选择Download选项后点击configure,之后的创建总中只需选择Use library就行了
点击 Configure 会弹出下图,需要注意的是 level 的选择
创建完成
3. 添加jar包到Module下
打开Project Structure,确认导入了hibernate插件
如果没有则需要手动导入,点击右侧加号导入

4. 配置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>
<!--配置连接数据库基本信息-->
<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/hibernate_fistb?characterEncoding=UTF
-8</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>
<!--配置Hibernate的基本信息-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<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>
Hibernate的核心接口

1.Configuration
概述:
Configuration类负责管理Hibernate的配置信息。它包括如下内容:
- Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类、数据库Dialect、连接池等。
- Hibernate映射文件(*.hbm.xml)
Hibernate配置的两种方法:
- 属性文件(hibernate.properties)。
调用代码:Configuration cfg = new Configuration(); - xml文件(hibernate.cfg.xml)。
调用代码:Configuration cfg = new Configuration().configure();
2.SessionFactory
概述:
应用程序从SessionFactory(会话工厂)里获得Sssion(会话)实例,工厂自动创建连接池。它在多个应用线程间进行共享。由于工厂是重量的,耗时较大,虽然Hibernate支持使用多个工厂,但一般只使用一个工厂,工厂在服务器启动时创建且仅创建一次。
调用代码:
SessionFactory sessionFactory = cfg.buildSessionFactory();
PS: cfg为Configuration对象。
3.Session(会话)
概述:
- Session不是线程安全的,它完成对数据库之间的操作,实现ORM;
- Session也称为持久化管理器,因为它是与持久化有关的操作接口,可以对纳入session管理的对象的数据进行缓存,同时它还负责管理连接池(Hibernate默认使用JBCP连接池,最大连接数默认为20);
- Session通过SessionFactory打开,共享SessionFactory中的数据,在所有工作完成后,需要关闭;
- 它与web中的HttpSession没有任何关系。
调用代码:
Session session = sessionFactory.openSession();
PS: sessionFactory为SessionFactory对象。
4.Transaction(事务)
概述:
它将应用代码从底层的事务实现中抽象出来,允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。
调用代码:
Transaction tx = session.beginTransaction();
注: 使用Hibernate进行操作时必须显式地调用Transaction(默认:autoCommit = false) 。
5.Query
概述:
Query支持的HQL接口运行你在数据库上执行查询,并控制查询如何执行。查询语句使用HQL或本地数据库的SQL方言编写。
HQL:
HQL是Hibernate的查询语言,用来出查询对象。
注意:HQL不能直接指定表,只能通过指定对象、指定实体进行查询。
调用代码:
Query query = session.createQuery(“from User”);
PS: User是实体类。该语句将把数据全部查询出来
Query的举例:
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
session.beginTransaction();
Query query = session.createQuery("from User");
List users = query.list();
for (Iterator iter = users.iterator(); iter.hasNext();) {
User user = (User) iter.next();
System.out.println("user name = "+user.getName());
}
session.getTransaction().commit();
if(session.isOpen()){
session.close();
}
Hibernate测试代码示例
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文件
Configuration cfg = new Configuration().configure();
//创建SessionFactory对象
/*
* 功能:
* 创建session
* 管理全局性事物
* 管理二级缓存
* 特点:重量的,耗时,线程安全的
* 一个hibernate可以配置多个SessionFactory但一般不那么做
* */
SessionFactory factory=cfg.buildSessionFactory();
/*
* 完成ORM操作进行对象和关系之间的转换
* 管理事务
* 管理连接池
* 缓存 只有纳入session缓存的事务才能进行ORM操作
* 特点:线程不安全 由SessionFactory创建 共享SessionFactory中的数据
* */
Session session = null;
try {
session=factory.openSession();//创建Session
//开启事物
session.beginTransaction();
User user=new User();
user.setName("wangwu");
user.setPassword("789");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//保存数据
session.save(user);
//提交事务
session.getTransaction().commit();
} catch(Exception e) {
e.printStackTrace();
//回滚事务
session.getTransaction().rollback();
}finally{
if (session != null) {
if (session.isOpen()) {
session.close();
}
}
}
}
}
说明:本文仅用作学习笔记,无其他用途,如有冒犯可联系本人删除