目录
- 目录
- Hibernate入门
- 第一个Hibernate程序
- 实现数据库操作
- Hibernate配置文件详解
- Hibernate映射配置文件
- Hibernate核心配置文件
- Hibernate的核心API
- Configuration
- SessionFactory重点
- Session重点
- Transaction
Hibernate入门
第一个Hibernate程序
第一步 搭建Hibernate环境
(1)创建一个Java(或Java Web)工程项目;
(2)导入Hibernate的jar包;
注:除此之外,在使用Hibernate的时候,有日志信息的输出,而Hibernate本身没有包含日志输出的jar包,需要我们额外导入其他日志相关的jar(log4j、slf4j-api、slf4j-log4j12);同时还需要mysql驱动的jar包。(这里图省事还木有导入日志相关的包)
第二步 创建实体类
注:使用Hibernate的时候,不需要我们自己手动创建表,Hibernate会帮把表创建出来。
如:User.java
package com.wm103.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
(2)在配置文件中引入xml约束
- 在Hibernate中引入的约束是dtd约束(约束有dtd和schema格式)
<?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 表示该xml的根标签。
(3)配置映射关系
如: User.hbm.xml
<?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>
<!--
1. 配置类和表对应
class标签
name属性:实体类全路径
table属性:数据库中对应表的名称
-->
<class name="com.wm103.entity.User" table="t_user">
<!--
2. 配置实体类id和表id对应
Hibernate要求实体类有一个属性唯一值;
Hibernate要求表有字段作为唯一值。
-->
<!--
id标签
name属性:实体类中作为唯一标识的属性的名称
column属性:生成的表字段名称
-->
<id name="uid" column="uid">
<!--
设置数据库表中ID的增长策略
native:生成表的id是主键自动增长的。
-->
<generator class="native"/>
</id>
<!--
3. 配置实体类中的其他属性与表字段对应
property标签
name属性:实体类属性名称
column属性:生成表字段名称
-->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>
第四步 创建Hibernate的核心配置文件
(1)在src目录下创建Hibernate核心配置文件 hibernate.cfg.xml
核心配置文件的格式为xml,且文件名称和位置是固定的。
- 位置:必须在src目录下面
- 名称:必须为hibernate.cfg.xml
(2)为配置文件引入dtd文件
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
其中 hibernate-configuration 表示该xml的根标签。
注:Hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载,需要在核心配置文件中进行设置。
(3)配置hibernate.cfg.xml中的信息
- 配置数据库信息
<!-- **配置数据库信息(必须)** -->
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&characterEncoding=UTF-8</property>
- 配置hibernate信息
<!-- **配置hibernate信息(可选)** -->
<!--
配置数据库方言,如:
在MySQL中实现分页功能,需要使用到关键字limit,该关键字只能在MySQL中使用;
在Oracle数据库中则使用rownum实现分页功能。
以下配置是让Hibernate框架识别不同数据库各自特有的语句。
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property><!-- 输出底层SQL语句 -->
<property name="format_sql">true</property><!-- 格式化底层SQL语句 -->
<!--
Hibernate需要我们进行配置后才会帮我们自动创建对应的表。
update:如果已存在表,则更新表,如果没有,则进行创建。
-->
<property name="hbm2ddl.auto">update</property>
- 把映射文件放到核心配置文件中
<!-- **把映射文件放到核心配置文件中(必须)** -->
<mapping resource="com/wm103/entity/User.hbm.xml"/>
如: hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- **配置数据库信息(必须)** -->
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&characterEncoding=UTF-8</property>
<!-- **配置hibernate信息(可选)** -->
<!--
配置数据库方言,如:
在MySQL中实现分页功能,需要使用到关键字limit,该关键字只能在MySQL中使用;
在Oracle数据库中则使用rownum实现分页功能。
以下配置是让Hibernate框架识别不同数据库各自特有的语句。
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property><!-- 输出底层SQL语句 -->
<property name="format_sql">true</property><!-- 格式化底层SQL语句 -->
<!--
Hibernate需要我们进行配置后才会帮我们自动创建对应的表。
update:如果已存在表,则更新表,如果没有,则进行创建。
-->
<property name="hbm2ddl.auto">update</property>
<!-- **把映射文件放到核心配置文件中(必须)** -->
<mapping resource="com/wm103/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
实现数据库操作
第一步 加载Hibernate核心配置文件
第二步 创建SessionFactory对象
第三步 使用SessionFactory对象创建session对象
第四步 开启事务
第五步 编写具体逻辑CRUD操作
第六步 提交事务
第七步 关闭资源
如: HibernateDemo.java
package com.wm103.hibernatetest;
import com.wm103.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
/**
* Created by DreamBoy on 2017/5/19.
*/
public class HibernateDemo {
@Test
public void testAdd() {
// **第一步** 加载Hibernate核心配置文件
// 自动到src下面寻找hibernate.cfg.xml配置进行加载,封装成对象
Configuration cfg = new Configuration();
cfg.configure();
// **第二步** 创建SessionFactory对象
// 读取hibernate核心配置文件内容,创建sessionFactory
// 在这个过程中,会根据配置好的映射关系,在对应的数据库中将表创建出来
SessionFactory sessionFactory = cfg.buildSessionFactory();
// **第三步** 使用SessionFactory对象创建session对象
// 类似JDBC中的Connection对象
Session session = sessionFactory.openSession();
// **第四步** 开启事务
Transaction tx = session.beginTransaction();
// **第五步** 编写具体逻辑CRUD操作
User user = new User();
user.setUsername("梦小白");
user.setPassword("123");
user.setAddress("China");
session.save(user);
// **第六步** 提交事务
tx.commit();
// **第七步** 关闭资源
session.close();
sessionFactory.close();
}
}
Hibernate配置文件详解
Hibernate映射配置文件
- 映射匹配文件的名称和位置没有固定的要求,但是一般将该配置文件放置同需要映射的实体类相同的包下;
- 映射配置文件中标签的name属性,属性值与实体类相关,其中:
(1)class标签的name属性值为实体类的全路径;
(2)id标签和property标签的name属性值为实体类某个属性的名称。 - id标签和property标签,column属性可以省略,不设置,这个时候,column属性的默认值与name属性值相同;
- property标签还有另外一个属性type属性,设置生成表字段的类型。不设置该属性时,Hibernate会根据实体类属性的类型自动确定表字段的类型。
Hibernate核心配置文件
核心配置文件名称和位置是固定的,名称为hibernate.cfg.xml
,位置在src目录下。
配置内容以及要求如下:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- **配置数据库信息(必须)** -->
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&characterEncoding=UTF-8</property>
<!-- **配置hibernate信息(可选)** -->
<!--
配置数据库方言,如:
在MySQL中实现分页功能,需要使用到关键字limit,该关键字只能在MySQL中使用;
在Oracle数据库中则使用rownum实现分页功能。
以下配置是让Hibernate框架识别不同数据库各自特有的语句。
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property><!-- 输出底层SQL语句 -->
<property name="format_sql">true</property><!-- 格式化底层SQL语句 -->
<!--
Hibernate需要我们进行配置后才会帮我们自动创建对应的表。
update:
-->
<property name="hbm2ddl.auto">create</property>
<!-- **把映射文件放到核心配置文件中(必须)** -->
<mapping resource="com/wm103/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Hibernate的核心API
Configuration
// **第一步** 加载Hibernate核心配置文件
// 自动到src下面寻找hibernate.cfg.xml配置进行加载,封装成对象
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory(重点)
SessionFactory是一个线程安全的Session工厂类,能为不同的线程生成不同的Session。SessionFactory维护着Session相关的资源,包括数据库连接池等、缓存数据等。
1. 通过使用configuration对象来创建SessionFactory对象,在创建过程中,如果核心配置文件配置了自动创建表的功能,如:
<!--
Hibernate需要我们进行配置后才会帮我们自动创建对应的表。
update:
-->
<property name="hbm2ddl.auto">create</property>
,则Hibernate会根据核心配置文件中的数据库和映射文件的配置,根据映射关系,在数据库中创建对应的表。
2. 创建sessionFactory对象过程中,非常耗资源(因为Hibernate需要检查实体类与数据库中表的映射情况,甚至需要创建或更新表)。因此**在Hibernate操作中,建议一个项目一般只创建一个sessionFactory对象。
实现方式如下:
(静态代码快在类加载时执行,且执行一次。)
package com.wm103.utils;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* Created by DreamBoy on 2017/5/19.
*/
public class HibernateUtil {
// 单态模式的SessionFactory
private static final SessionFactory sessionFactory;
static {
Configuration cfg = new Configuration();
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
使用:
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session(重点)
- 这里的session对象类似于JDBC中的Connection对象;
- 调用session对象中的不同方法可以实现CRUD操作:
(1)添加:save方法;
(2)修改:update方法;
(3)删除:delete方法;
(4)查询:根据id查询的get方法; - session对象
Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,它的主要功能是为持久化对象提供创建、读取和删除的能力,所有持久化对象必须在session的管理下才可以进行持久化操作。
Session代表用户的一次操作。Session的生命周期很短,在操作开始时通过SessionFactory.openSession()生成,在操作结束时通过执行session.close()
关闭。Session维护着Session相关的资源,包括Transaction、当前数据库连接等。
Session是线程不安全的,多个并发线程同时操作一个Session实例时,就可能导致Session数据存取的混乱(方法内部定义和使用Session时,不会出现线程问题)。因此设计软件架构时,应避免多个线程共享一个Session实例。同时它也是轻量级的,实例的创建和销毁不需要消耗太多的资源。它还有一个缓存,即Hibernate的一级缓存,这个缓存主要用于存放当前工作单元加载的对象。
Transaction
- 开启事务
Transaction tx = session.beginTransaction();
- 事务的提交和回滚
tx.commit();
tx.rollback();
- 事务的特性
- 原子性
- 一致性
- 隔离性
- 持久性