configuration
//第一步:加载hibernate核心配置文件
// 在hibernate内封装对象
Configuration cfg = new Configuration();
cfg.configure();
这一步的操作会使得程序找到src下面的hibernate.cfg.xml文件,创建对象,吧配置文件放到对象里面,实际上就是加载核心配置文件
SessionFactory(重点)
1、使用configuration对象创建sessionFactory对象
1)创建SessionFactory对象的过程中所做的事情:
根据核心配置文件的数据库配置、映射文件配置部分到数据库中根据映射文件创建对应的表,此项功能的前提条件是在hibernate的核心配置文件hibernate.cfg.xml中配置如下语句:
<property name="hibernate.hbm2ddl.auto">update</property> <!-- 自动创建表 -->
比较重要的一点就是,sessionFactory对象的创建很耗资源:
如果采用如上的语句,并且我们在主程序里面加载SessionFactory的时候,每一次的运行都需要加载一次配置文件。导致程序运行的效率比较低。因为我们在创建sessionFactory过程中都要去检查是否已经创建了对应的表。
解决的办法是什么呢?
就是一般在一个hibernate操作中,一个项目只创建一个sessionFactory对象,就类似于ServletContext对象,一次创建就“存活”在整个程序运行的过程中。
具体的实现
1)编写一个工具类,用静态的代码块实现,这是因为静态代码块在类加载的时候创建,而且只创建一次
package cn.lzb.utils;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class SessionFactoryUtils
static SessionFactory seFactory = null;
static Configuration cfg = null;
static {
//1、加载核心配置文件
cfg = new Configuration();
cfg.configure();
//2、创建sessionFactory
seFactory = cfg.buildSessionFactory();
}
//构造方法返回sessionFactory
public static SessionFactory getSessionFactory() {
return seFactory;
}
}
运行类测试由本人原来示例中的 超简易版hibernate第一个程序实现 的HibernateDemo.java 更改为如下内容
package cn.lzb.hibernatetest;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.lzb.entity.User2;
import cn.lzb.utils.SessionFactoryUtils;
public class HibernateDemo {
@Test
public void testAdd() {
//第一步:加载hibernate核心配置文件
// 在hibernate内封装对象
//Configuration cfg = new Configuration();
//cfg.configure();
//第二步:创建SessionFactory对象
// 读取核心配置文件内容,根据映射关系在数据库中创建对应的表
//SessionFactory seFactory = cfg.buildSessionFactory();
SessionFactory seFactory = SessionFactoryUtils.getSessionFactory();
//第三步:使用SessionFactory工具类创建session对象
Session session = seFactory.openSession();
//第四步:开启事务
Transaction tx = session.beginTransaction();
//第五步:写具体的crud操作
User2 user = new User2();
user.setUname("zs");
user.setPassword("lzb");
user.setAddress("CQ");
//调用session的方法进行添加
session.save(user);
//第六步:提交事务
tx.commit();
//第七步:关闭事务
session.close();
seFactory.close();
}
}
值得注意的是:如果是在一个web项目中,SessionFactory是不需要像实例中的那样关闭的。采用本文 示例中的方式,当第一次使用完毕之后就关闭的话,第二次在调用的时候就无法再调用了,因为静态的代码块只执行一次
session(重点)
1、类似与于jdbc中的connection。对数据库的操作都是通过sesion里面的不同方法来实现crud操作
1)添加:save方法
2)修改:update
3)删除:delete方法
4)根据主键查询:load方法和get方法
5)用于数据库操作对象:createQuery()和createSQLQuery()
6)条件查询:createCriteria方法
等等
2、session对象是一个单线程对象,具体的含义是什么呢,就是不能共享使用。最简单的解释就是,我们手中的钱只能够让我们自己使用。在程序中的理解就是,类似于web中的session对象,当用户访问一个网站的时候,后台会创建一个session对象来跟踪一个用户,但是这个对象仅代表当前用户,其他的用户登录时依然需要重新创建session对象。在hibernate中的session对象虽然是与web的session是两个不同的概念,但是借此来解释也是很不错的例子。总结来说,hibernate的session对象有什么特点呢?
1)session对象不能共用,只能够自己使用
Traansaction事务对象
Transaction tx = session.beginTransaction();
在事务对象的操作过程中,必须要有两个事务的操作方法:
1)commit方法:事务的提交
2)rollback方法:事务的回滚
在以上的实例中,代码内容并不是很规范,例如没有异常的处理,但考虑到作为演示的目的,觉得已经达到了这样一个目标,故不作多余的赘述
在此对事务以及事务的四个特性进行简要的介绍
事务:就是应用程序中一系列的操作
事务的四大特性:
1)原子性:事务包含的一系列的操作中要么都完成,要么都不被成功执行。
2)一致性:事务执行的结果必须使得数据库从一个状态变成为另一个一致的状态。
3)隔离性:一个事务的执行不能收到其他事务执行的干扰,也就是说,一个事务执行的数据对象,对其他的事务而言是被隔离起来不可操作的。
4)持续性:一个事务一旦提交,那么其对数据库中数据的改变是永久有效的,接下来的其他事务的操作都对该事务的结果有任何的影响