Java持久层之Hibernate:01_Hibernate入门

本文详细介绍了Hibernate框架的搭建过程,包括开发环境的配置、实体类的创建、映射关系的配置以及核心配置文件的设置。并通过一个具体的插入操作案例,展示了如何使用Hibernate进行数据库操作。

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


Hibernate概述

  • Hibernate框架应用在JavaEE三层结构中的DAO层框架:即持久层框架
  • 在DAO层里面对数据库CRUD操作:使用Hibernate实现CRUD操作:Hibernate底层代码就是JDBC:Hibernate对JDBC进行封装
  • 使用Hibernate好处:不需要写复杂的JDBC代码了,且不需要写SQL语句了
  • Hibernate是开源轻量级的持久层框架:不需要依赖其他jar包即可使用

ORM思想

  • Hibernate使用ORM思想对数据库进行CRUD操作
  • ORM:Object Relational Mapping:对象关系映射:让实体类和数据表中的记录一一对应
    (1)让实体类首先和数据表对应
    (2)让实体类成员变量(实例成员变量)和表里面字段对应
  • ORM框架操作数据进行CRUD操作:不需要直接操作数据表,而操作表对应的实体类对象
    在这里插入图片描述
  • 实体类是数据表之间的关联是通过配置文件来建立的

搭建Hibernate开发环境

  • 第一步:到jar包
    (1) Hibernate必须的jar包
    在这里插入图片描述
    (2) JPA相关的jar包
    在这里插入图片描述
    (3) 日志相关的jar包:应为使用Hibernate的时候,有日志信息输出,而Hibernate本身没有日志输出的jar包,需要导入其他的日志jar包
    在这里插入图片描述
    (4) 数据库驱动jar包
    在这里插入图片描述

  • 第二步:创建实体类
    (1)Hibernate要求实体类中必须有一个属性唯一的,即实体类中的成员变量(实例成员变量)对应表中的主键字段
    (2)使用Hibernate时候,不需要我们自己手动创建数据表了!Hibernate帮我们创建表:Hibernate根据我们的配置文件来创建数据表:当然手动创建数据表是可以的

package com.ycom.hibernate.entity;

// 实体类
public class User {
	// Hibernate要求:实体类中必须由一个唯一的属性
	private int uid;
	private String username;
	private String password;
	private String address;
	
	public int getUid() {
		return uid;
	}
	public void setUid(int uid) {
		this.uid = uid;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
}
  • 第三步:映射关系配置:配置实体类与数据表间的一一对应的关系:使用映射配置文件实现映射关系
    (1) 创建XML格式的映射配置文件:映射配置文件名称和位置没有固定要求!建议:在实体类所在包里面创建,名称为:实体类名称.hbm.xml,例如:User.hbm.xml
    在这里插入图片描述
    (2) 映射配置文件是XML格式,在配置文件中首先引入XML约束:DTD约束
    在这里插入图片描述
    (3) 配置映射关系:实体类与数据表之间的映射关系
    在这里插入图片描述
<?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属性:数据表名称
	-->
	<class name="com.ycom.hibernate.entity.User" table="t_user">
		
		<!-- id标签: 配置实体类中唯一属性与数据表中主键字段的对应关系
			name属性:实体类中唯一属性的属性名称
			column属性:数据表中主键字段的字段名称
		-->
		<id name="uid" column="uid">
			<!-- generator标签:配置数据表中主键生成策略
				class属性: 
					native:表示主键自增长
					uuid:表示生成128位的UUID
			-->
			<generator class="native"></generator>
		</id>
		
		<!-- property标签:配置实体类中其他属性与数据表中其他字段的对应关系
			name属性:实体类中其他属性的属性名
			column属性:数据表中其他字段的字段名称
		-->
		<property name="username" column="username"></property>
		<property name="password" column="pwd"></property>
		<property name="address" column="address"></property>
	</class>
</hibernate-mapping>
  • 注意:
    (1)Hibernate要求实体类有一个属性唯一值
    (2)Hibernate要求数据表中有字段作为唯一值

  • 第四步:创建核心配置文件
    (1)核心配置文件格式XML,但是核心配置文件名称和位置是固定的:位置必须在src目录下名称必须为hibernate.cfg.xml
    (2)引入DTD文件
    (3)Hibernate操作过程中,只会加载核心配置文件,不会加载其他配置文件,例如不会加载映射配置文件:解决方案:将映射配置文件配置到核心配置文件中
    在这里插入图片描述


Hibernate的配置文件

  • Hibernate的配置文件的目的是为了解耦
  • Hibernate的配置文件主要有两大类:核心配置文件 + 映射配置文件

核心配置文件

  • 核心配置文件名称和位置是固定的
    (1)位置:src目录下
    (2)名称:hibernate.cfg.xml
  • 在核心配置文件中有三类配置:数据库信息、Hibernate信息、映入映射配置文件
  • 第一部分:配置数据库信息:必须的
  • 第二部分:配置Hibernate信息:可选的
  • 第三部分:把映射配置文件放到核心配置文件中:必须的
<?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>
		<!-- 第一部分:配置数据库信息:必须的 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- mysql: 配置本地数据库, 主机是localhost,端口号3306,写全了如下
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate01</property>
		-->
		<property name="hibernate.connection.url">jdbc:mysql:///hibernate01</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		<!-- ===================================================================================== -->
		
		
		<!-- 第二部分:配置Hibernate信息 -->
		<!-- 输出底层SQL语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 输出底层SQL语句:格式化后输出 -->
		<property name="hibernate.format_sql">true</property>
		<!-- Hibernate可以帮我们创建数据表:但是Hibernate不会帮我们创建数据库
			要想Hibernate帮我们创建数据表的前提:需要做如下的配置
			update:如果表已经存在则更新表; 如果表不存在则创建之
		-->
		<property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 配置数据库方言
			在数据库中实现分页:
				在MySQL数据库中只能使用limit关键字,不能使用rownum
				在Oracle数据库中只能使用rownum,不能使用limit关键字
			配置了方言之后,可以让Hibernate框架识别不同的数据库的自己特有的SQL语句
		-->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- ===================================================================================== -->
		
		<!-- 第三部分:把映射配置文件引入到核心配置文件中:必须的
			包名即目录结构
		-->
		<mapping resource="com/ycom/hibernate/entity/User.hbm.xml"/>
	</session-factory>	
</hibernate-configuration>

映射配置文件

  • 映射配置文件名称和位置没有固定要求
  • 映射配置文件中,标签name属性值写与实体类相关的内容
    (1)class标签的name属性值是实体类的权限定类名
    (2)id标签和property标签的name属性写实体类的属性名(实体类中的属性与成员变量不是一回事:属性不一定非得有成员变量与之对应)
    在这里插入图片描述
  • id标签和property标签,column属性是可以省略的:column属性省略,那么column属性值就与name属性值相同
  • property标签中的type属性:指定Hibernate在生成表时指定字段的类型:一般情况下都是使用自动对应类型:所以type属性一般不用

Hibernate入门案例

  • Hibernate操作的基本步骤:
    (1)第一步:加载Hibernate核心配置文件
    (2)第二步:创建SessionFactory对象
    (3)第三步:创建Session对象
    (4)第四步:开启事务
    (5)第五步:对数据库进行CRUD操作
    (6)第六步:关闭事务:提交事务或回滚事务
    (7)第七步:释放资源

实现插入操作

package com.ycom.hibernate.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.ycom.hibernate.entity.User;

public class HibernateTest {

	@Test
	public void testInsert() {
		// 第一步: 加载Hibernate核心配置文件hibernate.cfg.xml
		Configuration cfg = new Configuration();
		cfg.configure();
		
		// 第二步:创建SessionFactory对象
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		
		// 第三步:创建Session对象
		Session session = sessionFactory.openSession();
		
		// 第四步:开启事务
		Transaction tx = session.beginTransaction();
		
		// 第五步:进行CRUD操作:这里是插入操作
		User user = new User();
		user.setUsername("kitty");
		user.setPassword("123456");
		user.setAddress("USA");
		session.save(user); // 向数据库服务器发送了SQL语句
		
		// 第六步:关闭事务: 在这里直接提交事务即可
		tx.commit();
		
		// 第七步:释放资源
		session.close();
		sessionFactory.close();
	}
}

在这里插入图片描述

  • 使用Hibernate向数据库中插入数据的流程:
    在这里插入图片描述

Hibernate核心API

  • Hibernate核心类:
    (1)Configuration
    (2)SessionFactory
    (3)Session
    (4)Transaction

Configuration

Configuration cfg = new Configuration();
cfg.configure();
  • 到src目录下找到名称为hibernate.cfg.xml的配置文件,创建对象,把核心配置文件放到对象里面

SessionFactory(☆☆☆☆☆)

  • 使用Configuration对象创建SessionFactory对象:在创建SessionFactory对象的过程中所做的事情:

(1) 根据核心配置文件中的数据库配置部分Hibernate信息部分以及映射配置文件部分,根据映射关系进行数据表的创建:但是前提,必须在核心配置文件中有如下的配置

<property name="hibernate.hbm2ddl.auto">update</property>

(2) 在创建SessionFactory过程中,如果在核心配置文件中配置了创建表的属性,那么会创建表,这个过程是特别消耗资源的:所以 在Hibernate操作中,建议一个项目一般只创建一个SessionFactory对象:可以考虑单例设计模式

package com.ycom.hibernate.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * 使用单例模式得到SessionFactoty对象
 * 
 * @author Administrator
 *
 */
public class HibernateUtils {
	private static final Configuration cfg;
	private static final SessionFactory sessionFactoty;
	
	static {
		// 加载核心配置文件
		cfg = new Configuration();
		cfg.configure();
		sessionFactoty = cfg.buildSessionFactory();
	}
	
	/**
	 * 返回SessionFactoty实例对象
	 * @return
	 */
	public static SessionFactory getSessionFactory() {
		return sessionFactoty;
	}
}

Session(☆☆☆☆☆)

  • Session类似于JDBC中的Connection
  • 调用Session类中的不同方法实现对数据库的CRUD操作
    (1)添加:save()方法
    (2)删除:delete()方法
    (3)修改:update()方法
    (4)查询:根据id查询的get()方法
  • Session对象必须是多例对象,即单线程对象:Session对象不同共用,只能自己使用

Transaction

// 开启事务
Transaction tx = session.beginTransaction();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值