Hibernate 框架入门(一)
1. SSH
- Web 层: Struts2
- 业务层: Spring
- 持久层: Hibernate
2. Hibernate 概述
概述
- Hibernate 是一个对象关系映射框架(ORM 框架);
- 对 JDBC 访问数据库的代码做了封装,简化了开发;
- 可以通过操作对象的方式来操作数据库表记录;
ORM(对象关系映射)
- O: 面向对象领域的 Object (JavaBean 对象)
- R: 关系数据库领域的 Relational (表的结构)
- M: 映射 Mapping (XML 的配置文件)

3. 搭建开发环境
3.1 Jar 包
- MySql 驱动包
- Hibernate 框架目录下的 required 下的所有包
- 日志 jar包(log4j, slf4j-api, slf4j-log4j12)
3.2 创建类(JavaBean)与表结构的映射
- 一般该映射文件存储在 JavaBean 所在的包下;
- 默认的命名规则:
实体类名.hbm.xml; - 配置本地文件,显示编写配置文件时的提示(见下图);
- 有多少个JavaBean 类就需要编写多少个映射配置文件;
- JavaBean中,成员变量不使用基本数据类型,而使用包装类;因为未赋值的情况,基本数据类型默认为0, 而
包装类默认为 null;

// Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
// 该条约束可以在 Libraries/web app Libraries/hibernate-core/org.hibernate/
// 最底部的 hibernate-mapping-3.0.dtd 中找到
<!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="cn.itheima.domain.Customer" table="cst_customer">
// name 为 JavaBean 类中的属性
// column 为表结构的字段
<id name="cust_id" column="cust_id">
// 主键的生成策略
<generator class="native"/>
</id>
// 配置其他属性
<property name="cust_name" column="cust_name"/>
<property name="cust_user_id" column="cust_user_id"/>
<property name="cust_create_id" column="cust_create_id"/>
...
</class>
</hibernate-mapping>
3.3 编写 Hibernate 核心的配置文件
- 存储在 src 目录下,名称固定:
hibernate.cfg.xml;
// hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
// 该条约束可以在 Libraries/web app Libraries/hibernate-core/org.hibernate/
// 最底部的 hibernate-configuration-3.0.dtd 中找到
<!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 标签, 一个数据库对应一个 SessionFactory 标签
<session-factory>
// 必须要配置的参数有 5 个, 四大参数和数据库方言
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/hibernate_day01
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
// 数据库方言(必须配置)
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
// mysql的版本为 5.5 时, 方言需要设置为 org.hibernate.dialect.MySQL5Dialect
//可选配置
// 在控制台显示 SQL 语句
<property name="hibernate.show_sql">true</property>
// 在控制台格式化输出 SQL 语句,提高可读性
<property name="hibernate.format_sql">true</property>
// 生成数据库的表结构(通过映射转成 DDL 语句)
// update: 如果没有表结构,创建表结构; 如果存在,不创建,只添加数据 (也可以向表中增加列)
// create: 每次都会创建一个新的表(测试的时候使用)
// create-drop: 每次都会创建一个新的表, 当执行结束之后,将创建的这个表删除(测试时候使用)
// validate: 校验! 如果有表,使用原来的表,同时校验映射文件与表中字段是否一致; 如果不一致,就会报错
<property name="hibernate.hbm2ddl.auto">update</property>
// 引入映射配置文件
<mapping resource="cn/itheima/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
3.4 编写 Hibernate 入门代码
// 保存客户信息
public class Demo{
public void testSave(){
/*
* 1. 加载核心配置文件
* 2. 创建 SessionFactory 对象, 用于生成 Session 对象
* 该 Session 对象是由 Hibernate 框架提供的
* 3. 创建 Session 对象
* 4. 开启事务
* 5. 编写保存客户信息代码
* 6. 提交事务
* 7. 释放资源
*/
// 1. 加载配置文件
Configuration config = new Configuration();
// 默认加载 src 目录下的 hibernate.cfg.xml 配置文件
config.cofigure();
// 2. 创建 SessionFactory 对象
SessionFactory factory = config.buildSessionFactory();
// 3. 创建 session 对象
Session session = factory.openSession();
// 4. 开启事务
Transaction tr = session.beginTransaction();
// 5. 编写保存用户信息代码
Customer c = new Customer();
// 因为主键已经设置为自动增长,所以不必再设置主键(cust_id)的值
c.setCust_name("张三");
c.setCust_level("2");
c.setCust_phone("110");
// 保存数据, 操作对象就相当于操作数据库的表结构
session.save(c);
// 6. 提交事务
tr.commit();
// 7. 释放资源
session.close();
factory.close();
}
}
4. Hibernate 的配置文件详解
4.1 映射配置文件, 即Customer.hbm.xml
- <class> 标签, 用来将类与数据库表建立映射关系.
- name 属性: 类的全路径;
- table 属性: 表名(如果类名与表名一致,table 属性可以省略);
- catalog 属性: 数据库的名称,基本上都不会写;
- <id> 标签, 用来将类中的属性和表中的主键建立映射, id标签就是用来配置主键的.
- name 属性: 类中的属性名;
- column 属性: 表中的字段名. (如果类中的属性名和表中的字段名一致, 那么 column 可以省略);
- length 属性: 字段的长度. 如果数据库已经创建好了,那么 length 可以不写; 如果没有创建好,
生成表结构时, length 最好指定;
- <property> 标签, 用来将类中的普通属性和表中的字段建立映射.
- name 属性, 类中的属性名;
- column 属性, 表中的字段名;
- length 属性, 数据长度;
- type 属性, 数据类型(一般都不需要编写,如果写需要按照规则来编写)
- Hibernate 的数据类型:
type=string; - Java 的数据类型:
type=java.lang.String; - 数据库字段的数据类型(使用子标签):
<column name="列名" sql-type="varchar"></column>
- Hibernate 的数据类型:
4.2 核心配置文件
- 核心配置文件可以使用
.properties的配置文件- 缺点: 不能加载映射的配置文件,需要手动编写代码去加载;
- 因此,开发基本使用 XML 文件的形式.
5. Hibernate 常用的接口和类
5.1 Configuration 类
- Configuration 对象用于配置并启动 Hibernate;
- Hibernate 应用通过该对象来获得对象-关系映射文件中的元数据, 以及动态配置 Hibernate 的属性,
然后创建 SessionFactory 对象; - 简单说, 加载 Hibernate 的配置文件,可以获取 SessionFactory 对象;
// Hibernate 支持 xml 和 properties 类型的配置文件, 在开发中基本都使用 XML 配置文件
// 如果使用 properties 文件
Configuration config = new Configuration(); // 这样就可以加载配置文件
// 手动加载映射文件
config.addResource("cn/itheima/domain/Customer.hbm.xml");
// 如果使用 XML 文件
Configuration config = new Configuration();
config.configure(); // 需要使用这句话, 才算加载配置文件
// 简写格式
Configuration config = new Configuration().configure();
5.2 SessionFactory 接口

- SessionFactory 是生成 Session 对象的工厂类;
- SessionFactory 的特点:
- 由 Configuration 通过加载配置文件创建该对象;
- SessionFactory 对象中保存了当前数据库配置信息和所有映射关系以及预定义的 SQL 语句.
同时, SessionFactory 还负责维护 Hibernate 的二级缓存;缓存预定义 SQL 语句是为了提高效率; - 一个 SessionFactory 实例对应一个数据库,应用从该对象中获得 Session 实例;
- SessionFactory 是线程安全的,意味着它的一个实例可以被应用的多个线程共享;
- SessionFactory 是重量级的,意味着不能随意创建或销毁它的实例.
- SessionFactory 需要一个较大的缓存,用来存放预定义的 SQL 语句及实体的映射信息. 另外,可以
配置一个缓存插件,这个插件被称之为 Hibernate 的二级缓存,被多线程所共享.
- 一般一个应用使用一个 SessionFactory, 并且最好是在应用启动时,就完成初始化.
// 编写 HibernateUtil 的工具类
public class HibernateUtil {
public static final Configuration CONFIG;
public static final SessionFactory FACTORY;
// 编写静态代码块
static{
// 加载 XML 的配置文件
CONFIG = new Configuration().configure();
// 构造工厂
FACTORY = CONFIG.buildSessionFactory();
}
// 从工厂中获取 session 对象
public static Session getSession(){
return FACTORY.openSession();
}
}
5.3 Session 接口
- 概述
- Session 称之为持久化管理器,它提供了和持久化有关的操作,比如添加,修改,删除,加载和查询实体对象;
- Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心;
- 所有的持久化对象必须在 session 的管理下才可以进行持久化操作;
- 持久化类与 Session 关联起来后就具有了持久化的能力;
- 特点
- Session 是线程不安全的,应避免多个线程使用同一个 Session 实例;
- Session 是轻量级的,它的创建和销毁不会消耗太多的资源.应为每次客户请求分配独立的 Session 实例;
- Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久化操作的数据都缓存在 session 对象中.
- 常用方法
save(obj): 保存;delete(obj): 删除; 删除之前,应该先查询是否存在;get(Class clazz, Serializable id): 通过主键查询一条记录;
clazz 表示要查询的 JavaBean 的 class 对象, id 表示主键的值;update(obj): 修改, 修改之前,应该先查询;saveOrUpdate(obj): 保存或者修改(如果没有数据,保存;如果有,修改数据);createQuery(): HQL 语句的查询方式;
5.4 Transaction 接口
- Transaction 是事务的接口.
- 常用方法
commit(): 提交事务;rollback(): 回滚事务;
- 特点
- Hibernate 框架默认情况下事务不自动提交,需要手动提交事务;
- 如果没有开启事务,那么每个 Session 的操作,都相当于一个独立的事务;
参考资料
Hibernate 框架入门(一)的更多相关文章
- Hibernate框架入门
导读 本文主要介绍hibernate的入门,主要包括以下内容:hibernate介绍.hibernate环境搭建.hibernate简单测试.测试涉及的api详解. 一.hibernate介绍 JDB ...
- Hibernate 框架入门
接着上一篇的 Hibernate 框架的了解,我们就继续学习 Hibernate 框架.这次就进入 Hibernate 框架的入门学习. 首先在学习 Hibernate 框架之前,我们要准备好我们需要 ...
- hibernate框架入门配置
1.新建一个项目(可以是java项目,也可以是webapp) 2.导入jar包,包括日志,mysql驱动,必备request包,jpa配置规范包 3.创建实体类 1.创建数据库,使用hibernate ...
- Hibernate框架之入门
1.Hibernate框架简述 Hibernate的核心组件在基于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层.它通过配置文件(hibernate.proper ...
- Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis
https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=6 ...
- 框架之 hibernate简单入门
hibernate框架的搭建 Hibernate框架的概述 1. Hibernate框架的概述 * Hibernate称为 * Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JD ...
- Hibernate入门第一讲——Hibernate框架的快速入门
Hibernate框架的概述 什么是框架? 框架指的是软件的半成品,已经完成了部分功能. JavaEE开发的三层架构 了解框架的基本概念之后,我们就来看看Hibernate框架处于JavaEE开发的经 ...
- Hibernate框架之入门案例
今天终于开始学习了三大框架的其中一个框架,Hibernate框架,在这里不去讲Hibernate框架的一些基础概念了,直接切入代码,带大家了解一下Hibernate能干什么, Hibernate的人们 ...
- java三大框架之一hibernate使用入门
综述:Hibernate的作用就是让实体类与数据库映射,使数据持久化,用于替代JDBC,使我们不致于写那么多sql语句代码. 1. 首先在官网www.hibernate.org下载hibernate包 ...
随机推荐
- linux 安装安装rz/sz 和 ssh
安装rz,sz yum install lrzsz; 安装ssh yum install openssh-server 查看已安装包 rpm -qa | grep ssh 更新yum源 1.备份 mv ...
- 6、udev机制
udev 机制,主要实现的是当设备连接系统的时候,在 /dev 目录下,自动创建设备节点. 1.1.工作方式 当设备连接或者移除的时候,内核会发出热拔插事件(hotplug eve ...
- atitit.Atitit.检测文本文件的编码 java 与php版 。Net
atitit.Atitit.检测文本文件的编码 java 与php版 .Net 1 检测编码原理 Utf8>>gbk 在此转会gbk>>utf 2 工具检测编码 不能使用l ...
- Closure闭包示例
var foo = function(){ var cnt = 0; return function(){ return cnt++; }; }; var closure = foo(); conso ...
- C语言基础(19)-结构体,联合体,枚举和typedef
一.结构体 1.1 结构体struct定义及初始化 #include <stdio.h> // 这个头文件在系统目录下 #include <stdlib.h> // 使用了sy ...
- Django学习之全局变量
首先说说什么叫全局变量,我们经常在html中使用{{ var }}这样的模板变量,这些变量是我们在视图函数中 提前定义好的变量,通过render()等方法传递到模板中. 但是,还有一类变量,我们并没有 ...
- shell实现洗牌随机
洗牌问题: 洗一副扑克,有什么好办法?既能洗得均匀,又能洗得快?即相对于一个文件来说怎样 高效率的实现乱序排列? 关于洗牌问题,其实已经有了一个很好的shell解法,这里另外给三个基于AWK的方法, ...
- 计算 24 点是一种扑克牌益智游戏,随机抽出 4 张扑克牌,通过加 (+) ,减 (-) ,乘 ( * ), 除 (/) 四种运算法则计算得到整数 24 ,本问题中,扑克牌通过如下字符或者字符串表示,其中,小写 joker 表示小王,大写 JOKER 表示大王:
include "stdafx.h" #include <iostream> #include <fstream> #include <string& ...
- mysql的binlog和slow_log慢日志
redo undo 锁 ----------------------------------------- 日志管理 log-error=/var/log/mysql.log 二进制日志的“总闸” 作 ...
- 浅谈push推送的一点感受
在手机已成为生活必不可分的一部分,push服务伴随而来.ios的apns,android随着谷歌退出中国市场,各家在android的推送不断展开.有厂商的推送,如小米.华为.魅族.oppo等,还有中间 ...