文章目录
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();