Hibernate学习总结(1)

这篇博客是Hibernate学习的第一部分,介绍了Hibernate的基本概念、ORM原理及其优势。详细讲述了如何入门Hibernate,包括下载jar包、引入开发包、创建实体和映射文件、配置核心文件,最后通过一个测试案例展示了Hibernate的操作流程。此外,还讲解了Configuration、SessionFactory、Session和Transaction等关键API的使用。
摘要由CSDN通过智能技术生成

Hibernate的概述

1.什么是Hibernate

Hibernate框架是当今主流的Java持久层框架之一,是一个开放源代码的ORM(Object Relational Mapping , 对象关系映射)框架,它对JDBC进行了轻量级的对象封装,使得Java开发人员可以使用面向对象的编程思想来操作数据库。
详见百度

2.ORM原理

因为Hibernate是ORM框架,所以需要说说ORM原理 ,所谓的ORM就是利用描述对象和数据库表之间映射的元数据,自动把Java应用程序应用程序中的对像,持久化到关系型数据库的表中。通过操作Java对象,就可以完成对数据库表的操作。ORM的原理如图所示
ORM原理

3.Hibernate具有的优势

Hibernate对JDBC访问数据库的代码做了轻量级的封装,大大简化了数据访问层繁琐的重复性代码,并且减少了内存消耗,加快了运行效率。
Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化了DAO(Date Access Object ,数据访问对象)层编码工作。
Hibernate的性能非常好,映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。
可扩展性强,由于源代码的开源以及API的开放,当本身功能不够用时,可以自行编码进行扩展。

Hibernate入门

1.下载Hibernate的jar包[具体网址]

(https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/)

点击第一个即可开始下载
下载完后解压后如图
第一个documentation文件夹存放的就是Hibernate的相关的文档,还有参考文档API。
第二个lib文件夹存放Hibernate表一和运行所一栏的JAR包,lib里面还有一个required包包含了运行Hibernate5项目必须的JAR包。
第三个project文件夹就是存放Hibernate各种相关的源代码

2.引入Hibernate的开发包

数据库驱动包

lib里required中全部的包

3.创建实体(持久化类)

持久化类是应用程序中的业务实体类,这里的持久化是指类的对象能够被持久化保存到数据库中。Hibernate使用普遍Java对象(Plain Old Java Object),即POJO的编程模式来进行持久化。POJO类中包含的是与数据库相对应的各个属性,这些属性通过getter和setter方法来访问,对外部
隐藏了内部的实现细节。

这里就创建一个实体包

public class Customer {
	private Long cid;
	private String cname;
	private String cphone;
	public Long getCid() {
		return cid;
	}
	public void setCid(Long cid) {
		this.cid = cid;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	public String getCphone() {
		return cphone;
	}
	public void setCphone(String cphone) {
		this.cphone = cphone;
	}

}

4.创建映射文件

实体类Customer目前还不具备持久化操作的能力,而Hibernate需要知道实体类Customer映射到数据库Hibernate中的哪个表,以及类中的哪个属
性对应数据库表中的哪个字段,这些都需要在映射文件中配置,
在实体类Customer所在的包中,需要创建一个名称为Customer.hbm.xml的映射文件,在该文件中定义了实体类Customer的属性是如何映射到
customer表的列上,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"Http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 建立类和表的一个映射关系: -->
<!-- 
	class标签:用来建立类和表的映射
			* name 属性:类中的全路径。
			* table 属性:表名(如果类名和表名是一致的,那么table属性可以省略不写)
			* catalog 属性:数据库名称,可以省略
 -->
<class name="domain.Customer" table="customer">
	<!-- 建立类中的属性与表中的主键的映射 -->
	<!-- 
		id标签:用来建立类中的属性与表中的主键字段对应
			* name 属性:类中的属性名
			* column 属性:表中字段名(如果类中的属性名和表中的字段名一致,那么可以省略不写)
			* length 属性:字段的长度
			* type 属性:类型。写Java数据类型,Hibernate数据类型(默认),SQL类型
	 -->

	<id name="cid" column="cid">
		<!-- 主键生成策略 -->
		<generator class="native"/>
	</id>
	
	<!-- 建立类中的普通属性与表中的字段的映射 -->
	<!-- 
		property标签:用来建立类中的普通属性与表中的字段对应
			后面的属性和id标签是一致的
	 -->
	
	<property name="cname" column="cname"/>
	<property name="cphone" column="cname"/>
</class>
</hibernate-mapping>

5.创建Hibernate的核心配置文件

Hibernate的映射文件反映了持久化类和数据库表的映射信息,而Hibernate的配置文件则主要用来配置数据库连接以及Hibernate运行时所需要的
各个属性的值。在项目的src下创建一个名称为hibernate.cfg.xml的文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-congifuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-congifuration>
<session-factory>
	<!-- 必要的配置信息:连接数据库的基本参数 -->
	<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
	<property name="hibernate.connection.url">jdbc:mysql:///hibernate_practice</property>
	<property name="hibernate.connection.username">root</property>
	<property name="hibernate.connection.password">****</property>
	
	<!-- Hibernate的属性 -->
	<!-- Hibernate的方言:作用,根据配置的方言生成相应的SQL语句 -->
	<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
	
	<!-- Hibernate显示SQL语句 -->
	<property name="hibernate.show_sql">true</property>
	<!-- Hibernate格式化SQL语句 -->
	<property name="hibernate.format_sql">true</property>
	<!-- Hibernate的hbm2ddl(数据定义语言:create drop alter ...)属性 -->
	<!-- 
		hbm2ddl.auto的取值
			* none		:不用Hibernate自动生成表。
			* create	:每次都会创建一个新的表。(测试)
			* create-drop	:每次都会创建一个新的表,执行程序结束后删除这个表(测试)
			* update	:如果数据库中有表,使用原来的表,如果没有表,创建一个新表,可以更新表的结构。
			* validate 	:只会使用原有的表,对映射关系进行校验。
	 -->
	 <property name="hibernate.hbm2ddl.auto">update</property>
	 
	 <!-- Hibernate加载映射 -->
	 <mapping resource="domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-congifuration>

上述代码中,首先进行了xml声明,然后是配置文件的dtd信息,该信息同样可以在核心包hibernate-core-5.0.7.Final.jar下的org.hibernate包中的hibernate-configuration-3.0.dtd文件中找到,只需要复制过来使用就可以了,不需要刻意去记忆
Hibernate配置文件的根元素是hibernate-configuration,该元素包含元素 session-factory,在session-factory元素中又包含多个property元素,这些property元素用来对Hibernate连接数据库的一些重要信息进行配置。上面的配置文件中,使用property元素配置了数据库的方言、驱动、URL、用户名、密码等信息。最后通过mapping元素的配置,加载出映射文件的信息
Hibernate配置文件的一些常用属性名称及用途,如下图

6.测试该Hibernate

写一个简单的测试Demo类

测试类需要先创建一个Configuration类的事例通过这个类来读取并解析配置文件hibernate.cfg.xml。然后创建一个SessionFactory读取解析映射文件信息,并将Configuration对象中的所有配置信息拷贝到SessionFactory内存中,然后打开session,让SessionFactory提供连接,开启事务,创建对象,并向对象中添加数据,通过session.save()方法完成向数据库中保存数据的操作。最后提交事务,并关闭资源。

	@Test
	public void fun1() {
	Configuration conf = new Configuration().configure();
	SessionFactory sf = conf.buildSessionFactory();
	Session session = sf.openSession();
	Transaction tx = session.beginTransaction();
	Customer c = new Customer();
	c.setCname("123");
	session.save(c);
	tx.commit();
	session.close();
}

运行后Console出现这说明成功


注意在运行前保证数据库服务MySQL是开启状态

Hibernate的相关API

1.Configuration:配置对象。

Configuration主要用于Hibernate框架加载映射文件
Configuration类的作用是对Hibernate进行配置,以及对它进行启动,在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration类在整个Hibernate项目中只扮演一个很小的角色,但它是启动hibernate时所遇到的第一个对象。
Configuration只存在于系统的初始化阶段,它将SessionFactory创建完成后,就完成了自己的使命
Hibernate通常使用Configuration config = new Configuration().configure();的方式创建实例,此种方式默认回去src下读取hibernate.cfg.xml配置文件。如果不想使用默认的hibernate.cfg.xml配置文件,而是使用指定目录下(或自定义)的配置文件,则需要向configure()方法中传递一个文件路径的参数,其代码下发如下:
Configuration config = new Configuration().configure(“xml文件位置”);
此种写法hibernate 会去指定位置查找配置文件,例如,想要使用src下config包中的hibernate.cfg.xml文件,只需将文件位置加入configure()中即可,其代码如下
Configuration config = new Configuration().configure("/config/hibernate.cfg.xml");
加载映射文件
Hibernate除了可以使用Configuration对象加载核心配置文件以外,还可以利用该对象加载映射文件。因为如何使用properties文件作为Hibernate的核心配置文件,其他的属性可以使用key=value的格式来设置,但是映射没有办法加载。这时这个对象就有了用武之地。可以在手动编写代码的时候去加载映射文件。
Configuration configuration = new Configuration().configure(“xml 文件位置”);
configuration.addResource(“cn/itcast/domain/Customer.hbm.xml”);

2.SessionFactory:session工厂对象

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象,这里用到了工厂模式,需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够。当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
它在Hibernate中起到一个缓冲区的作用,Hibernate可以将自动生成的SQL语句,映射数据以及某些可重复利用的数据放在这个缓冲区中。同时它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存。
SessionFactory 实例是通过Configuration对象获取的,其获取方法如下所示。
SessionFactory sessionFactory = config.buildSessionFactory();
SessionFactory具有以下特点:
1.它是线程安全的,它的同一个实例能够供多个线程共享
2.它是重量级的,不能随意的创建和销毁它的实例。
由于SessionFactory的这些特点,一般情况下,一个项目中只需要一个SessionFactory,只有当应用中存在多个数据源时,才为每个数据源建立一个SessionFactory实例。因此,在实际项目使用中,通常会抽出一个HibernateUtils的工具类,用来提供Session对象。
Hibernate工具类

public class HibernateUtils {

private static final Configuration configuration;
private static final SessionFactory sessionFactory;

static {
	//1.创建,调用空参构造
	configuration = new Configuration().configure();
	//2.根据配置信息,创建SessionFactory对象
	sessionFactory = configuration.buildSessionFactory();
}

//获得session => 获得全新session
public static Session openSession() {
	//3.获得session
	Session session = sessionFactory.openSession();
	 
	return session;
}

//获得session => 获得与线程绑定的session
public static Session getCurrentSession() {
	//3.获得session
	Session session = sessionFactory.getCurrentSession();
	
	return session;
}
}

3.Session

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)但需要注意的是Session对象是非线程安全的,同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session

Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,它的主要功能是为持久化对象提供创建、读取和删除的能力,所有持久化对象必须在session的管理下才可以进行持久化操作。
创建SessionFactory实例后,就可以通过它获取Session实例。获得Session实例有两种方式,一种是通过openSession()方法,另一种是通过getCurrentSession()方法。两种方法获取session的代码就像上面工具类一样。
这两种获取session实例方式的主要区别是,采用openSession方法获取Session实例时,SessionFactory直接创建一个新的Session实例,并且在使用完成后需要调用close方法手动关闭。而getCurrentSession方法创建的Session实例会被绑定到当前线程中,它在提交或回滚操作时会自动关闭。
Session是线程不安全的,多个并发线程同时操作一个Session实例时,就可能导致Session数据存取的混乱(方法内部定义和使用Session时,不会出现线程问题)。因此设计软件架构,应避免多个线程共享一个Session实例。同时它也是轻量级的,实例的创建和销毁不需要消耗太多的资源。它还有一个缓存,即Hibernate的一级缓存,这个缓存主要用于存放当前工作单元加载的对象。
在Session中提供了大量的常用方法,具体如下:
* save()、update()和saveOrUpdate()方法:用于增加和修改对象。
* dalete()方法:用于删除对象。
* get()和load()方法:根据主键查询。
* createQuery()和createSQLQuery()方法:用于数据库操作对象。
* createCriteria()方法:条件查询。

4.Transaction

Transaction
Transaction接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate的设计者自己写的底层事务处代理码。Transaction接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务,JTA中的UserTransaction、甚至可以是CORBA事务。之所以这样设计师能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
commit()方法:提交相关联的session实例。
rollback()方法:撤销事务操作。
Session执行完数据库操作后,要使用Transaction接口的commit()方法进行事务提交,才能真正的将数据操作同步到数据库中。发生异常时,需要使用rollback()方法进行事务回滚,以避免数据发送错误。因此,在持久化操作后,必须调用Transaction接口的commit()方法和rollback()方法。如果没有开启事务,那么每个Session的操作,都相当于一个独立的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值