关于hibernate:Hibernate的升级Query用法

26次阅读

共计 6567 个字符,预计需要花费 17 分钟才能阅读完成。

一、基本概念
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();}
}

}

正文完
 0