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();//释放资源
}
}