四、Hibernate框架的API (二)-- Configuration、SessionFactory 对象

	
	|-- Configuration       配置管理类对象				
				config.configure();    加载主配置文件的方法,默认加载src/hibernate.cfg.xml(hibernate.cfg.xml)									
				config.configure(“cn/config/hibernate.cfg.xml”);   加载指定路径下指定名称的主配置文件
				
				config.buildSessionFactory();   创建session的工厂对象


	|-- SessionFactory     session的工厂(或者说代表了这个hibernate.cfg.xml配置文件)
				sf.openSession();   创建一个sesison对象
				sf.getCurrentSession();  创建session或取出session对象
	
	创建配置类,加载配置。
	创建SessionFactory,开启session。
	
	SessionFactory是单例的,一个应用程序只需要一个此对象即可。
			

一、读取默认路径下的配置文件,创建Session工厂

	
	默认读取src/hibernate.cfg.xml:
		
					Configuration  cf=new Configuration();
					cf.configure();
					
1.1 模板代码
public class Demo {
	
	public static void main(String[] args) {
		
		//创建对象
		UserEntity u=new UserEntity();
		
		u.setId(UUID.randomUUID().toString());
		u.setName("222");
		u.setBirth(new Date());
		
		//1.创建配置类,加载配置。
		Configuration  cf=new Configuration();
		cf.configure();//默认读取src/hibernate.cfg.xml
		
		//2.创建工厂,开启session
		SessionFactory sessionFactory = cf.buildSessionFactory();		
		Session session = sessionFactory.openSession();
		
		//开启事务
		Transaction tr = session.beginTransaction();
		
		//保存
		session.save(u);
		
		//提交事务
		tr.commit();
	}
}
1.2 模板代码 – 封装
		Configuration类,负责加载配置文件。
		SessionFactory类,负责创建Sesison。
		
		由于这些基础配置只需加载一次。
		所以,将这些基础配置的代码放在静态代码块中即可。
public class Demo2 {
	
	private  static SessionFactory sf;
	
	static {
		
		Configuration cf=new Configuration();
		cf.configure();
		
		sf=cf.buildSessionFactory();
	}
	
	@Test
	public void testSave() {
		//创建对象
		UserEntity u=new UserEntity();
		
		u.setId(UUID.randomUUID().toString());
		u.setName("222");
		u.setBirth(new Date());
		
		//1.创建会话连接
		Session session = sf.openSession();
		
		Transaction tr = session.beginTransaction();
		session.save(u);
		tr.commit();
	}
	
}
	

二、读取指定路径下的配置文件,创建Session工厂

		
		读取src/org/jsoft/id/hibernate.cfg.xml
				
					Configuration  cf=new Configuration();
					cf.configure("org/jsoft/id/hibernate.cfg.xml");

public class App {
	
	private static SessionFactory sf; 
	static {
		Configuration cf=new Configuration();
		cf.configure("org/jsoft/id/hibernate.cfg.xml");
		sf= cf.buildSessionFactory();
	}
	
	public static void main(String[] args) {
		Session session = sf.openSession();
		System.out.println(session);
	}
}

三、加载映射文件

	
	hibernate.cfg.xml 是hibernate的主配置文件。
	*.hbm.xml 是hibernate的映射配置文件。
	
	加载映射文件:
				方式一:在hibernate.cfg.xml 加载映射文件。
				方式二:硬编码方式加载映射文件(测试时使用)

3.1 配置方式加载映射文件。在hibernate.cfg.xml 加载映射文件。
<!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节点代表一个数据库 -->
	
	<session-factory >
	
		<!-- 1. 数据库连接配置 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/js</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		
		<!-- 
			数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql
		 -->
		 
		 
		 
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
		
		
		<!-- 2. 其他相关配置 -->
		<!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 2.2 格式化sql -->
		<property name="hibernate.format_sql">false</property>
		<!-- 2.3 自动建表  -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		
		
		<!-- 3. 加载所有映射 -->
		<mapping resource="org/jsoft/set/Student.hbm.xml"/>
		
	</session-factory>
</hibernate-configuration>
3.2 硬编码方式加载映射文件
public class App {
	
	private static SessionFactory sf; 
	static {
		Configuration cf=new Configuration();
		cf.configure("org/jsoft/id/hibernate.cfg.xml");
		
		//手动添加配置类。默认会加载与类名同名的映射文件
		cf.addClass(StudentEntity.class);
		sf= cf.buildSessionFactory();
	}
	
	public static void main(String[] args) {
		Session session = sf.openSession();
		System.out.println(session);
	}
}

四、SessionFactory对象

4.1 SessionFactory的概念与作用
 
 +++ SessionFactory的概念
	
	1.SessionFactory,它是产生session的工厂。维护的最重要的东西就数据库连接池。
	
			一般情况下,每一个session里都有一个数据库的连接,(如果没有数据库连接,怎么和数据库打交道呢?)
			SessionFactory是产生session的工厂,所以它一定有好多个数据库连接。
			所以SessionFactory维护的最重要的东西就是数据库连接池。
			当它产生一个session的时候,他会从数据库连接池拿出一个连接交给session。

	2.SessionFactory是线程安全的,并且创建和销毁需要消耗比较大的资源,所以整个应用里面针对一个数据库只需要一个SessionFactory即可
			    	
	
  +++ SessionFactory的作用
  
	 		1. 用来产生和管理Session。
	 		
	 		2. 维护数据库连接池。
	 					每一个session都有一个数据库连接。SessionFactory是
	 					产生session的工厂,自然会有许多数据库连接。
						所以SeesionFactory维护的最重要的东西就是数据库连接池。


4.2 获取Session对象
4.2.1 sf.openSession( )
	
		Session session = sf.openSession();    
     			每次都是新的【需要close】
  		
  		1.session使用完毕后,必须要关闭。每一个session都维护了一个
  		  Connection对象,如果不关闭,肯定是浪费数据库连接资源。
  		
  		2.session有个connection方法,返回值也是Connection,
		    可以看出在这个session里绑定了一个Connection,
		      这个Connection是从SessionFactory通过配置文件信息,产生的数据库连接池里取出的。
		      所以简单理解,session等同于一个Connection,不过也不能这个理解,hibernate还有很多很复杂的东西。
		        
 @Test
    public void testTeacher() {
        
        Teacher  t  = new Teacher();        
        t.setName("li");        
        t.setTitle("high");
          
        //openSession(),永远都打开新的session。需要close();
        Session session = sf.openSession();
        
        session.beginTransaction();
        session.save(t);
        
        session.getTransaction().commit();
        session.close();
    }
4.2.2 sf.getCurrentSession( )
  
   Session session = sf.getCurrentSession();
					 从上下文找,如果有,用旧的;如果没有,建新的
					【不需要close。事务提交自动close】		
			
			切记:
			1.使用该方法获取sesison,必须要在hibernate.cfg.xml中配置session绑定
	  		<property name="current_session_context_class">thread</property>		
			
			2.当hibernate与spring整合时,上述配置就不需要,如果配置就会报错。


				1.如果当前上下文有session,就拿来当前的session。
				  如果没有,就创建一个新的session
     			
     			2.不要写session.close();
     				注意:当session.commit()提交的时候自动close(),写了会报错。
     					  提交同时也会关闭当前session,上下文将不存在该session,此时getCurrentSession()就会创建一个新的session。
         					  


	注:上下文是什么?
	
    	当前session运行的上下文,在hibernate.cfg.xml里指定的:
		最常用的就是thread,看当前的线程里有没有session对象,有了就拿,没有就建新的。

		<!-- Enable Hibernate's automatic session context management -->
	  	<property name="current_session_context_class">thread</property>		

 @Test
    public void testTeacher() {

        
        Teacher  t  = new Teacher();        
        t.setName("li");        
        t.setTitle("high");
        /**
         * getCurrentSession():
         * 1, 如果当前上下文有session,就拿来当前的session。如果没有,就创建一个新的session
         * 2,不写session.close();
         * 注意:当session  commit()提交的时候自动close(),写了会报错。
         * 提交同时也会关闭当前session,上下文将不存在该session,此时getCurrentSession()就会创建一个新的session。
         */
        Session session = sf.getCurrentSession();
        
        /**
         * session有个connection方法,返回值也是Connection,可以看出在这个session里绑定了一个Connection,
         * 这个Connection是从SessionFactory通过配置文件信息,产生的数据库连接池里取出的。所以简单理解,session等
         * 同于一个Connection,不过也不能这个理解,hibernate还有很多很复杂的东西。
         */
        //session.connection();
      
        session.beginTransaction();
        session.save(t);
        
        //当当前的session提交了,就关闭了,对象就没了。再getCurrentSession就是新的。
        //session.getTransaction().commit();
        //session.close();
        
        
        //Session session2 = sf.openSession();
        //两次opSession不是一个session,返回false
        //System.out.println(session == session2);
        
        //Session  session2 = sf.getCurrentSession();
        //如果session没commit,返回true,否则返回false
        //System.out.println(session == session2);

    }

五、Session对象

5.1 Session的概念
	
	1.Session 是应用程序与数据库之间交互操作的一个单线程对象,生命周期很短,
	  是 Hibernate 运作的中心,
	  所有持久化对象必须在 session 的管理下才可以进行持久化操作
	  (持久化类与 Session 关联起来后就具有了持久化的能力)。
	

	2.Session 接口是 Hibernate 向应用程序提供的操作数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载 Java 对象的方法。

4.4 Session类的方法


 Session 类的方法:

	取得持久化对象的方法: 
						 get(), load()
	
	持久化对象都得保存,更新和删除:
						 save(),update(),
						 saveOrUpdate(),delete()
						 
	开启事务:
						 beginTransaction()
	
	管理 Session 的方法(一级缓存相关方法):
						isOpen(),flush(), clear(), evict(), close()等

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值