Hibernate简要介绍

本文介绍Hibernate框架的优势及其基本工作原理,详细讲解了如何搭建Hibernate项目框架,包括配置文件的编写和实体映射文件的创建。此外,还介绍了通过Hibernate进行数据库操作的方法,以及Hibernate的核心接口和实体对象的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天对Hibernate的学习,我有了自己的一些认识,所以写下了我的理解,有不足之处还请多多指点!!!

Hibernate的优势      

       首先我们先了解一下Hibernate的优势。与JDBC相比,JDBC明显有很多缺点,无法直接面向对象;开发效率低;代码冗余 ;pstmtsetXX方法 ;方法参数冗余的getXX方法 ;如果POJO的属性很多,代码增加 ;重复性工作多。  而Hibernate 却很大程度上有了改进:

               1. Hibernate是 一个开发源代码的对象关系映射框架 ;

                2.对JDBC进行了非常轻量级的对象封装,简化JDBC 繁琐的编码 ;

                3.将JavaBean对象和数据库的表建立对应关系 。

Hibernate的工作原理
               
1.读取并解析配置文件   

                2.创建SessionFactory

                3.打开Session

                4.开始一个事物

                5.持久化操作

                6.提交事务

                7.关闭Session

持久化和ORM

持久化:数据模型(内存)《--存储模型(持久化设备),Java中说持久化,通常指的是使用SQL将数据存储在关系型数据库中。

ORM是持久化的一种解决方案,主要是把对象模型和关系型数据库关系模型映射起来,并且使用元数据对这些映射进行描述。
搭建项目框架编写hibernate配置文件、实体映射文件
                创建项目并导入jar
                创建Hibernate配置文件  
                                   用于配置数据库连接
                            运行时所需的各种属性
                            默认文件名为“hibernate.cfg.xml”
代码示例:
<?xml version='1.0' encoding='utf-8'?>
<!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>
		<!-- 数据库连接URL -->
		<property name="connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
		<!-- 数据库用户名  -->
		<property name="connection.username">oa</property>
		<!-- 数据库密码 -->
		<property name="connection.password">oa123</property>
		<!-- 数据库JDBC驱动类名 -->
		<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
		<!-- 数据库方言 -->
		<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
		<!-- ddl语句自动建表 -->
		<property name="hbm2ddl.auto">none</property>
		<!-- 是否输出Hibernate生成的SQL语句,开发阶段一般需要开启 -->
		<property name="show_SQL">true</property>
		<!-- 是否对输出SQL进行格式化 -->
		<property name="format_SQL">true</property>
		<!-- 连接池配置 -->
		<property name="hibernate.connection.provider_class">
			org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider
		</property>
		<!-- 这是C3P0随时准备好的最少的JDBC连接数量 -->
		<property name="hibernate.c3p0.min_size">5</property>
		<!-- 连接池中JDBC连接的最大数量 -->
		<property name="hibernate.c3p0.max_size">20</property>
		<!-- 超时周期,在它之后,闲置连接将从池中移除 -->
		<property name="hibernate.c3p0.timeout">300</property>
		<!-- 最多高速缓存100个预编译语句,该属性是使Hibernate获得较好性能的要素。 -->
		<property name="hibernate.c3p0.max_statements">100</property>
		<!-- 连接被自动验证前,以秒为单位的闲置时间 -->
		<property name="hibernate.c3p0.idle_test_period">3000</property>
		<!-- 注册ORM实体类映射文件-->
		<mapping resource="实体类映射文件路径" />
		…
	</session-factory>
</hibernate-configuration>


                 测试连接
代码示例:
public class HibernateTest {
	public static void main(String[] args) {
		//获取配置,默认读取classpath根目录下名为hibernate.cfg.xml的文件
		Configuration cfg = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
		//创建SessionFactory
		SessionFactory factory = cfg.buildSessionFactory(serviceRegistry); 
		//获取session
		System.out.println(factory.openSession());
	}
}


使用Hibernate完成数据增删改操作

                1.创建实体类

                2.创建和配置映射文件

代码示例:

<?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="org.ijob.bean.Seeker" table="ijob_seeker">
		<!-- 主键映射 -->
		<id name="id" type="string">
			<column name="id" length="32"></column>
			<generator class="uuid" />
		</id>
      <!—属性映射 -->
		<property name="email" type="string">
			<column name="email" length="100"></column>
		</property>
		<property name="password" type="string">
			<column name="password" length="20"></column>
		</property>
		
		<property name="name" type="string">
			<column name="name" length="10"></column>
		</property>
		<!—此处省略系列属性映射 -->
	</class>
</hibernate-mapping>


 

                3.主键映射

                               在实体类映射文件中,被映射的类必须定义对应数据库表的主键字段的属性。映射文件的<id>元素定义了该属性到数据库表主键字段的映射。

 

                4.主键生成策略

                                主键生成器generator是可选的,它用于指定实体对象的标识符(在表中称之为主键)生成策略。

       

                5.在主配置文件中添加实体映射文件路径

                              将映射文件的路径信息添加到hibernate.cfg.xml中。
                                 <mapping resource=“***/***/***.hbm.xml" />

 

                6.数据库操作

                7.单表增删改查

代码示例:

// 1、获取配置
	Configuration cfg = new Configuration().configure();
	ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
			.applySettings(cfg.getProperties()).buildServiceRegistry();
	// 2、创建SessionFactory
	SessionFactory factory = cfg.buildSessionFactory(serviceRegistry);
	// 3、获取session
	Session session = factory.openSession();
	Transaction tx = session.getTransaction();
	try {
		// 4、开启事务
		tx.begin();
		Seeker seeker = new Seeker();
		seeker.setEmail("abc@163.com");
		seeker.setPassword("abc");
		// 5、保存seeker对象
		session.save(seeker);
		// 6、提交事务
		session.getTransaction().commit();
	} catch (Exception e) {
		tx.rollback();
		e.printStackTrace();
	} finally {
		// 7、关闭session
		session.close();
	}
}


 

Hibernate核心接口
                Configuration接口
                             Configuration对象用来配置和引导
                SessionFactory接口
                             一个Hibernate应用从SessionFactory(会话工厂)里获得会话实例。
                             一般情况下,整个应用只有唯一的一个SessionFactory,它应该在应用初始化时被创建。
                HibernateUtil接口
                             编写一个工具类,将SessionFactory的实例设置为静态成员(只在内存中存在一份)并将其初始化放在静态初始化块中(只执行一次)。
                Session接口
                             Session(会话)接口是Hibernate应用使用的主要接口,它拥有操作持久化对象的一系列API,可用于管理(例如加载和保存)对象,因此我们也称之为持久化管理器
                             Session实例是轻量级的,创建与销毁的代价不昂贵,通常我们会为每个事务创建一个Session实例,并在使用后关闭它。
                Transaction接口
                              Transaction(事务)接口是对实际事务实现的一个抽象,这些实现包括JDBC事务或者JTA务等。
                              Transaction接口中主要定义了commit()rollback()两个方法,前者是提交事务的方法,后者是回滚事务的方法。
                Query与Criteria接口
                               Query(查询)接口允许在数据库上执行查询,并控制查询如何具体执行。查询使用HQLSQLQuery实例可用来绑定查询参数,限定查询返回的结果数,并且最终执行查询。
实体对象的三种状态
                瞬时状态(Transient)
                                 刚用new语句创建,还没有被持久化,且不处于Session的缓存中
                持久状态(Persistent)
                                 已经被持久化,且加入到Session的缓存中
                游离状态(Detached)
                                 已经被持久化,但不再处于Session的缓存中
关联映射
           1.单向多对一关联(many-to-one)
                            many的一端应持有one的一端的对象(引用)
                            映射文件体现多对一
                            关联操作
映射文件例:
<hibernate-mapping>
	<class name="org.ijob.bean.Resume" table="ijob_resume">
		<!—省略主键映射及属性映射 -->
		<!-- 多对一关联 -->
		<many-to-one name="seeker" class="org.ijob.bean.Seeker">       1
			<column name="seeker_id"></column>                 2
		</many-to-one>
	</class>
</hibernate-mapping>
                                                                                                            代码解析:
                                                                                                                        1、name为属性名,class为“one”端类名
                                                                                                                        2、外键列列名
                  2.单向一对多关联(one-to-many)
                              one的一端应持有many端的对象集合
                              映射文件体现一对多
                              关联操作
映射文件例:
<hibernate-mapping>
	<class name="org.ijob.bean.Seeker" table="ijob_seeker">
		<!—省略主键映射及属性映射 -->
		<set name="resumes" >                                                1
			<key column="seeker_id"></key>                           2
			<one-to-many class="org.ijob.bean.Resume"/>              3
		</set>
</class>
</hibernate-mapping>
                                                                                                            代码解析:
                                                                                                                        1、set集合节点适用于配置一对多关联关系, name属性指定one的一端对应属性名。
                                                                                                                        2、外键列列名。
                                                                                                                        3、class属性指定many端的全限定类名。
                   3.双向一对多/一对一关联
                                   双向一对多特别简单,就是同时配置了单向的一对多和单向的多对一。
                   4.多对多关联
                                   将多对多转换成两个一对多
                                   为中间表建立实体类及映射文件,两个端点和中间端分别建立双向一对多关联
如果中间表是联合主键:
<!-- 联合主键 -->
 
<composite-id>
	<!--同时表达这是外键-->
	<key-many-to-one name=“**” column=“***" class=“***" ></key-many-to-one>
	<key-many-to-one name=“**” column=“**" class=“**" ></key-many-to-one>
</composite-id>

 
 

 

 

 

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值