|-- 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());
Configuration cf=new Configuration();
cf.configure();
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());
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");
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对象,有了就拿,没有就建新的。
<property name="current_session_context_class">thread</property>
@Test
public void testTeacher() {
Teacher t = new Teacher();
t.setName("li");
t.setTitle("high");
Session session = sf.getCurrentSession();
session.beginTransaction();
session.save(t);
}
五、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()等