一、基本概念
1、Configuration:
概述: Configuration类负责管理Hibernate的配置信息。启动Hibernate、创立SessionFactory对象。
(1) Hibernate运行的底层配置信息:数据库的URL、用户名、明码、JDBC驱动类,数据库Dialect,数据库连接池等。
(2) Hibernate对象关系映射文件(*.hbm.xml) 。
Hibernate配置的两种办法:
(1)属性文件( (hibernate.properties)
调用代码:Configuration cfg = new Configuration();
(2)XML文件(hibernate.cfg.xml) 。
调用代码:Configuration cfg = new Configuration().configure();
configrure()办法默认读hibernate.cfg.xml
2.SessionFactory:
概述:应用程序从SessionFactory(会话工厂)里取得Session(会话)实例。它在多个利用线程间进行共享。
(1) SessionFactory是线程平安的(Thread-Safe),能够让多个执行线程同时存取SessionFactory而不会有数据共享的问题。
(2) 会话工厂缓存了生成的SQL语句和Hibernate在运行时应用的映射元数据。
(3) 须要留神的是SessionFactory是重量级的,因为个别状况下,一个我的项目通常只须要一个SessionFactory就够(单例模式),当须要操作多个数据库时,能够为每个数据库指定一个SessionFactory。
调用代码: SessionFactory sessionFactory =cfg.buildSessionFactory();
3.Session
概述:Session接口负责执行被长久化对象的CRUD操作(CRUD的工作是实现与数据库的交换)
(1)Session也称为长久化管理器,因为它是与长久化无关的操作接口。
(2)Session不是线程平安的,应该防止多个线程共享同一个Session实例。
(3)Session通过SessionFactory关上,在所有的工作实现后,须要敞开。
(4)保障在一个线程中仅存在一个Session实例
getCurrentSession (Hibernate 3+)
能够采纳ThreadLocal的方法.(Hibernate 2)
把Session对象放在办法外部定义.
它与Web层的HttpSession没有任何关系。
4.Transaction(事务)
概述: Transaction接口负责事务相干的操作。
它将利用代码从底层的事务实现中形象进去——这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象申请代理构造(CORBA)——容许利用通过一组统一的API管制事务边界。
这有助于放弃Hibernate利用在不同类型的执行环境或容器中的可移植性。
调用代码:
Transaction tx = session.beginTransaction();tx.commit();l提交事务
.…..
tx.rollback(); //回滚事务
注:应用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认: autoCommit=false) 。
5.Query
概述:
Query(查问)接口容许你在数据库上执行查问并管制查问如何执行。查问语句应用HQL或者本地数据库的SQL方言编写。
调用代码:
Query query = session.createQuery("fromUser");
二、应用步骤
1.实现SessionFactory的单态模式
在cn.hrbust.dao包下创立HibernateUtil.java类
package cn.hrbust.dao;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static Configuration cfg=null;
private static SessionFactory sf=null;
static { //在类加载的时候只能执行一次
try {
cfg=new Configuration().configure();
sf=cfg.buildSessionFactory();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory(){
return sf;//去返回SessionFactory
}
public void closeSessionFactory(){
sf.close();//敞开SessionFactory
}
}
manageUser就变为:
public class manageUser{
public static void main(String[] args){
Configuration cfg=null;
SessionFactory sf=null;
Session session=null;
Transaction ts=null;
User u=new User();
u.setName("1814010833");
u.setGender("女");
u.setAge(21);
u.setBirthday(Date.valueOf("2000-2-5"));
try {
sf=HibernateUtil.getSessionFactory(); //sessionFactory的单态模式
session=sf.openSession();
ts=session.beginTransaction();
session.save(u);
ts.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if(ts!=null){
ts.rollback();
}
}finally{
session.close();
sf.close();
}
}
}
2.之前用openSession的形式去关上长久化管理器,Hibernate3之后举荐用getCurruntSession来关上session,并且这种形式保障线程平安
应用getCurrentSession须要在配置文件中退出<property name="hibernate.current_session_context_class">thread</property>
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/l....
-->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory><property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hellohibernate</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">123456</property><property name="hibernate.current_session_context_class">thread</property><!-- 保障每个读写线程有惟一的session实例 --> <property name="show_sql">true</property> <mapping resource="cn/hrbust/pojo/User.hbm.xml"/></session-factory>
</hibernate-configuration>
配置好后将session=sf.openSession();改为session=sf.getCurrentSession();
public class manageUser{
public static void main(String[] args){
Configuration cfg=null;
SessionFactory sf=null;
Session session=null;
Transaction ts=null;
User u=new User();
u.setName("1814010833");
u.setGender("女");
u.setAge(21);
u.setBirthday(Date.valueOf("2000-2-5"));
try {
sf=HibernateUtil.getSessionFactory(); //sessionFactory的单态模式
session=sf.getCurrentSession();//保障每个读写线程有惟一的session实例
ts=session.beginTransaction();
session.save(u);
ts.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if(ts!=null){
ts.rollback();
}
}finally{ //当用getCurrentSession的时候能够主动敞开
//session.close();
//sf.close();
}
}
}
3.事务
如果不提交,则仅仅是收回语句,然而事务没有被提交,所以数据库里并没有,所以必须要显示开启事务,即ts.commit必须要加才能够失效
4.Query
(1)扩大性能:独自测试方法:
保留用户对象:
public class manageUser extends TestCase{
public void testSavaUser(){
Configuration cfg=null; SessionFactory sf=null; Session session=null; Transaction ts=null; User u=new User(); u.setName("哈哈哈"); u.setGender("男"); u.setAge(30); u.setBirthday(Date.valueOf("2000-2-5")); try { sf=HibernateUtil.getSessionFactory(); //sessionFactory的单态模式 session=sf.getCurrentSession();//保障每个读写线程有惟一的session实例 ts=session.beginTransaction(); session.save(u); ts.commit(); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); if(ts!=null){ ts.rollback(); } }finally{ //session.close(); //sf.close(); }}
}
(2)查问用户对象:
public class manageUser extends TestCase{
public void testQueryUser(){
Configuration cfg=null; SessionFactory sf=null; Session session=null; Transaction ts=null; try { sf=HibernateUtil.getSessionFactory(); //sessionFactory的单态模式 session=sf.getCurrentSession();//保障每个读写线程有惟一的session实例 ts=session.beginTransaction(); Query query=session.createQuery("from User"); List<User> users =query.list();
// for的第一种形式
// for(int i=0;i<users.size();i++){
// User u=users.get(i);
// System.out.println(u.getName()+" "+u.getAge());
// }
// for的另一种形式
for(User u:users){ System.out.println(u.getName()+" "+u.getAge()); } ts.commit(); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); if(ts!=null){ ts.rollback(); } }finally{ //session.close(); //sf.close(); }}
}