Hibernate学习一

认识:
Hibernate是将对象模型表示的数据映射到用SQL表示的关系模型上去.还提供了一般的数据库操作,所以大幅度减少了编程任务

对象持久化:把数据同步保存到数据库或者某些存储设备中

ORM: object-relation mapping   对象关系映射

结果:操作具体的数据库时,不用再与复杂的SQL语句打交道,只用操纵对象即可,ORM工具会自动将对象操作转换为SQL语句,这样就可用更多时间关注业务逻辑,不用关心底层复杂的SQL和JDBC代码

配置:
HIBERNATE被设计为可以在不同的环境下工作,所以有很多的参数要配置,不过很多参数已经有默认值,所以配置较少的参数就可以运行了
Configuration类
它是HIB的入口,它管理HIB的配置信息,它的一个对象代表应用程序中JAVA类到数据库的映射集合..  它会创建一个sessionfactory实例来开始工作
SessionFactory  sessionFactory = new Configuration().configure().buildSessionFactory();
注: new Configuration()时,HIB会在类路径中查找文件hibernate.properties和hibernate.cfg.xml.如果这两个文件同时存在,则hibernate.cfg.xml将会覆盖hibernate.properties文件;如果两个文件都不存在,则会抛出异常
注:hibernate.cfg.xml文件的名称及路径可以自己设置它的名称及所在位置,不过这时创建
Configuration类对象时要用下面带参数方法
String filename=”my_hibernate_cfg.xml”;
Configuration config=new Configuration().configure(filename);


下面以最常用的hibernate.cfg.xml格式进行配置[数据库以mysql为例]<?xml version='1.0' encoding='UTF-8'?>
<!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="connection.url">
jdbc:mysql://localhost:3306/store
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>


                   ###下面这个属性是配置HIB所使用的语言[用于操作DB的]
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
               
                 
<mapping resource="store/Product.hbm.xml" />
<mapping resource="store/Order.hbm.xml" />
<mapping resource="store/Customer.hbm.xml" />
         ##上面三行是各个表的映射文件
                
           </session-factory>
</hibernate-configuration>


Sessionfactory类
它负责SESSION实例的创建,通过configuration类来得到,并且把已经写好的映入文件交由它处理.  当SESSIONfactory创建成功后,configuration对象就没有用了,可以简单抛弃它
Configuration config = new Configuration().configure();
SessioFactory sessionfactory = config.buildSessionFactory();

注:sessionfactory是线程安全的,可以被多个线程调用来取得SESSION对象而不会引起数据共享的问题,而构造sessionfactory很破费资源,所以多数情况下一个应用只创建一个sessionfactory 即可.


session管理
session是HIB动作的核心, 对象的声明周期,事务管理,数据库的存取都与它密切相关

注意:
sessionfactory可以让多个线程一起调用,是线程安全的
可是session不是线程安全的,所以多个线程共享一个session会引起冲突和混乱

下面介绍使用 ThreadLocal变量,解决session的管理问题.用它有效地隔离线程执行所使用的数据可以避免多个线程之间的数据共享问题.
下面提供一个工具类专门来管理session


package store;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

public class HibernateSessionFactory {
    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private  static Configuration configuration = new Configuration();
    private static org.hibernate.SessionFactory sessionFactory;
    private static String configFile = CONFIG_FILE_LOCATION;

    private HibernateSessionFactory() {
    }

/**
         得到一个SESSION对象
       */
    public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

     if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ?    sessionFactory.openSession(): null;
threadLocal.set(session);
}
        return session;
    }

/**
     *  重新创建SESSION 工厂
     *
     */
public static void rebuildSessionFactory() {
   try {
      configuration.configure(configFile);
      sessionFactory = configuration.buildSessionFactory();
     } catch (Exception e) {
     System.err.println("%%%% Error Creating SessionFactory %%%%");
      e.printStackTrace();
     }
   }

/**
        关闭SESSION
     */
    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);

        if (session != null) {
            session.close();
        }
    }

/**
     返回一个 session factory
     *
     */  *  return session factory
     *
     * session factory will be rebuilded in the next call
    public static org.hibernate.SessionFactory getSessionFactory() {
return sessionFactory;
}

/**
  
     */
public static void setConfigFile(String configFile) {
HibernateSessionFactory.configFile = configFile;
sessionFactory = null;
}

/**
     *  return hibernate configuration
     *
     */
public static Configuration getConfiguration() {
return configuration;
}

}















你可能感兴趣的:(sql,mysql,xml,Hibernate,配置管理)