Hibernate笔记全.docx
- 文档编号:26639743
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:30
- 大小:26.53KB
Hibernate笔记全.docx
《Hibernate笔记全.docx》由会员分享,可在线阅读,更多相关《Hibernate笔记全.docx(30页珍藏版)》请在冰豆网上搜索。
Hibernate笔记全
Hibernate休眠冬眠
作用:
用来简化数据库访问(增删改查)
它是一种ORM框架
Objectrelationshipmapping
Java对象关系(型DB)映射(java对象和数据之间的对应关系)
实体类(需要默认的构造方法,不能加final)--表
属性--列
一个对象--一行数据
1.hibernate使用步骤:
1.添加jar:
中文文档的位置:
Javadoc文档的位置:
Jar包目录:
Ojdbc.jar
Project源码:
2.配置文件:
src\hibernate.cfg.xml
a.连接数据库:
b.数据库类型:
c.映射关系文件的所在位置:
3.建立数据库表和实体类之间的映射关系:
实体类中建立
映射文件:
mapping(***)
*.hbm.xml
4.用api进行增删改查
Connection
PreparedStatement
ResultSet
类:
Configuration对应hibernate.hbm.xml
接口:
SessionFactory:
创建Session对象
接口:
Session(是hibernate提供的用来执行增删改查)
.save(实体对象)-----增加
Configurationcfg=newConfiguration().configure();//1.获得配置对象,代表hibernate.cfg.xml
SessionFactorysf=cfg.buildSessionFactory();//2.创建session工厂
Sessionsession=sf.openSession();//3.创建session对象//打开新的session
session.beginTransaction();//4.增删改需要事务控制Transaction.commit().rollback()//事务开始
Studentst=newStudent();
st.setName(“z行三”);
st.setAge(12);
st.setBirthday(“1988-02-11”);
st.setScore(100);
Session.save(Student);
session.getTmit();
Session.close();
.update(实体对象)-----修改:
将所有属性都赋值
1
2
.delete(实体对象)-----删除
1
2
.get(实体类名.class,id);-------根据id进行查询
Configurationcf=newConfiguration().configure();
SessionFactionsf=cf.buildSessionFactory();
Sessionsession=sf.openSession();
Updatetablesetcolumn=?
;
5.查询多条记录:
SQL()面向的是表条件比较时用列名
使用HQL(hibernate查询语言)面向的是对象,条件比较时使用属性名
FromUser查询所有用户的对象
FromUserwhereusername=?
用户名属性进行查询
Queryquery=session.createQuery(hql);//创建一个查询对象
List<查询的实体类型>list=query.list()//执行查询
HQL:
语句:
Hql:
fromUserwhereusername=?
;
query.setString(0,username);//下标从0开始;不会有hql注入攻击问题
Hql中也有支持?
占位符的,好处可以避免注入攻击,下标从0开始
6.hibernate改写dao.service
主键生成器
1.Assigned:
主键值由自己赋值
当用户名作为主键时
2.Increment:
找到原有数据中主键最大值+1,作为新的主键值
不能用于并发插入,容易产生主键冲突的错误
3.Sequence:
Createsequencesequence_seqstartwith10;
Hibernate.cfg.xml配置:
--显示hibernate底层sql时-->
4.Seqhilo:
可以让一个序列值对应多个id主键值,目的就是为了提高效率减少查询数据库的次数
5.如果使用mysql,sqlserver
需要使用identity的主键生成器
6.Native
当底层数据库是oracle,db2等支持序列的数据库时,native==sequence
当底层数据库是mysql,sqlserver等支持自增主键的数据库时,native==identity
关系映射:
1.一对一:
用户表与用户详情表
2.多对一:
部门与员工,商品和类别。
。
。
3.多对多:
学生与课程商品和订单。
。
。
多对一:
将外键建在多的一方,来表示多对一关系
员工和部门:
数据库:
Createtableemp(
Cidnumber(10)primarykey,
Enamevarchar2(20)
Didnumber(10)referencesdep
);
Createtabledep(
Didnumber(10)primarykey,
Dnamevarchar2(20)
);
Java:
方法:
可以双向表示
publicclassEmp{
privateinteid;
privateStringename;
privateDeptdept;
.......................
publicclassDept{
privateintdid;
privateStringdname;
privateSet
.......................
映射文件:
xxx.hbm.xml
多对一配置:
--name="集合关系属性名字"
inverse反转意思是由另一方(
order-by="列名asc|desc"
cascade="save-update,delete"级联新增、级联删除
-->
--
length="字符长度"
not-null="true"添加非空约束
unique="true"添加唯一约束
sql-type="自定义类型"
-->
--多对一关系
name="关系属性名"
column="外键列名"
-->
注意:
在双向关联情况下:
两方都会给外键赋值(维护关系),但实际有一方来维护关系就足够了,
级联方式:
cascade=”save-update”(级联保存或更新)
Deptd=
Empe1=
Empe2=
Session.save(d)//保存部门时同时保存关系属性中的所有员工
//Session.save(e1)
//Session.save(e2)
级联方式:
cascade=”delete”(级联删除)
经验:
只有当两个实体类的关系特别紧密,才需要考虑级联
适合快速开发(当项目规模较小时):
根据实体类(映射文件)==》生成表
根据表==》实体类和映射文件
Hibernate的延迟(懒)加载
Lazyloading
延迟加载现象:
当处理关系属性时,查询关系属性所对应的sql,不是立即执行,而是被延迟到要用到这种表的数据时才会执行。
集合关系属性。
用到时才会查询,用不到就不会执行多余的查询
//hibernate在运行时,动态生成了关系属性的子类对象
//子类对象中进行了判断,引用了session.get(),去查询关系表
这种偷梁换柱的思想:
代理模式
单例模式
一对一外键+唯一约束
createtableday3_person(
pidnumber(10)primarykey,
namevarchar2(20)
);
createtableday3_person_detail(
didnumber(10)primarykey,
sexvarchar2(3),
heightnumber(3),
pidnumber(10)referencesday3_person(pid)unique
);
·pidname
1张三
didsexheightpid
1男1701
2女1691(非法)
--没有外键的一方,要使用one-to-one映射
name="关系属性名"
property-ref="另一方的关系属性名"为了能从这个属性中,获取外键信息
-->
--有外键的关系属性,仍使用many-to-one,多加unique-->
有外键的一方:
没有外键的一方:
3.多对多
实体类:
两种情况:
a.三张表对应三个实体类(当中间表有除外键之外的其他属性时)
把一个多对多关系,拆分成两个一对多关系
--可选的-->
--可选-->
b.三张表对应两个实体类(中间表不对应/中间表只有两个外键时)
--table="中间表的名字"-->
--column="中间表中对应学生的外键"-->
--many-to-many用来配置中间表如何连接到另一张表-->
Hibernate:
中实现分页查询
Queryq=session.createQuery(hql);
q.setFirstResult(本页第一条记录的下标);//05
q.setMaxResults(每一页的记录数/pageSize*pageNo);//5
q.list();
1.session中的其他方法
1.1session.get(实体类.class,id);//无延迟加载的特性;//查询一个不存在的对象,返回null
session.load(实体类.class,id);//有延迟加载,返回的是一个代理子类对象;//查询一个不存在的对象,不报错,返回代理对象,但使用对象的属性时,打印报错
Print(emp.getClass());
1.2一级缓存:
执行多条相同代码时,只执行一条语句:
开始执行时缓存没有,只能查询数据库,找到了,将数据放入缓存(全局的map对象)(key:
value:
),缓存中有,不查询数据库;提高查询效率
生命周期:
随着session的打开而创建,随著session的关闭而销毁
Session创建,就会为此session创建一个一级缓存
Session关闭,一级缓存的内容就会被销毁
一级缓存中只能按照对象的类型和id缓存单个对象,不能缓存hql查询的list集合,但会把集合中每个对象元素依次取出,放入一级缓存
Get/load优先查询一级缓存,数据更改同步数据库数据一致性
1.3hibernate对象的三种状态:
1.瞬时状态:
(Transient)
实体对象不对应数据库中一条记录,称为瞬时状态
情况1:
Empemp=newEmp();
emp.setName(“zhangsan”);
情况2:
Empemp=(Emp)session.get(Emp.class,id);
Session.delete(emp);
Print(emp);//数据库没有,缓存有
2.游离(脱管)状态:
(Detached)
实体对象在数据库中有相应记录,但此对象不受到session的管理,称为游离状态
3.持久化状态:
(Persistent)
实体对象在数据库中有相应记录,并且受到session的管理,称为持久化状态
持久状态的对象发生改动,hibernate就会在(事务提交时mit;)将数据改动同步到数据库中
持久化状态对象都存储在一级缓存当中
对象状态的转换:
~~~~~~~~瞬时-->持久
Empemp=newEmp();
emp.setName(“zhangsan”);
Session.save(emp);//将瞬时状态的对象转换为持久状态的对象:
将emp交给session管理,并放入了一级缓存
Session.getTransaction().commit();//将一级缓存中变动的对象放入数据库中
~~~~~~~~持久-->瞬时
Empemp=(Emp)session.get(Emp.class,id);
Session.delete(emp);//持久化状态的对象转换为瞬时对象
~~~~~~~~游离-->持久
Empemp=newEmp();
emp.setId
(1);
emp.setName(“zhangsan”);
Sess
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hibernate 笔记