Hibernate api基础

Hibernate 的orm操作数据库,是通过session核心对象进行操作的。

一、在获取session对象前需要:

                                             1.创建Configuration;

                                             2.通过Configuration读取配置conf.configure(); (空参方法是去默认加载src下的hibernate.cfg.xml)

                                             3.根据配置获取生产Session对象的SessionFactory对象

即如下的三步:

		//1 创建,调用空参构造
		Configuration conf = new Configuration();

		//2 读取指定主配置文件 => 空参加载方法,加载src下的hibernate.cfg.xml文件
		conf.configure();

		//3 根据配置信息,创建 SessionFactory对象
		SessionFactory sf = conf.buildSessionFactory();

二、获取Session对象:有两种方式供我们选择

1.获取一个新的session对象。openSession()

2.获得一个与线程绑定的session对象。getCurrentSession()

		//4 获取session
		//获取一个新的session对象
		sf.openSession();
		//获得一个与线程绑定的session对象
		sf.getCurrentSession();

三、两种获取Session的方式是有很大区别的,具体使用哪一种则需要先弄清楚他们的区别,我们才能知道在什么情况下使用哪种方式。

1.openSession 是打开一个新的session对象,而且每次使用都是打开一个新的session,假如连续使用多次,则获得的session不是同一个对象,使用完需要调用close方法关闭session

2. getCurrentSession 是获取当前上下文一个session对象,当第一次使用此方法时,会自动产生一个session对象,并且连续使用多次时,得到的session都是同一个对象。事务提交会自动close。

        2.1 简单点说就是,调用getCurrentSession()方法时,框架会去检查之前有没有生成过Session对象,有则拿这个旧的,没有则生成一个新的,保证这个线程中只存在一个Session对象。

        2.2 根据Hibernate框架分析,SessionFactory启动的时候,Hibernate 会根据配置创建相应的 CurrentSessionContext,在getCurrentSession()被调用的时候,实际被执行的方法是CurrentSessionContext.currentSession()。在currentSession()执行时,如果当前Session为空,currentSession会调用SessionFactory的openSession。(来自:https://blog.csdn.net/yzy1103203312/article/details/70312949

3.根据两个获取Session的不同方式,具体在如下情况中使用:

      3.1 如果需要在同一线程中,保证使用同一个Session则,使用getCurrentSession();

      3.2 如果在一个线程中,需要使用不同的Session,则使用opentSession();

4.使用getCurrentSession()操作事物,有两种情况 本地事物和全局事物,所以hibernate.cfg.xml文件配置便有所不同

      4.1 本地事物(即 单数据库连接管理事务)时所加的配置如下;

              <property name="current_session_context_class">thread</property>

      4.2  全局事务(Java 分布式事务管理 (多数据库访问))时所加的配置如下:

             <property name="hibernate.current_session_context_class">jta</property>      jta 由中间件提供(JBoss WebLogic 等, 但是tomcat 不支持)

四、Session对象事物操作

       1. 获得操作事物对象,有两种方式:

               1.1 先获得操作事物对象,再开启事物 两步(不建议使用)

                      Transaction tx = session.getTransaction();

                       tx.begin();

               1.2.获取事物对象同时开启事物(推荐使用):

                       Transaction tx = session.beginTransaction();

        2. 提交事物  tx.commit(); 

        3. 回滚事物  tx.rollback();

        4.关闭资源  关闭Session资源 和 sessionFactory资源   

               session.close();
               sf.close();

五、增删改简单操作

1.新增数据    session.save( Obj);

 2.修改数据   session.update(Obj);

3.查询数据  session.get(Obj.class, param);

4.删除数据  session.delete(Obj);

具体操作增删改查如下代码,Customer表  id-主键id long类型      Cust_name - 客户名称Sting类型(简单演示)

package cn.test.hibernatetest;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import cn.test.domain.Customer;

public class Demo {

	@Test
	//事务操作
	public void fun1(){
		//1 创建,调用空参构造
		Configuration conf = new Configuration().configure();

		//2 根据配置信息,创建 SessionFactory对象
		SessionFactory sf = conf.buildSessionFactory();

		//3 获得session
		Session session = sf.openSession();

		//4 session获得操作事务的Transaction对象
		//获得操作事务的tx对象
		//Transaction tx = session.getTransaction();
		//开启事务并获得操作事务的tx对象(建议使用)
		Transaction tx2 = session.beginTransaction();
		//----------------------------------------------
		
		

        //做 怎删改查


		//----------------------------------------------
		tx2.commit();//提交事务
		tx2.rollback();//回滚事务
		session.close();//释放资源
		sf.close();//释放资源
	}
	
	@Test
	//session的新增
	public void fun2(){
		//1 创建,调用空参构造
		Configuration conf = new Configuration().configure();
		//2 根据配置信息,创建 SessionFactory对象
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//4 session获得操作事务的Transaction对象
		//获得操作事务的tx对象
		//Transaction tx = session.getTransaction();
		//开启事务并获得操作事务的tx对象(建议使用)
		Transaction tx2 = session.beginTransaction();
		//----------------------------------------------
		Customer c = new Customer();
		c.setCust_name("德玛西亚");
		
		session.save(c);
		//----------------------------------------------
		tx2.commit();//提交事务
		session.close();//释放资源
		sf.close();//释放资源
	}
	@Test
	//session的查询
	//查询id为1的customer对象
	public void fun3(){
		//1 创建,调用空参构造
		Configuration conf = new Configuration().configure();
		//2 根据配置信息,创建 SessionFactory对象
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//4 session获得操作事务的Transaction对象
		//获得操作事务的tx对象
		//Transaction tx = session.getTransaction();
		//开启事务并获得操作事务的tx对象(建议使用)
		Transaction tx2 = session.beginTransaction();
		//----------------------------------------------
		
		Customer customer = session.get(Customer.class, 1l);
		
		System.out.println(customer);
		//----------------------------------------------
		tx2.commit();//提交事务
		session.close();//释放资源
		sf.close();//释放资源
	}
	@Test
	//session的修改
	//修改id为1的customer对象的name属性为黑马程序员
	public void fun4(){
		//1 创建,调用空参构造
		Configuration conf = new Configuration().configure();
		//2 根据配置信息,创建 SessionFactory对象
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//4 session获得操作事务的Transaction对象
		//获得操作事务的tx对象
		//Transaction tx = session.getTransaction();
		//开启事务并获得操作事务的tx对象(建议使用)
		Transaction tx2 = session.beginTransaction();
		//----------------------------------------------
		//1 获得要修改的对象
		Customer c = session.get(Customer.class, 1l);
		//2 修改
		c.setCust_name("为了部落hoho");
		//3 执行update
		session.update(c);
		//----------------------------------------------
		tx2.commit();//提交事务
		session.close();//释放资源
		sf.close();//释放资源
	}
	@Test
	//session的删除
	//删除id为1的customer对象
	public void fun5(){
		//1 创建,调用空参构造
		Configuration conf = new Configuration().configure();
		//2 根据配置信息,创建 SessionFactory对象
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session
		Session session = sf.openSession();
		//4 session获得操作事务的Transaction对象
		//获得操作事务的tx对象
		Transaction tx = session.getTransaction();
		tx.begin();
		//开启事务并获得操作事务的tx对象(建议使用)
		Transaction tx2 = session.beginTransaction();
		//----------------------------------------------
		//1 获得要修改的对象
		Customer c = session.get(Customer.class, 1l);
		//2 调用delete删除对象
		session.delete(c);
		//----------------------------------------------
		tx2.commit();//提交事务
		session.close();//释放资源
		sf.close();//释放资源
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
依赖对象(Dependent objects) 组件(Component)是一个被包含的对象,在持久化的过程中,它被当作值类型,而并非一个实体的引用。在这篇文档中,组件这一术语指的是面向对象的合成概念(而并不是系统构架层次上的组件的概念)。举个例子, 你对人(Person)这个概念可以像下面这样来建模: public class Person { private java.util.Date birthday; private Name name; private String key; public String getKey() { return key; } private void setKey(String key) { this.key=key; } public java.util.Date getBirthday() { return birthday; } public void setBirthday(java.util.Date birthday) { this.birthday = birthday; } public Name getName() { return name; } public void setName(Name name) { this.name = name; } ...... ...... } public class Name { char initial; String first; String last; public String getFirst() { return first; } void setFirst(String first) { this.first = first; } public String getLast() { return last; } void setLast(String last) { this.last = last; } public char getInitial() { return initial; } void setInitial(char initial) { this.initial = initial; } } 在持久化的过程中,姓名(Name)可以作为人(Person)的一个组件。需要注意的是:你应该为姓名的持久化属性定义getter和setter方法,但是你不需要实现任何的接口或申明标识符字段。 以下是这个例子的Hibernate映射文件: <!-- class attribute optional --> 人员(Person)表中将包括pid, birthday, initial, first和 last等字段。 就像所有的值类型一样, 组件不支持共享引用。 换句话说,两个人可能重名,但是两个Person对象应该包含两个独立的Name对象,只不过这两个Name对象具有“同样”的值。 组件的值可以为空,其定义如下。 每当Hibernate重新加载一个包含组件的对象,如果该组件的所有字段为空,Hibernate将假定整个组件为空。 在大多数情况下,这样假定应该是没有问题的。 组件的属性可以是任意一种Hibernate类型(包括集合, 多对多关联, 以及其它组件等等)。嵌套组件不应该被当作一种特殊的应用(Nested components should not be
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值