目录
Hibernate概述
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。—— [ 百度百科 ]
什么是框架-framework
为了解决开发中遇到的共性问题而提出的解决方案以及实现叫做框架,框架是软件的半成品,可以帮助开发人员完成部分的功能。
什么是ORM(对象关系映射)
ORM映射:Object Relational Mapping ——用来完成对象到关系之间的转换,Hibernate 是典型的ORM框架
- O:面向对象领域的Object(JavaBean对象)
- R:关系数据库领域的Relational(表的结构)
- M:映射Mapping(XML的配置文件)
简单一句话:Hibernate使开发人员通过操作对象的方式来操作数据库记录
Hibernate框架的快速入门
第一步 : 搭建Hibernate5的运行环境
下载响应的jar包等
点击下载Hibernate创建WEB工程,引入Hibernate开发所需要的jar包
- MySQL的驱动jar包
- Hibernate开发需要的jar包(资料/hibernate-release-5.0.7.Final/lib/required/所有jar包)
- 日志jar包(资料/jar包/log4j/所有jar包)
第二步:创建表结构
- 建表语句如下
Create database hibernate_day01;
Use hibernate_day01;
CREATE TABLEcst_customer
(
cust_id
bigint(32) NOT NULL AUTO_INCREMENT COMMENT ‘客户编号(主键)’,
cust_name
varchar(32) NOT NULL COMMENT ‘客户名称(公司名称)’,
cust_user_id
bigint(32) DEFAULT NULL COMMENT ‘负责人id’,
cust_create_id
bigint(32) DEFAULT NULL COMMENT ‘创建人id’,
cust_source
varchar(32) DEFAULT NULL COMMENT ‘客户信息来源’,
cust_industry
varchar(32) DEFAULT NULL COMMENT ‘客户所属行业’,
cust_level
varchar(32) DEFAULT NULL COMMENT ‘客户级别’,
cust_linkman
varchar(64) DEFAULT NULL COMMENT ‘联系人’,
cust_phone
varchar(64) DEFAULT NULL COMMENT ‘固定电话’,
cust_mobile
varchar(16) DEFAULT NULL COMMENT ‘移动电话’,
PRIMARY KEY (cust_id
)
) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8;
第三步: 编写Hibernate核心的配置文件
- 在src目录下,创建名称为hibernate.cfg.xml的配置文件
在XML中引入DTD约束
“-//Hibernate/Hibernate Configuration DTD 3.0//EN”
“http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd”>打开:资料/hibernate-release-5.0.7.Final/project/etc/hibernate.properties,可以查看具体的配置信息
必须配置的4大参数
-hibernate.connection.driver_class com.mysql.jdbc.Driver
-hibernate.connection.url jdbc:mysql:///test
-hibernate.connection.username gavin
-hibernate.connection.password数据库的方言(必须配置的)
-hibernate.dialect org.hibernate.dialect.MySQLDialect可选的配置
-hibernate.show_sql true
-hibernate.format_sql true
-hibernate.hbm2ddl.auto update引入映射配置文件(一定要注意,要引入映射文件,框架需要加载映射文件)
<mapping resource="com/itheima/domain/Customer.hbm.xml"/>
4.具体的配置如下
<?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="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/company</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 配置Session管理的上下文环境 -->
<property name="current_session_context_class">thread</property>
<!-- 指定是否打印当前执行的sql语句 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 在hibernate的配置文件中配置映射文件的位置 -->
<mapping resource="com/zhidisoft/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
第三步: 映射
在JavaBean所在的包下创建映射的配置文件
* 默认的命名规则为:实体类名.hbm.xml
* 在xml配置文件中引入约束(引入的是hibernate3.0的dtd约束,不要引入4的约束)
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
编写映射的配置文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
hibernate-mapping的属性
package 非必须属性: 用于当前映射文件中实体类的包名
一个hibernate-mapping根元素中可以定义多个class子元素
-->
<hibernate-mapping package="com.zhidisoft.entity">
<!--
class元素 : 用于映射一个实体类以及它对应的表
常用属性
name 必须属性 用于指定当前需要映射的实体类名,如果没有定义package属性,该属性值需要指定完全类型名
table 非必须属性 用于指定当前实体类对应的表名,如果没有指定该属性表示类名和表名相同
lazy 非必须属性 默认值是true 用于指定当前实体对象是否支持延迟加载,只对load方法有效
-->
<class name="Department" table="dept">
<!--
<class>标签中必须得有一个<id>子元素
<id>用于定义主键属性
常用的属性:
name 非必须属性 用于指定主键属性名
column 非必须属性 用于用于指定表中主键的列名
type 非必须属性 用于指定当前属性的数据类型,数据类型可以是:java类型、hibernate类型
大部分情况都不需要指定type,hibernate会根据反射机制获取到它对应的类型,但是如果一个java类型
对应多个sql类型,那么就需要指定该属性
length 非必须属性 用于指定当前属性长度
<property> 用于定义普通属性
常用的属性:
name 必须属性 定义属性名
column 非必须属性 定义该属性对应的列名
length
type
precision 非必须属性 用于定义小数位的长度 decimal(10,2)
scale 非必须属性 用于定义整个小数数字的长度
unique 非必须属性 用于指定当前属性是否唯一
not-null 非必须属性 用于指定当前属性是否允许为空
-->
<!-- 定义主键属性 -->
<id name="deptno" >
<generator class="native" />
</id>
<!-- 非主键属性 -->
<property name="dname" />
<property name="loc" />
</class>
</hibernate-mapping>
第四步: 编写Hibernate入门代码
1. 具体的代码如下
/**
* 测试保存客户
*/
@Test
public void testSave(){
// 先加载配置文件
Configuration config = new Configuration();
// 默认加载src目录下的配置文件
config.configure();
// 创建SessionFactory对象
SessionFactory factory = config.buildSessionFactory();
// 创建session对象
Session session = factory.openSession();
// 开启事务
Transaction tr = session.beginTransaction();
// 编写保存代码
Customer c = new Customer();
// c.setCust_id(cust_id); 已经自动递增
c.setCust_name("测试名称");
c.setCust_mobile("110");
// 保存客户
session.save(c);
// 提交事务
tr.commit();
// 释放资源
session.close();
factory.close();
}
Hibernate的核心api
Hibernate的API一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通过这些接口,可以对持久化对象进行存取、事务控制。
Configuration
org.hibernate.cfg.Configuration类
顾名思义,Configuration负责管理Hibernate的配置信息,其中包括一些关键的属性如:
* 数据库连接URL- hibernate.connetion.url
* 数据库驱动程序类名- hibernate.connection.driver_class
* 数据库用户名- hibernate.connection.username
* 数据库用户口令- hibernate.connection.password
* 数据库方言- hibernate.dialect
- 使用Hibernate,必须提供以上基本的信息用于对特定数据库的支持,以完成初始化工作。
- 在应用中,需要使用Configuration的configure()搜寻并加载hibernate.cfg.xml,为后续操作提供基本配置
- Hibernate也支持通过Configuration对象以编程形式进行配置,但是实际应用中并不建议如此。
//以编码形式添加配置信息
Configuration config = new Configuration();
//设置数据库连接配置
config.setProperty("hibernate.connection.driver_class","com.mysql.jdbc.Driver") .setProperty("hibernate.connection.url","jdbc:mysql://localhost:3306/db_hibernate")
.setProperty("hibernate.connection.user","root")
.setProperty("hibernate.connection.password","root")
.setProperty("hibernate.current_session_context_class","thread")
.addClass(Student.class);
SessionFactory
org.hibernate.SessionFactory
- SessionFactory负责创建Session 实例,该对象被设计为线程安全的
- Hibernate3.x中SessionFactory对象由Configuration对象的buildSessionFactory()方法直接构建,但是在Hibernate4.x以后该方式已被废弃。
- SessionFactory 一旦构造完毕,即被赋予特定的配置信息,所以Hibernate中Configuration对象被设计为启动期间对象,也就是该配置对象在Hibernate的SessionFactory创建完毕即被丢弃和回收。
- SessionFactory接口中提供了获取Session中常用方法:
* Session openSession() 每次都打开一个新的会话
* Session getCurrentSession() 当前线程如果已经打开会话,直接返回该会话对象,否则会新建一个会话并且返回。
Session
org.hibernate.Session
- Session表示应用程序与持久储存层之间交互操作的一个单线程对象。
- Session是持久层操作的基础,相当于JDBC中的Connection
Session的生命周期是以事务的开始和结束来界定的
Session完成的主要功能就是提供对实体对象的CRUD操作
如将对应的实体对象保存至数据库 save(Object o)/persist(Object o)
- 如将数据从数据库中查询出来load ()和get()等
- 如将数据从数据库中删除的方法delete()等
- 如对数据进行更新调用update(Object o)/merge(Object o)
- 如获取集合数据 createQuery(String hql)
实体对象状态转换
Hibernate中实体对象在被Session操作前后,会经历以下三种状态的转换
- Transient:瞬时状态(瞬态)
通常情况新创建的,且尚未与Hibernate session关联的对象即被认为是瞬时状态的对象。
瞬时状态对象既没有被持久化到数据库,也没分配唯一持久化标识符ID。 - Persistent:持久化状态
通常情况下如果实体对象已经持久化到数据库,拥有一个持久化标识符(ID),并且被关联到当前Session作用范围,那么该对象处于持久化状态 - Detached:脱管状态(游离态)
已经持久化,但是没有和session进行关联,失去了session的管理