hibernate

这个写的特别好特别清晰

http://blog.csdn.net/lovesummerforever/article/details/19171571

Hibernate(Hibernate框架是ORM工具的一种,是关系/对象映射的解决方案

作用:(ORMObject-RelationMapping)作用是在关系数据库和对象之间做一个自动映射,ORM工具会自动将对象转换为sql语句操作

hibernate是一个基于Java的对象/关系数据库映射工具,它将对象模型表示的数据映射到SQL表示的关系模型上去。Hibernate管理java到数据库的映射,提供给了数据查询和存取的方法,减少了程序员对数据持久化层相关的编程任务。

 

Hibernate配置

 

(1)加入hibernate配置文件,在学struts的时候我们常用的配置文件是struts-config.xml,hibernate的配置文件hibernate.cfg.xml,我们可以在hibernate-3.2\etc\hibernate.cfg.xml目录下拷贝到我们项目中的src下。

这样以上步骤就完成了几本hibernate的基本配置。

(2)接下来我们要建立我们的实体类了,以便完成对象与表的映射。建立User实体类,完成实体类的映射User.hbm.xml。代码如下所示。

User类代码:

 

package springmvc.system.manager;  
  
//user实体。  
public class User {  
    //用户编号。  
    private String userid;  
      
    //名字。  
    private String user;  
      
    //密码。  
    private String password;  
      
    //创建日期。  
    /**
     * 
     */
    private String tel;

    public String getUserid() {
        return userid;
    }

    public void setUserid(String userid) {
        this.userid = userid;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }  
      
    
}  

 

 

 User.hbm.xml代码如下所示:

 

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC   
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    <hibernate-mapping>  
      
        <class name="springmvc.system.manager.User" >  
            <id name="userid">  
                <generator  class="assigned" />  
            </id>  
            <property name="user"/>  
            <property name="password"/>  
            <property name="tel"/>  
          
        </class>  
    </hibernate-mapping>  
   

 

(3)  将User.hbm.xml文件加入到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 name="foo"> name属性hibernate会试图把这个sessionfacotry注册到jndi中去  ,要不然会报错-->
      <session-factory >  
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
          
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>  
          
        <property name="hibernate.connection.username">root</property>  
        <property name="hibernate.connection.password">123456</property>  
          
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  
          
        <property name="hibernate.show_sql">true</property>  
          
        <!--<property name="hibernate.format_sql">true</property>  -->  
          
     
        <mapping resource="com/bjpowernode/hibernate/ User.hbm.xml"/>  
    </session-factory>  
</hibernate-configuration>  

 

 

(4)  编写工具类,ExportDB.java生成数据库中的表,代码如下所示。

 

 package springmvc.system.model;  

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

  
/** 
 * 将hbm生成ddl. 
 * @author summer 
 * 
 */  
public class ExportDB {  
  
    /**将hbm生成ddl. 
     * @param args 
     */  
    public static void main(String[] args) {  
  
        //使用hibernate相关类configuation.  
        //默认读取hibernate.cfg.xml文件.  
        Configuration cfg = new Configuration().configure();  
        //接受配置文件.  
        SchemaExport export = new SchemaExport(cfg);  
        //打印到控制台,输出到数据库.  
        export.create(true, true);  
          
    }  
  
}  

(5)  建立客户端类Client,向表User中添加数据。代码如下所示。

package springmvc.system.controller;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import springmvc.system.manager.User;
import springmvc.system.manager.UserManager;

    public class client {  
       
      /** 
       * @param args 
       */  
      public static void main(String[] args) {  
 
                //默认读取的是hibernate.cfg.xml 文件.  
                Configuration cfg = new Configuration().configure();  
                  
                //建立SessionFactory.  
                SessionFactory factroy = cfg.buildSessionFactory();  
                //取得session.  
                Session session = null;  
                  
                try  
                {  
                    //通过工厂取得session  
                    session = factroy.openSession();  
                      
                    //开启事务.  
                    session.beginTransaction();  
                    //给对象赋值.  
                    User user = new User();  
                    user.setUserid("10"); 
                    user.setUser("张三");  
                    user.setPassword("123");  
                    user.setTel("13234234563");  
                   
                      
                    //保存user对象到数据库.  
                    // 一个实体类对象对应一个数据库中的表.  
                    session.save(user);  
                      
                    //先拿到前面事务的对象.再提交事务.  
                    session.getTransaction().commit();  
                }catch( Exception e)  
                {  
                    e.printStackTrace();  
                    //回滚事务.  
                    session.getTransaction().rollback();  
                }finally{  
                      
                    if(session!=null)  
                    {  
                        if(session.isOpen())  
                        {  
                            //关闭session.  
                            //hibernate中已经将connection的的关闭封装了.  
                            //我们没有看到任何一条sql语句.  
                            session.close();  
                        }  
                    }  
                }  
            }  
        }  

 

 

(6)  加入log4j配置文件,将该配置文件拷贝到我们自己项目的src下,便于调试和跟踪。

(7)建立自己的数据库,执行ExportDB.java生成数据库中的表,执行client.java完成了对象与关系数据库表的对应,如下图3.2,建立的User表。

在整个过程中,可能遇到的问题,1,没有导入包,或者包导入不正确,我自己用了3个包.2.没有建立数据库,3.路径配置不对

Configuration类

上述代码中,Configuration类负责管理Hibernate的配置信息,一个Configuration类的实例代表了应用程序中java类到数据库映射的集合。我们创建一个Configuration实例,并通过这个实例创建SessionFactory实例。   //默认读取的是hibernate.cfg.xml文件.

           Configurationcfg = new Configuration().configure();

           

           //建立SessionFactory.

           SessionFactoryfactroy = cfg.buildSessionFactory();

在这里默认读取的是hibernate.cfg.xml文件,在新建一个Configuration的实例时,Hibernate会在类路径中查找hibernate.properties文件和hibernate.cfg.xml文件,如果两个文件同时存在,则hibernate.cfg.xml将覆盖hibernate.properties文件。如果两个文件都不存在则抛出异常。我们也可以指定配置文件的路径,不用系统默认的hibernate.cfg.xml文件:Stringfilename= “my_hibernate_cfg.xml” Configuration config = new Configuration().configure(filename);


Hibernate配置文件

从配置文件中可以看出,这个配置文件描述的是数据库的信息,如数据库看的URL、用户名、密码,hibernate使用方言(那种数据库),同时还可以管理数据库中各个表的映射文件,还可以配置事务策略等。


SessionFactory类(这个是核心)

SessionFactory负责Session实例的创建,为了创建一个SessionFactory对象,必须在Hibernate初始化的时候创建一个Configuration类的实例,并将已经写好的映射文件交给它处理。这样Configuration对象就可以创建一个SessionFactory对象,当SessionFactory对象创建成功后,Configuration对象就没用过了。SessionFactory是线程安全的,可以被多个单线程调用以取得session对象,而构造SessionFactory要消耗资源,所以多数情况下一个应用中只初始化一个SessionFactory,在这里我们可以考虑使用静态方法,来解决这个问题。在上述代码的基础上我们抽取出一个工具类,用来专门实例化工厂管理session,并且采用static每次只初始化一次

Session

Session是Hibernate运作的核心,对象的声明周期、事务的管理以及数据库的存取都与它息息相关。Session是由SessionFactory创建的,SessionFactory是线程安全的,而Session不是线程安全的,所以让多个线程共享一个session,会引起冲

 

 

posted on 2016-12-27 17:28  满目琳琅  阅读(132)  评论(0)    收藏  举报

导航