Hibernate学习笔记(一) — hibernate的配置文件简介与执行原理

一、初识Hibernate

1.JDBC的缺点:

1).编写代码的时候过于繁琐,try和catch比较多2).没有做数据缓存 3).不是面向对象编程 4).sql语句固定,可移植性差

JDBC的优点:效率比较高

2.Hibernate优点

1).完全面向对象编程 2).hibernate的缓存很牛的,一级缓存,二级缓存,查询缓存3).跨平台性强

4).使用场合多应用于企业内部的系统

Hibernate缺点

1).效率低 2).表中的数据如果在千万级别,则hibernate不适合 3).如果表与表之间的关系特别复杂,则hibernate也不适合

3.ORM

学习Hibernate,首先要先了解ORM(Object/Relation Mapping),对象关系映射,主要思想是:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作

ORM 采用 元数据来描述对象-关系映射细节,元数据通常采用XML格式,并且存放在专门的对象-关系映射文件中

4.Hibernate开发步骤图

Hibernate学习笔记(一) — hibernate的配置文件简介与执行原理_第1张图片


二、Hibernate的配置文件

1.hibernate.cfg.xml与xxx.hbm .xml的书写

告诉hibernate连接数据库的信息,用的什么样的数据库(方言),根据

持久化类和映射文件生成表的策略

<hibernate-configuration>
	<session-factory name="foo">

		<property name="hibernate.dialect"><![CDATA[org.hibernate.dialect.MySQLDialect]]></property>
		<property name="hibernate.connection.driver_class"><![CDATA[com.mysql.jdbc.Driver]]></property>
		<property name="hibernate.connection.url"><![CDATA[jdbc:mysql:///hibernate1]]></property>
		<property name="hibernate.connection.username"><![CDATA[root]]></property>
		<property name="hibernate.connection.password"><![CDATA[root]]></property>
		<!-- 是否显示sql语句 -->
		<property name="show_sql">true</property>
		<!--是否格式化sql语句-->
		<property name="format_sql">true</property>
		<!--生成表的策略,通常是update-->
		<property name="hbm2ddl.auto">update</property>
		<!--添加映射文件-->
		<mapping resource="cn/xxx/User.hbm.xml"/>

	</session-factory>
</hibernate-configuration>


<hibernate-mapping package="cn.cil.domain">
	
	<class name="User" table="USERS" >
	<!--id 主键,column是数据表中对应的列名 -->
		<id name="id" type="java.lang.Integer">
			<column name="u_id"/>
			<generator class="native"/><!-- 主键的增长策略 -->
		</id>
		<!--type:该属性对应的类型,该类型可分为Hibernate类型与java类型-->
		<property name="name" type="java.lang.String">
			<column name="NAME"/>
		</property>
		<!--hibernate类型为type="string"-->
		<property name="age" type="java.lang.Integer">
			<column name="AGE"/>
		</property>
		
	</class>

</hibernate-mapping>

在hibernate内部,有一张类型对应表,这张表中有如下的映射关系:

Hibernate学习笔记(一) — hibernate的配置文件简介与执行原理_第2张图片

故书写Java类型的方式效率比较高,hibernate类型的书写方式比较简单


2.hibernate.cfg.xml的加载

public class HibernateUtils {

	private static SessionFactory factory;
	static{
		factory = new Configuration()//
		//这种方式需要注意,hibernate的配置文件名必须是hibernate.hbm.xml,
		//且必须放classpath目录下
				.configure()//
				.buildSessionFactory();
		//new Configuration().configure(xxx)可以指定配置文件的路径,配置文件可以随意放
	}
	public static SessionFactory getSessionFactory(){
		return factory;
	}
	public static Session openSession(){
		return factory.openSession();
	}

}

3、SessionFactory接口

1).hibernate中的配置文件、映射文件、持久化类的信息都在sessionFactory中

2).sessionFactory中存放的信息都是共享的信息

3).sessionFactory是线程安全的

4).一个hibernate框架sessionFactory只有一个

5).sessionFactory是一个重量级别的类,很消耗资源

4、Session接口

Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。此对象的生命周期很短。Session对象有一个一级缓存,显式执行flush之前,所有的持久层操作的数据都缓存在session对象处。相当于JDBC中的 Connection

1).得到了一个session,相当于打开了一次数据库的连接

2).在hibernate中,对数据的crud操作都是由session来完成的

5、生成数据表

public class SessionfatoryTest {

	@Before
	public void init(){
		SessionFactory factory =  HibernateUtils.getSessionFactory();
	}
	@Test
	public void test(){
		
	}
}
sessionFactory初始化后,对应的数据表也就生成了

6、Transaction(事务)

代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,且hibernate中的事务默认不是自动提交的


设置了connection的setAutoCommit为false, 只有产生了连接,才能进行事务的操作。所以只有有了session以后,才能有transaction

public class SessionfatoryTest {
	SessionFactory factory;
	Session session ;
	Transaction transaction;
	@Before
	public void init(){
		factory =  HibernateUtils.getSessionFactory();
		session = factory.openSession();
		transaction = session.beginTransaction();
	}
	@Test
	public void test(){
		User user = new User();
		user.setAge(10);
		user.setName("A");
		session.save(user);
	}
	
	@After
	public void destory(){
		transaction.commit();
		session.close();
		
	}
}
7、Hibernate的执行流程
Hibernate学习笔记(一) — hibernate的配置文件简介与执行原理_第3张图片

8.内部执行原理图









你可能感兴趣的:(Hibernate学习笔记(一) — hibernate的配置文件简介与执行原理)