hibernate基础知识一

来源:互联网 发布:spark 推荐算法 编辑:程序博客网 时间:2024/06/05 06:50
传智播客——专注于 Java.Net Php、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
第 1 章 Hibernate_day01
今日任务
使用 Hibernate 完成对 CRM 系统中客户管理的 DAO 中的 CRUD 的操作
教学导航
教学目标
教学方法 案例驱动法
案例一: 使用 Hibernate 完成 CRM 客户管理的
CRUD 的操作
1.1 案例需求:
1.1.1 需求描述
CRM 系统中客户信息管理模块功能包括:
新增客户信息
客户信息查询
修改客户信息
删除客户信息
1.2 相关知识点:
1.2.1 CRM 的概述
1.2.1.1 什么是 CRM
CRMCustomer Relationship Management) 客户关系管理, 是利用相应的信息技术以及互联网
传智播客——专注于 Java.Net Php、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
技术来协调企业与顾客间在销售、 营销和服务上的交互, 向客户提供创新式的个性化的客户交互和
服务的过程。 其最终目标是将面向客户的各项信息和活动集成起来, 组建一个以客户为中心的企业,
实现对面向客户的活动的全面管理。
1.2.1.2 CRM 的功能模块
CRM 系统实现了对企业销售、 营销、 服务等各阶段的客户信息、 客户活动进行统一管理。
CRM 系统功能涵盖企业销售、 营销、 用户服务等各各业务流程, 业务流程中与客户相关活动都会在
CRM 系统统一管理, 下边列出一些基本的功能模块, 包括: 客户信息管理、 联系人管理、 商机管理、
统计分析等。
客户信息管理
对客户信息统一维护, 客户是指存量客户或拟营销的客户, 通过员工录入形成公司的“ 客户库”
是公司最重要的数据资源。
联系人管理
对客户的联系人信息统一管理, 联系人是指客户企业的联系人, 即企业的业务人员和客户的哪
些人在打交道。
客户拜访管理:
业务员( 用户) 要开发客户需要去拜访客户, 客户拜访信息记录了业务员与客户沟通交流方面
的不足、 采取的策略不当、 有待改进的地方或值得分享的沟通技巧等方面的信息。
综合查询
客户相关信息查询, 包括: 客户信息查询、 联系人信息查询、 商机信息查询等。
统计分析
按分类统计客户信息, 包括: 客户信息来源统计、 按行业统计客户、 客户发展数量统计等。
系统管理
系统管理属于 crm 系统基础功能模块, 包括: 数据字典、 账户管理、 角色管理、 权限管理、 操
作日志管理等。
传智播客——专注于 Java.Net Php、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
1.2.1.3 JavaEE 开发三层结构
1.2.2 Hibernate 的概述
1.2.2.1 什么是 Hibernate
Hibernate 框架是当今主流的 Java 持久层框架之一, 由于它具有简单易学、 灵活性强、 扩展性强
等特点, 能够大大地简化程序的代码量, 提高工作效率, 因此受到广大开发人员的喜爱。
Hibernate 是一个开放源代码的 ORMObject Relational Mapping, 对象关系映射) 框架, 它对
JDBC 进行了轻量级的对象封装, 使得 Java 开发人员可以使用面向对象的编程思想来操作数据库。
Hibernate 就是一个持久层的 ORM 的框架.
ORM :Object Relational Mapping.对象关系映射.
1.2.2.2 为什么要学习 Hibernate
使用传统的 JDBC 开发应用系统时, 如果是小型应用系统, 并不觉得有什么麻烦, 但是对于大
型应用系统的开发, 使用 JDBC 就会显得力不从心。 例如对几十、 几百张包含几十个字段的表进行
插入操作时, 编写的 SQL 语句不但很长, 而且繁琐, 容易出错; 在读取数据时, 需要写多条getXxx
语句从结果集中取出各个字段的信息, 不但枯燥重复, 并且工作量非常大。 为了提高数据访问层的
编程效率, Gavin King 开发出了一个当今最流行的的 ORM 框架, 它就是 Hibernate 框架。
所谓的 ORM 就是利用描述对象和数据库表之间映射的元数据, 自动把 Java 应用程序中的对象,
持久化到关系型数据库的表中。 通过操作 Java 对象, 就可以完成对数据库表的操作。 可以把 ORM
传智播客——专注于 Java.Net Php、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
理解为关系型数据和对象的一个纽带, 开发人员只需要关注纽带一端映射的对象即可。ORM原理如
1-1 所示。
ORM 原理
与其它操作数据库的技术相比, Hibernate 具有以下几点优势:
Hibernate JDBC 访问数据库的代码做了轻量级封装, 大大简化了数据访问层繁琐的重复
性代码, 并且减少了内存消耗, 加快了运行效率。
Hibernate 是一个基于 JDBC 的主流持久化框架, 是一个优秀的 ORM 实现, 它很大程度的
简化了 DAOData Access Object, 数据访问对象) 层编码工作。
Hibernate 的性能非常好, 映射的灵活性很出色。 它支持很多关系型数据库, 从一对一到多
对多的各种复杂关系。
可扩展性强, 由于源代码的开源以及 API的开放, 当本身功能不够用时, 可以自行编码进
行扩展。
1.2.3 Hibernate 的入门:
1.2.3.1 下载 Hibernate5
http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/
Hibernate5.0.7 版本下载后, 解压完的目录结构如图所示。
传智播客——专注于 Java.Net Php、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
从图可以看出, hibernate5.0.7 的解压 s 目录中包含一系列的子目录, 这些子目录分别用于存放不同
功能的文件, 接下来针对这些子目录进行简单介绍, 具体如下:
documentation 文件夹: 存放 Hibernate 的相关文档, 包括参考文档的 API 文档。
lib 文件夹: 存放 Hibernate 编译和运行所依赖的 JAR 包。 其中 required 子目录下包含了运
Hibernate5 项目必须的 JAR 包。
project 文件夹: 存放 Hibernate 各种相关的源代码。
lib/required 子目录中, 包含的 JAR
1.2.3.2 创建数据库和表
create database hibernate_day01;
use hibernate_day01;
CREATE TABLE `cst_customer` (
`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
`cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
`cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
`cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
`cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
`cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
`cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
传智播客——专注于 Java.Net Php、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8;
1.2.3.3 引入 Hibernate 的开发包
数据库驱动包
Hibernate/lib/required/*.jar
日志记录的包
1.2.3.4 创建实体( 持久化类)
持久化类是应用程序中的业务实体类, 这里的持久化是指类的对象能够被持久化保存到数据库中。
Hibernate 使用普通 Java 对象( Plain Old Java Object), 即POJO的编程模式来进行持久化。POJO
中包含的是与数据库表相对应的各个属性, 这些属性通过 getter setter 方法来访问, 对外部隐藏了
内部的实现细节。 下面就来编写 Customer 持久化类。
在项目 src 目录下, 创建 cn.itcast.domain 包, 并在包中创建实体类 Customer(对应数据库表
cst_customer),Customer类包含与cst_customer 数据表字段对应的属性, 以及相应的 getXxx ()
setXxx ()方法。
public classCustomer {
privateLongcust_id;
privateStringcust_name;
privateStringcust_source;
privateStringcust_industry;
privateStringcust_level;
privateStringcust_phone;
privateStringcust_mobile;
传智播客——专注于 Java.Net Php、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
publicLong getCust_id() {
returncust_id;
}p
ublic void setCust_id(Long cust_id) {
this.cust_id=cust_id;
}p
ublic String getCust_name() {
returncust_name;
}p
ublic void setCust_name(String cust_name) {
this.cust_name=cust_name;
}p
ublic String getCust_source() {
returncust_source;
}p
ublic void setCust_source(String cust_source) {
this.cust_source=cust_source;
}p
ublic String getCust_industry() {
returncust_industry;
}p
ublic void setCust_industry(String cust_industry) {
this.cust_industry=cust_industry;
}p
ublic String getCust_level() {
returncust_level;
}p
ublic void setCust_level(String cust_level) {
this.cust_level=cust_level;
}p
ublic String getCust_phone() {
returncust_phone;
}p
ublic void setCust_phone(String cust_phone) {
this.cust_phone=cust_phone;
}p
ublic String getCust_mobile() {
returncust_mobile;
}p
ublic void setCust_mobile(String cust_mobile) {
this.cust_mobile=cust_mobile;
}
}
传智播客——专注于 Java.Net Php、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
1.2.3.5 创建映射文件
实体类 Customer目前还不具备持久化操作的能力, 而Hibernate需要知道实体类Customer映射到数
据库 Hibernate中的哪个表, 以及类中的哪个属性对应数据库表中的哪个字段, 这些都需要在映射文
件中配置。
在实体类 Customer所在的包中, 创建一个名称为Customer.hbm.xml的映射文件, 在该文件中定义了
实体类 Customer的属性是如何映射到cst_customer表的列上的。
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--建立类和表的一个映射关系:-->
<!--
class标签:用来建立类和表的映射
* name属性 : 类中的全路径.
* table属性 : 表名(如果类名和表名是一致的, 那么 table属性客户省略)
* catalog属性: 数据库名称, 可以省略
-->
<classname="cn.itcast.domain.Customer"table="cst_customer">
<!--建立类中的属性与表中的主键的映射-->
<!--
id 标签: 用来建立类中的属性与表中的主键字段对应
* name属性 : 类中的属性名
* column属性 : 表中字段名( 如果类中的属性名和表中的字段名一致, 那么省略
column
* length属性 : 字段的长度.
* type属性 : 类型。 写Java数据类型,Hibernate数据类型( 默认),SQL类型
-->
<idname="cust_id"column="cust_id">
<!--主键生成策略-->
<generatorclass="native"/>
</id>
<!--建立类中的普通属性与表中的字段的映射-->
<!--
property标签: 用来建立类中的普通属性与表中的字段对应
* name属性 : 类中的属性名
* column属性 : 表中字段名( 如果类中的属性名和表中的字段名一致, 那么省略
column
* length属性 : 字段的长度.
* type属性 : 类型。 写Java数据类型,Hibernate数据类型( 默认),SQL类型
-->
传智播客——专注于 Java.NetPhp、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
<propertyname="cust_name"column="cust_name"/>
<propertyname="cust_source"column="cust_source"/>
<propertyname="cust_industry"column="cust_industry"/>
<propertyname="cust_level"column="cust_level"/>
<propertyname="cust_phone"column="cust_phone"/>
<propertyname="cust_mobile"column="cust_mobile"/>
</class>
</hibernate-mapping>
1.2.3.6 创建Hibernate的核心配置文件
Hibernate 的映射文件反映了持久化类和数据库表的映射信息,而Hibernate的配置文件则主要用来配
置数据库连接以及 Hibernate运行时所需要的各个属性的值。 在项目的src下创建一个名称为
hibernate.cfg.xml 的文件
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEhibernate-configurationPUBLIC
"-//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>
<property
name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
<propertyname="hibernate.connection.username">root</property>
<propertyname="hibernate.connection.password">123</property>
<!-- Hibernate的属性-->
<!-- Hibernate的方言:作用, 根据配置的方言生成相应的SQL语句-->
<property
name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Hibernate显示SQL语句: -->
<propertyname="hibernate.show_sql">true</property>
<!-- Hibernate格式化SQL语句:-->
<propertyname="hibernate.format_sql">true</property>
<!-- Hibernatehbm2ddl(数据定义语言:create drop alter ...)属性-->
<!--
hbm2ddl.auto的取值
* none :不用Hibernate自动生成表.
* create :每次都会创建一个新的表.(测试)
* create-drop :每次都会创建一个新的表, 执行程序结束后删除这个表.(
传智播客——专注于 Java.NetPhp、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
)
* update :如果数据库中有表, 使用原来的表, 如果没有表, 创建一个
新表.可以更新表结构。
* validate :只会使用原有的表.对映射关系进行校验.
-->
<propertyname="hibernate.hbm2ddl.auto">update</property>
<!-- Hibernate加载映射-->
<mappingresource="cn/itcast/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
该配置文件设置了数据库连接的相关属性以及其它的一些常用属性, 并且通过mappingresource
属性将对象的映射信息加入到了 Hibernate的配置文件中。
1.2.3.7 编写测试代码
在项目中新建一个名称为 cn.itcast.test的包, 然后在包中建立一个名为HibernateDemo1.java的文件,
该文件是用来测试的类文件。
public classHibernateDemo1 {
@Test
/**
* 使用 Hibernate保存数据
*/
public voiddemo1(){
// 1.加载配置文件:
Configuration cfg=newConfiguration().configure();
// 2.创建一个SessionFactory:
SessionFactory sessionFactory=cfg.buildSessionFactory();
// 3.创建Session对象.Session对象 类似Connection.
Session session=sessionFactory.openSession();
// 4.开启事务:
Transaction tx=session.beginTransaction();
// 5.执行相关操作
Customer customer=newCustomer();
customer.setCust_name("小王");
customer.setCust_source("网络推广");
session.save(customer);
// 6.事务提交
tx.commit();
// 7.释放资源
session.close();
传智播客——专注于 Java.NetPhp、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
}
}
首先创建 Configuration类的实例, 并通过它来读取并解析配置文件hibernate.cfg.xml。 然后创建
SessionFactory 读 取 解 析 映 射 文 件 信 息 , 并 将Configuration对 象 中 的 所 有 配 置 信 息 拷 贝 到
SessionFactory 内存中。 接下来, 打开Session, 让SessionFactory提供连接, 并开启一个事务, 之后
创建对象, 向对象中添加数据, 通过 session.save()方法完成向数据库中保存数据的操作。 最后提交
事务, 并关闭资源。
1.2.4 Hibernate 的常见配置:
在案例中, 已经接触过 Hibernate的映射文件和配置文件。 接下来, 将对这些文件进行详细的讲解。
1.2.4.1 映射文件的配置
该文件用于向 Hibernate提供持久化类到关系型数据库的映射, 每个映射文件的的结构基本都是相同
的, 其普遍的代码形式如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<!—映射文件的dtd信息-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name 代表的是实体类名talbe代表的是表名-->
<class name="XXX" table="xxx">
<!-- name=id 代表的是XXX类中属性column=id代表的是xxx表中的字段-->
<id name="id" column="id">
<generator class="native"/><!--主键生成策略-->
</id>
<!-- 其它属性使用property标签来映射-->
<property name="XXX" column="xxx" type="string" />
</class>
</hibernate-mapping>
映射文件通常是一个 XML文件即可,但一般命名为类名.hbm.xml
<class>标签】
传智播客——专注于 Java.NetPhp、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
<id>标签】
<property>标签】
1.2.4.2 核心配置
Hibernate 的配置文件, 包含了连接持久层与映射文件所需的基本信息, 其配置文件有两种格式, 具
体如下:
一种是properties属性文件格式的配置文件, 它使用键值对的形式存放信息, 默认文件名称
hibernate.properties
另一种是XML格式的配置文件,XML配置文件的默认名称为hibernate.cfg.xml
上述两种格式的配置文件是等价的, 具体使用哪个可以自由选择。 XML 格式的配置文件更易于
传智播客——专注于 Java.NetPhp、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
修改, 配置能力更强, 当改变底层应用配置时不需要改变和重新编译代码, 只修改配置文件的相应
属性即可, 而 properties格式的文件则不具有此优势, 因此, 在实际开发项目中, 大多数情况会使用
XML 格式的配置文件。 下面将对XML格式的配置文件进行详细介绍。
hibernate.cfg.xml 配置文件一般在开发时会放置在src的源文件夹下, 发布后, 该文件会在项目
WEB-INF/classes路径下。 配置文件的常用配置信息如下所示。
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEhibernate-configurationPUBLIC
"-//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>
<property
name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
<propertyname="hibernate.connection.username">root</property>
<propertyname="hibernate.connection.password">123</property>
<!-- Hibernate的属性-->
<!-- Hibernate的方言:作用, 根据配置的方言生成相应的SQL语句-->
<property
name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Hibernate显示SQL语句: -->
<propertyname="hibernate.show_sql">true</property>
<!-- Hibernate格式化SQL语句:-->
<propertyname="hibernate.format_sql">true</property>
<!-- Hibernatehbm2ddl(数据定义语言:create drop alter ...)属性-->
<!--
hbm2ddl.auto的取值
* none :不用Hibernate自动生成表.
* create :每次都会创建一个新的表.(测试)
* create-drop :每次都会创建一个新的表, 执行程序结束后删除这个表.(
)
* update :如果数据库中有表, 使用原来的表, 如果没有表, 创建一个
新表.可以更新表结构。
* validate :只会使用原有的表.对映射关系进行校验.
-->
<propertyname="hibernate.hbm2ddl.auto">update</property>
<!-- Hibernate加载映射-->
<mappingresource="cn/itcast/domain/Customer.hbm.xml"/>
</session-factory>
传智播客——专注于 Java.NetPhp、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
</hibernate-configuration>
在上述代码中, 首先进行了 xml声明, 然后是配置文件的dtd信息, 该信息同样可以在核心包
hibernate-core-5.0.7.Final.jar 下的org.hibernate包中的hibernate-configuration-3.0.dtd文件中找到, 读
者只需要复制过来用即可, 不需要刻意记忆。
Hibernate 配置文件的根元素是hibernate-configuration, 该元素包含子元素session-factory, 在
session-factory 元素中又包含多个property元素, 这些property元素用来对Hibernate连接数据库的一
些重要信息进行配置。 例如, 上面的配置文件中, 使用了 property 元素配置了数据库的方言、 驱动、
URL、 用户名、 密码等信息。 最后通过mapping元素的配置, 加载出映射文件的信息。
Hibernate 配置文件的一些常用属性名称及用途, 如表所示。
1-1 Hibernate常用配置属性
名称 用途
hibernate.dialect 操作数据库方言
hibernate.connection.driver_class 连接数据库驱动程序
hibernate.connection.url 连接数据库URL
hibernate.connection.username 数据库用户名
hibernate.connection.password 数据库密码
hibernate.show_sql 在控制台上输出SQL语句
hibernate.format_sql 格式化控制台输出的SQL语句
hibernate.hbm2ddl.auto SessionFactory创建时是否根据映射文件自动验证表
结构或自动创建、 自动更新数据库表结构。 该参数的取
值为: validateupdatecreatecreate-drop
hibernate.connection.autocommit 事务是否自动提交
1.2.5 Hibernate 的相关 API
1.2.5.1 Configuration:配置对象.
Configuration 主要用于Hibernate框架加载映射文件
【 加载核心配置文件】
在使用 Hibernate时, 首先要创建Configuration实例,Configuration实例主要用于启动、 加载、
管理 hibernate的配置文件信息。 在启动Hibernate的过程中,Configuration实例首先确定Hibernate
配置文件的位置, 然后读取相关配置, 最后创建一个唯一的 SessionFactory 实例。Configuration对象
只存在于系统的初始化阶段, 它将 SessionFactory创建完成后, 就完成了自己的使命。
Hibernate 通常使用Configuration config = new Configuration().configure();的方式创建实例, 此种
方式默认会去 src下读取hibernate.cfg.xml配置文件。 如果不想使用默认的hibernate.cfg.xml配置文
件, 而是使用指定目录下( 或自定义) 的配置文件, 则需要向 configure()方法中传递一个文件路径
的参数, 其代码写法如下:
传智播客——专注于 Java.NetPhp、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
Configuration config = new Configuration().configure("xml文件位置");
此种写法 hibernate会去指定位置查找配置文件, 例如, 想要使用srcconfig包中的
hibernate.cfg.xml 文件, 只需将文件位置加入configure()中即可, 其代码如下所示:
Configuration config = new Configuration().configure("/config/hibernate.cfg.xml");
【 加载映射文件】
Hibernate 除了可以使用Configuration对象加载核心配置文件以外, 还可以利用该对象加载映射
文件。 因为如何使用 properties文件作为Hibernate的核心配置文件, 其他的属性可以使用key=value
的格式来设置, 但是映射没有办法加载。 这时这个对象就有了用武之地。 可以在手动编写代码的时
候去加载映射文件。
Configuration configuration = new Configuration().configure("xml文件位置");
configuration.addResource("cn/itcast/domain/Customer.hbm.xml");
1.2.5.2 SessionFactorySession工厂对象
SessionFactory 接口负责Hibernate的初始化和建立Session对象。 它在Hibernate中起到一个缓
冲区作用, Hibernate可以将自动生成的SQL语句、 映射数据以及某些可重复利用的的数据放在这个
缓冲区中。 同时它还保存了对数据库配置的所有映射关系, 维护了当前的二级缓存。
SessionFactory 实例是通过Configuration对象获取的, 其获取方法如下所示。
SessionFactory sessionFactory = config.buildSessionFactory();
SessionFactory 具有以下特点:
它是线程安全的, 它的同一个实例能够供多个线程共享。
它是重量级的, 不能随意的创建和销毁它的实例。
由于 SessionFactory的这些特点, 一般情况下, 一个项目中只需要一个SessionFactory, 只有当
应用中存在多个数据源时, 才为每个数据源建立一个 SessionFactory 实例。 因此, 在实际项目使用中,
通常会抽取出一个 HibernateUtils的工具类, 用来提供Session对象。
Hibernate 的工具类:
public classHibernateUtils {
private static finalConfigurationconfiguration;
private static finalSessionFactorysessionFactory;
static{
configuration=newConfiguration().configure();
sessionFactory=configuration.buildSessionFactory();
} /
**
* 提供获得 session的方法:
*/
传智播客——专注于 Java.NetPhp、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
public staticSession openSession(){
returnsessionFactory.openSession();
}
}
1.2.5.3 Session
Session 是应用程序与数据库之间交互操作的一个单线程对象, 是Hibernate运作的中心, 它的
主要功能是为持久化对象提供创建、 读取和删除的能力, 所有持久化对象必须在session的管理下才
可以进行持久化操作。
创建 SessionFactory实例后, 就可以通过它获取Session实例。 获取Session实例有两种方式,
一种是通过 openSession()方法, 另一种是通过getCurrentSession()方法。 两种方法获取session 的代码
如下所示:
//采用openSession方法创建session
Session session = sessionFactory.openSession();
//采用getCurrentSession()方法创建session
Session session = sessionFactory.getCurrentSession();
以上两种获取 session实例方式的主要区别是, 采用openSession方法获取Session实例时,
SessionFactory 直接创建一个新的Session实例,并且在使用完成后需要调用close方法进行手动关闭。
getCurrentSession方法创建的Session实例会被绑定到当前线程中, 它在提交或回滚操作时会自动
关闭。
Session 是线程不安全的, 多个并发线程同时操作一个Session实例时, 就可能导致Session数据
存取的混乱( 方法内部定义和使用 Session时, 不会出现线程问题)。 因此设计软件架构时, 应避免
多个线程共享一个 Session实例。 同时它也是轻量级的, 实例的创建和销毁不需要消耗太多的资源。
它还有一个缓存, 即 Hibernate的一级缓存, 这个缓存主要用于存放当前工作单元加载的对象。
Session中提供了大量的常用方法, 具体如下:
save()update(): 用于增加和修改对象。
delete()方法: 用于删除对象。
get(): 根据主键查询。
createQuery()createSQLQuery()方法: 用于数据库操作对象。
createCriteria()方法: 条件查询。
传智播客——专注于 Java.NetPhp、 网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
1.2.5.4 Transaction
Transaction 接口主要用于管理事务, 它是Hibernate的数据库事务接口, 且对底层的事务接口进
行了封装。 Transaction接口的事务对象是通过Session对象开启的, 其开启方式如下所示。
Transaction transaction = session.beginTransaction();
Transaction接口中, 提供了事务管理的常用方法, 具体如下:
commit()方法: 提交相关联的session实例。
rollback()方法: 撤销事务操作。
Session 执行完数据库操作后, 要使用Transaction接口的commit()方法进行事务提交, 才能真正的将
数据操作同步到数据库中。 发生异常时, 需要使用 rollback()方法进行事务回滚, 以避免数据发生错
误。 因此, 在持久化操作后, 必须调用 Transaction接口的commit()方法和rollback()方法。 如果没有
开启事务, 那么每个 Session的操作, 都相当于一个独立的操作。
1.2.6 QBC 查询所有
Criteria 是一个完全面向对象, 可扩展的条件查询API, 通过它完全不需要考虑数据库底层如何
实现, 以及 SQL语句如何编写, 它是Hibernate框架的核心查询对象。Criteria查询, 又称为QBC
查询( Query By Criteria), 它是Hibernate的另一种对象检索方式。
org.hibernate.criterion.Criterion Hibernate提供的一个面向对象查询条件接口, 一个单独的查询
就是 Criterion接口的一个实例, 用于限制Criteria对象的查询, 在HibernateCriterion对象的创建
通常是通过 Restrictions工厂类完成的, 它提供了条件查询方法。
通常, 使用 Criteria对象查询数据的主要步骤, 具体如下:
1) 获得HibernateSession对象。
2) 通过Session获得Criteria对象。
3) 使用Restrictions的静态方法创建Criterion条件对象。Restrictions类中提供了一系列用于
设定查询条件的静态方法, 这些静态方法都返回 Criterion实例, 每个Criterion实例代表一
个查询条件。
4) 向Criteria对象中添加Criterion查询条件。Criteriaadd()方法用于加入查询条件。
5) 执行Criteritalist()uniqueResult()获得结果。
了解了 Criteria对象的使用步骤后, 接下来, 通过具体示例来演示Criteria对象的查询操作。
Criteria:用来执行条件查询
// 1.查询所有记录
/*Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
System.out.println(list);*/

Criteria对象中, 除了使用criteria.list()方法查询全部数据外, 还有其它一些常用方法: 如果只
返回一个值时, 可以使用 criteriauniqueResult()方法; 如果需要分页时可以使用setFirstResult()
setMaxResult()两个方法,setFirstResult()方法表示从第几条记录开始查询,setMaxResult()方法表示查
询几条记录, 后面会详细介绍, 第一天掌握查询所有。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 过了时的手机没有刷机包怎么办? 刷了个刷机包游戏玩不了了怎么办? 华为麦芒5手机外放声音小怎么办 微信显示存储卡已拔出怎么办 储存卡已拔出微信头像不可用怎么办 智能手机的电话卡取不出来了怎么办 换了苹果手机通讯录没了怎么办 手机玻璃膜一角翘起来了怎么办 华为畅玩7x耗电快怎么办 魅蓝5s充电器死机了怎么办 苹果手机乐动力不计步数怎么办 意大利居留按手印时间过了怎么办 酷派t1手机解析包出现问题怎么办 p新买的手机壳有味怎么办 门锁钥匙口竖着钥匙放不进去怎么办 摩拜单车被别人骑走了怎么办 捡到苹果8p手机怎么办才能自己用 用力按压导致玻尿酸变形移位怎么办 华为麦芒5应用锁密码忘了怎么办 华为麦芒6应用锁密码忘了怎么办 华为手机的设置不在桌面了怎么办 华为手机所有应用都不在桌面怎么办 华为麦芒5设置页面不显示怎么办 华为麦芒5主屏页面不显示怎么办 6s p换屏幕原装太贵怎么办 4g手机开不开机黑屏怎么办 华为麦芒5 4g信号差怎么办 华为麦芒手机锁屏密码忘了怎么办 华为麦芒5相机拍相片倒了怎么办 红米5a开不了机怎么办 华为沾了海水打不开机怎么办 华为麦芒手机忘记锁屏密码怎么办 华为手机的方框键摁不了怎么办 笔记本自动更新到一半太慢了怎么办 华为麦芒5音量下键乱跑了怎么办 麦芒6手机QQ视频没声音怎么办 18:9看16:9黑边怎么办 华为畅享7s声音小怎么办 华为畅享8手机声音小怎么办 华为畅享8plus声音小怎么办 荣耀7x锁屏密码忘记怎么办