1.今日任务
1.hibernate简介
概念
原始jdbc的缺陷
繁琐的代码问题
多表连接问题
表间级联问题
性能问题
对于数据库的操作不是面向对象,是面向关系数据库的。碰坏了面向对象的瓶颈
原理:
对JDBC的封装操作
hibernate是基于ORM技术的一个持久层框架
ORM
object relational mapping
对象到关系的映射
把对表直接进行的操作变成对持久化类的属性和方法的直接操作
ORM作为分层体系中的持久层.
ORM技术可以极大地提高开发效率和开发时间,同时开发质量也更容易得到保证
持久层
数据访问层
Dao
hibernate环境搭建
1.创建Web工程
2.通过MyEclipse工具导入hibernate框架
3.配置数据库连接
1.切换窗口
2.新建数据源
3.配置到项目中
4.反向生存对应的Model
持久类特点
1.实现序列话接口
对象流
缓存,保存在硬盘或者内存,序列化传输
2.一定要有无参构造方法
3.一定要有主键
涉及级联操作
保存数据操作
1.hibernate中的5个核心接口
Configuration接口
Configuration接口负责配置并启动Hibernate
创建SessionFactory对象
在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、 读取配置,然后创建SessionFactory对象。
SessionFactory接口
SessionFactroy接口负责初始化Hibernate
负责创建Session对象
需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够, 当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
Session接口
类似于connection对象
负责执行被持久化对象的CRUD操作
Hibernate的session不同于JSP应用中的HttpSession
Transaction接口
Transaction接口负责事务相关的操作
Query和Criteria接口
Query和Criteria接口负责执行各种数据库查询
2.添加数据
3.在控制台显示执行的SQL语句操作
4.修改数据
5.删除数据
注意:根据主键删除数据,即使对象中有其他数据也不会作为删除条件
6.注意:执行的步骤要搞清楚,面试的时候问hibernate的执行流程就是这5个步骤!!!
主键的生成策略
Oracle
assigned
identity
native
SQL
assigned
sequence
类型说明
assigned
主键由外部程序负责生成,无需Hibernate参与。
hilo
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。
高低算法
increment
主键按数值顺序递增
identity
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制
sequence
采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence
native
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式
uuid.hex
由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键
uuid.string
与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)
foreign
使用外部表的字段作为主键。一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性
举例说明
不存在的字段表自动创建
hbm2ddl
update
只会影响数据的字段
create
如果不存在,会删除相关表结构,再新建,效率低!!!
2.hibernate查询
1.Session接口中的方法介绍
beginTransaction()
事务
void delete(Object object)
删除与该对象关联的数据里内的一条记录
Serializable save(Object object)
将一个实体实例持久化,返回该持久化实例的id。在持久化之前必须手动或自动的指派id。
void update(Object object)
通过给定的分离状态的实例的id更新数据库记录
saveOrUpdate()
兼具了save()和update()方法的功能,该方法根据传入参数的状态执行不同的操作, 当为临时状态时,调用save()方法; 当为持久化状态时,则直接返回; 当为游离状态时,调用update()方法
merge()
主要用于更新和保存实体, 当实体不存在是,则执行保存操作, 当实体已经存在时,执行更新操作, 其实同saveOrUpdate()的功能是类似的。
clear()
清除缓存
evict(Object object)
清除某个缓存,有点类似:session.removeAttribute(o);
close()
关闭会话
flush()
可以强制进行从内存到数据库的同步
2.VO,PO 介绍
Hibernate的对象有3种状态
瞬时态(Transient)
瞬时对象和脱管对象也称为VO(Value Object)。
持久态(Persistent)
处于持久态的对象也称为PO(Persistence Object)
持久对象具有如下特点
和session实例关联
在数据库中有与之关联的记录
脱管态(Detached)
瞬时对象和脱管对象也称为VO(Value Object)。
实例
3.get和load方法的区别
作用根据主键查询数据
get
查询数据不存在返回null
没有采用延迟加载
load
查询数据不存在报错误
采用延迟加载【懒加载】
查询返回的是代理对象
如果查询的代理对象没有使用,不会进行真正的查询
4.HQL查询
1.概念
HQL(Hibernate Query Language)针对hibernate的查询语言
HQL和SQL的比较
HQL
完全面向对象,对象名 属性
类名,属性名 是区分大小的
关键字不区分大小写
SQL
面向关系型数据库,表名 字段名
具体查询操作
1.多行一列
输出用Object接受
2.多行多列
输出用object[]
3.多行所有列
用对象接受,不能用*
4.查询统计数据
uniqueResult()
返回结果是long
count(1) 不被支持
5.带条件查询
1.占位符
2.命名参数
3.Map
4.对象
6.分页查询
7.批量修改
8.批量删除
5.容器查询
6.原生本地SQL查询
1.多行一列
2.多行多列
3.多行所有列
4.查询统计数据
列别名,及指定返回类型
5.其他的差不多
2.作业
3.面试题