hibernate的总结.docx
《hibernate的总结.docx》由会员分享,可在线阅读,更多相关《hibernate的总结.docx(17页珍藏版)》请在冰点文库上搜索。
![hibernate的总结.docx](https://file1.bingdoc.com/fileroot1/2023-5/28/37b17381-26a2-4c77-9693-22d6b1d42b1c/37b17381-26a2-4c77-9693-22d6b1d42b1c1.gif)
hibernate的总结
Hibernate框架:
1)jdbc有什么缺点?
a)代码难于维护
b)jdbc就是拼凑sql语句,然后发送数据库当中执行,对于程序员考虑问题,更多是对sql语句编写
c)jdbc的代码,过于复杂,任何操作,都必须要使用connection等接口
2)hibernate:
最本质其实就对jdbc的一个轻量级封装
对于程序员:
完全面向对象
对于数据库:
底层执行的依然是jdbc,拼凑sql语句,发送到数据库中执行
3)使用hibernate来取代jdbc,能最大化的减少程序员的工作量
2Hibernate优点和缺点
Hibernate:
底层运行jdbc,对程序员面向对象
1)优点
a面向对象
bhibernate代码相对于jdbc代码来说,至少减少三分之一,
使用hibernate可以减少工作量
chibernate比较简单
d开源(源代码全部公开)
e成熟:
使用时间较长,版本较多,比较稳定
f可以匹配后台任意的数据库
2)缺点
性能较差(尤其大型项目数据量非常大的时候,一定不要使用hibernate,
使用jdbc)
3Orm映射框架:
ORM:
对象到表的映射
用面向对象的思维方式,操作数据库中的表
Hibernate就属于比较优秀的开源(免费)ORM映射框架
配置连接信息:
dialect:
方言,跟据不同的配置不同的方言,可以让我们
hibernate写的代码,自动去匹配后台的数据,但对数据库
进行操作的时候,hibernate把发送sql语句,自动转化为
当前数据库的sql语句,而代码不用做任何的修改
2hibernate自身配置信息
show_sql:
hibernate底层运行的是jdbc执行sql语句,
把底层发送给数据库的sql语句,显示到当前控制台上,用于调错
3.Orm映射文件:
当前所有要执行orm映射文件,必须
全部配置hibernate.cfg.xml文件才被识别和使用
b)orm映射文件:
po类名.hbm.xml
从eg里:
po类《--------->Orm映射文件<---------》表
3)使用hibernate核心工具类
Configuration:
读取hibernate的核心的配置文件
hibernate.cfg.xml文件
SessionFactory:
a)重量级对象(功能强大,消耗资源较多),SessionFactory
重量级对象
b)可以创建Session对象
c)控制hibernate中二级缓存
d)控制配置文件hibernate.cfg.xml
e)。
。
。
尽量只创建一次
企业开发:
SessionFactory一般只创建一个,生命周期,从
项目启动到项目关闭(维护)位置,一个数据库只能对应一个
SessionFactory,最本质创建session对象
3)
Session
hibernate对外执行操作的对象
增删查改的操作全是都是通过session来实现的,
1使用session实现增删查改
1)查询get()
特点:
get(po类名.class,id):
根据id查询,返回的结果是
po对象
如果要查询的对象不在数据库中,返回值为null值
2)修改update(Po对象)
特点:
先查询要修改的对象,然后再使用update操作
(如果直接使用id,直接修改对象,容易出现没修改的列,全部使用
默认值)
eg:
test/SessionTest
3)删除delete(po对象)
detele(po对象)
4)load()重点
eg:
test/SessionTest
2延迟加载
1)定义:
当查询对象的时候,不是立刻发出sql语句,当访问该对象中
的某些属性,才真实的去数据库中查询数据
2)为什么hibernate需要延迟加载?
hibernate性能较弱,可以通过延迟加载的方式,以提高其性能,
减少无谓性能开销
3)load()使用了延迟加载,当查询对象的时候,hibernate并
没有发出任何的sql语句,返回一个代理对象,来暂时代替要查询对象
4)代理对象
动态代理:
由系统来帮我们生成对应的代理对象,可以为任何类生成
代理对象
企业开发中:
最常用有两种代理
a)cglib动态代理:
返回的是要代理对象的子类对象
eg:
父类对象=new子类对象
Empemp=cglib返回是Emp类的子类对象
3load()底层如何执行的
Empemp=(Emp)session.get(Emp.class,2);
---->load返回是cglib动态代理返回的一个代理对象(Emp的子类对象)
System.out.println(emp.getId());
---->不发送sql语句,id本身就有,不要去数据库中查询
System.out.println(emp.getEname());
---->真实的发送sql语句,当真正要访问该对象的时候,代理对象就会发出sql语句去
数据库中真实的查询
4对比get方法和load方法
get方法:
直接去数据库中查询根据id查询对应的数据,如果不存在,返回null
load方法:
先返回一个代理对象,只有真实去访问该对象的属性,才发出sql语句去数据库中真实的查询,
如果该对象不存在,抛出异常
5映射类型
hibernate映射类型:
1)整数类型
integer,long,byte,short
2)浮点数
float,double
3)字符串
string
4)日期(yyyy-mm-dd)
date
5)时间(HH:
MM:
SS)
time
6)日期+时间(yyyy-mm-ddHH:
MM:
SS)
timestamp
7)boolean---->char
(1)类型
yes_no:
把true---->Y,false---->N
true_false;
案例:
hibernate03
Person
6主键的生成策略
使用hibernate当前表的主键如何生成就是主键的生成策略
比如save(po对象),hibernate根据主键生成策略来生成对应的主键id值
1)identity
应用于数据库底层自动增长机制生成对应的主键,常用的mySQL,SQLServer
2)sequence
主键的值采用指定的序列生成,常用oracle,DB2
foo_seq(标识值)/parma>
3)native
根据方言dialect的不同,选择不同的主键生成方式,根据数据库自动匹配其对应的主键
生成方式(identity或sequence)
智能选项,使用最为广泛
比如mysql数据库,自动改为identity
Oracle数据库,自动改为sequence
4)uuid:
是hibernate自动的来帮我们生成主键,当插入数据的时候,随机生成一个不重复
的32字符串,作为主键的值
案例:
User3
5)assigned:
当前的主键交由程序员自己去维护,缺点:
当数据量过大,很难维护,开发使用较少
ernate(三)星期六9月28日
知识点
1多对一单向关联映射(企业开发中使用最为广泛)
“多”的一端来维护关联关系,在hibernate中,po类中含有对
一得一端的引用,在修改orm映射文件
eg:
员工----------》部门
学生----------》班级
市----------》省
1)现实生活中这些多对一得情况,可以转化数据库中的表的设计,多
对一的设计,hibernate可以帮我们来创建这种设计的表,也可以
操作这样类型的表
2)hibernate中最重要就是各种关联映射
oracle:
全是对单表的设计,讲过外键
真正的企业开发中的,永远是多表之间的关联关系
3)hibernate当中多对一关联映射
orm的映射文件,重点在多的一端,多的一端来维护关联关系
//维护多对一得关系的标签
//name:
po类中的引用属性
//class:
当前跟那个类有关联关系(主键)
//column:
维护该关联关系的外键的名字,
//该值是class这个类的主键的值
class="com.po.Dept"column="did"
>
orm文件中,指定表的名字(table="t_dept"),字段的名字(column="did"),各种约束(unique="false"not-null="true"),字段长度(length="")
案例:
hibernate06
2一对多关联映射
"一"的这一端来维护关联关系
eg:
customerorder
1)po类
publicclassCustomer{
privateintid;
privateStringcname;
privateSetorders;
...
}
保存多个数据:
数组和集合
数组:
元素个数固定
集合:
list:
特点跟数组及其相似,有序
set:
特点跟数学中的集合很相似,无序
map:
一一对应(key---value)
在这里我们选择使用set集合,order数量不固定,无序
2)hibernate特点:
通过orm映射文件设置表,操作表
对于程序员:
考虑对象之间的关系,而不是表与表之间的关系,
使用hibernate时候,操作是po对象,思考po类之间的关系
当编写orm映射文件:
必须考虑表和表对应的po类之间关系
编写好orm映射文件之后,所有对数据库中表的操作,全部都是对
po对象的操作,hibernate底层去操作表
3)一对多映射文件
--一对多关联,由一的一端来维护关联的关系,在表上面的体现,由
一的一端在多的一端的表上创建外键cid,值是当前一的这端
表的主键的值
-->
4)可以对po类对象任意的操作,都会对t_order和t_customer产生影响
案例:
hibernate07
3多对一双向关联映射
双向:
双方都来维护彼此的关联关系
注意:
orm映射文件中,列名要注意
修改hibernate07案例:
一的一端
多的一端
class="com.po.Customer"
column="cid"
>
如果是双向关联,多的一端维护的关联关系的外键名字必须跟
一端保持一致(维护双方关联关系外键的名字必须一致)
4关联映射中的两个属性
1)inverse:
"反转",hibernate含义,是否放弃维护关联关系
默认值是false:
维护两张表的关联关系
true:
放弃维护两张表的关联关系
2)cascade:
"级联",一张表发生变化,另一张与之关联的表也
发生了变化
a)save-update:
与之关联的表也随之发生save()/update()/saveOrUpdate();
b)none:
默认值,任何情况下都不进行任何关联操作
"一"的一端被删除,“多”的一端仅仅删除关联关系,即外键的值
c)delete:
与之关联的表也随之发生执行delete操作
d)all:
包含save-update和delete,企业开发中
最常配置的参数
e)all-delete-orphan:
除了all的功能以后,还能从
集合端删除
5多对多单(双)向关联映射
一家公司
员工职位
多对多:
表------》3张表,其中一张表维护关联关系
hibernate当中
po类-----》2个po类,第3张表关联表是由维护关联关系
一端来通过set标签来创建
--set:
多对多,创建第3表,维护多对多的关联关系
table------第3张表的名字
uid的值是当前主键的值
jid列的值,是Job的主键的值
-->
1多对多双向关联映射
hibernate08
column="uid"
>
2一对一主键(单向)关联映射
表:
t_person:
(id,pname)
t_card:
(id,cardNo)
一对一:
两张表中的数据,必须是一一对应的才可以
hibernate实现这样的表,有两种方式,
一对一主键单向关联映射:
两张表的主键,必须是一样的,也就是两张表共用同一个主键
//当前person的主键参照外键
card
//参照的是自身的属性(property),是card属性的值
//关联到card这个类,值默认就是Card的主键的值
class="Card"constrained="true">
一对一主键关联映射默认,cascade级联属性(save)(cascadem默认有个保存操作)
3一对一主键(双向)关联映射
hibernate09
Person.hbm.xml代码:
card
--constrained="true"维持约束关系-->
Card.hbm.xml代码:
4一对一外键(单向)关联映射
一对一外键(单向)关联,是多对一的特例,要求维护关联关系的外键,约束是唯一
案例:
hibernate10
column="cardId"unique="true">
5一对一外键(双向)关联映射
案例:
hibernate10
column="cardId"unique="true">
property-ref="card">
注意:
property-ref="card"(重点):
对应表中cardId的值,要Person中
的cardId的值与Card中的id主键值相对应
property-ref="card":
对应t_person表中cardId的值,要t_person中的
cardId的值与t_card中的id主键值相对应,避免录入空数据,有时候在t_card中会录入空值,
避免了t_person在于t_card对应的时候,读到空值,而造成两个表的数据错位