Hibernate_笔记
来源:互联网 发布:手机淘宝怎么退款 编辑:程序博客网 时间:2024/05/20 01:38
SSH:
H:Hibernate
Hibernate是一个持久层框架。
持久层:dao
JDBC:
Hibernate其实就是jdbc的一个轻量级封装。
JDBC:
去操作数据库表中的数据
关心:表 字段 类型
代码:写复杂的sql语句
hibernate:
实现一个映射关系。ORM
object relational mapping (对象关系映射)
类 表
属性(get/set) 字段
操作类中的属性 操作表中的字段
操作表中的记录 ==> 操作类的对象
设计:建好表结构 建立好映射关系
代码:关心你的业务 (不需要写复杂的sql)
hibernate: 是一个ORM框架。
实现关系映射:
hibernate如何实现关系映射?
主要由几个(配置)文件实现:
1,hibernate.properites hibernate.cfg.xml(使用)
cfg: configure/configuration 配置
主要的配置文件:一般建立在src目录下 主要有数据源的配置。
2,Xxx.hbm.xml 通常建议写在实体类包中 Xxx:可以随便写,但是建议写了与类名相同。
hbm: hibernate-mapping 映射文件 建立表与类的映射关系
使用hibernate框架:
1,引入hibernate相关的jar包
2, 配置hibernate.cfg.xml (数据源)
dialect:方言
3,编写映射文件 Xxx.hbm.xml
加入到hibernate.cfg.xml中
4,代码
介绍几个重要的API:
Configuration: 加载hibernate.cfg.xml
SessionFactory: 工厂模式 提供session 是线程安全的 线程共享的 本身非常消耗资源 只执行一次Session:提供了数据的CRUD方法 区别于用户session(HttpSession)(注:缓存:Session:一级缓存 SessionFactory:二级缓存)Transaction: 由hibernate提供查询时:Query HQL 给占位符赋值:setXxx(int/String,value); 查询:list(): uniqueResult(): 唯一的一个对象 (如果有多条 报异常) 更新:executeUpdate()
查询:
根据主键查询:
get/load
get:即时加载
先从session缓存中查找
如果找不到 则去数据库中查找
查不到 返回 null
查到 返回对象 并将该对象交由该session管理
直接使用
load:延迟(延时)加载 先从session缓存中查找 如果找不到 则去数据库中查找 查不到 返回 异常 ObjectNotFoundException 查到 返回对象 并将该对象交由该session管理 直接使用
对象的状态:
1,瞬时态(临时)
数据库中没有记录
2,持久态
数据库中有记录 并且被session管理
3,游离态(脱管)
数据库中有记录 但没有被session管理
这三种状态的转换(后面把方法都讲完。)
持久化操作的方法:
save(): 不关心ID,即时瞬时态对象的ID有值,在持久化过程时也不会被关心。
update():肯定关心ID,找到ID的记录,修改相应的值。
saveOrUpdate():
如果有ID,实现update()
如果没有ID,实现save()
User t_user
id id
firstName first_name
lastName last_name
age age
1,工程
2,导包
3,hibernate.cfg.xml
4, 实体类/表
5,User.hbm.xml
6, Test: main
Scanner sc;
while(true)
{
System.out.println(“1,添加用户\t2,删除用户\t3,修改用户\t4,所有用户\t5,平均年龄(根据姓分组)”\t0,退出
}
zhang 23li 18xu 19
11.17.
回顾:
hibernate:
持久层框架。
ORM:
关系:
单表:表 <===> 类
xxx.hbm.xml : 映射文件
hibernate.cfg.xml:
hibernate的一个配置文件 配置了数据源
API: Configuration :加载配置文件 SessionFactory: 提供session 加载很消耗资源的。 执行一次 Session: 提供了CRUD方法 get/load: 区别 get:即时加载 null load:延迟加载 异常 都会到缓存中查找 save update saveOrUpdate delete Transaction: hibernate中的事务。 HQL: ? 命名参数 :xx Query: list(): uniqueResult(): 只会查找唯一的一条数据 setXxxxk(x,y); x:占位符(从0开始)或者命名参数的名称 y:值 executeUpdate() setFirstResult() setMaxResults()
介绍一个更面向对象的查询接口:
Criteria:
list()
//有条件的话:
Restrictions eq like等
存在关系:
分析关系:
1,多对一
2,一对多
关系的维护 交给多的一方维护更好一点。
inverse=”true” 将关系的维护权交给多的一方。1这一方即时维护关系也失败。
3,多对多
通常将其拆成两个1多多的关系。
在对象模型中:关系维护只能交由其中的一方来维护。
4,一对一
基于主键
从对象的主键来之主对象的主键值
从对象的映射文件中
xxx
在<one-to-one constrained="true"/> constrained="true" : 建立了外键关系 关系维护只能交给从对象来维护。 (注: 根据主键查找: 如果查找主对象,默认即时加载从对象 1个SQL 如果查找从对象,默认延迟(懒)加载 2个SQL ) 基于外键: 如何体现1-1: unique="true" 关系的维护可以交给任意一方。5,继承 1,使用一张表来存储所有的数据 <subclass> 鉴别器 <discriminator ></discriminator> 好处:在多态查询时 效率是非常高 缺点:存在大量的null值。 2,为每个类建一张表 <joined-subclass> 子类对应的表引用父类表的主键作为外键 不会出现Null值 查询: 非多态查找:2张表 多态:n n+1 效率非常低6,组件
hbm2ddl.auto :
create-drop: SessionFactory实例化时创建 销毁时会删除表
create: 每次操作 都会先删除 再创建
update: 更新数据表结构,已有的数据不会被删除
validate: 仅仅验证一下表结构。
主键查找: 默认是延迟加载
解决这个问题:
1,映射文件对应的地方 fetch=”join”
2, hql fetch (建议)
连接查询:
内链接
inner join
外连接
左外连接
left join
右外连接
right join
cascade: 级联操作
none:不级联
save-update:保存和更新
delete: 删除
all: 包含save-update 和 delete
delete-orphan : 删除 “孤儿” 节点
all-delete-orphan: 包含以上所有的
练习:
订单 t_order 订单详情(t_orderdetail)
id id
order_num String productname string
order_time price double
number
order_id
XX20134k3
对象关系模型:
Order OrderDetail
orderNum
Set Order
1, 添加订单和详情 add() 可以尝试使用级联操作
1个订单 3条详情
2, 根据订单号(模糊) 查询订单 并显示订单下的所有详情
3,根据详情编号查处所在的订单 并显示该订单下的其它详情
4,给出订单号 获得订单下的所有详情价格的小计
练习:(晚上练习中使用1-n)
Teacher Student
id id
name name
score
t_id
1,根据教师id,查出该老师下所有学生信息。
2,查出所有老师名下的所有学生的平均分,并由高到低排序。
3,根据教师id,查询出该老师下姓氏为wang的学生的分数(模糊查询)。
11.19:
回顾:
1,hibernate数据关系:
多对一
一对多
- Hibernate_笔记
- Hibernate_学习笔记
- Hibernate_@注解
- hibernate_简介
- java 从零开始,学习笔记之基础入门<Hibernate_配置详解>(三十六)
- java 从零开始,学习笔记之基础入门<Hibernate_实战演练>(三十七)
- Hibernate_组件关联
- Hibernate_树状映射
- Hibernate_知识点复习
- Hibernate_事件监听
- Hibernate_对象有三种状态
- Hibernate_主键生成策略
- Hibernate_使用注解
- Hibernate_注解说明
- Hibernate_事件监听
- Hibernate_继承映射
- Hibernate_检索策略
- Hibernate_组件学习
- svn可以在本地使用的
- 3.1-3
- 链地址法+动态开辟内存 hash
- 疯狂Java学习笔记(60)----------8张图理解Java
- PHP & HTML学习
- Hibernate_笔记
- Java多线程与网络编程综合使用
- HTML5----移动head,meta标签属
- Vim常用快捷键-个人学习用
- 疯狂Java学习笔记(61)-----------40个Java集合面试问题和答案
- 最小公倍数
- Android RxJava使用介绍(二) RxJava的操作符
- ORACLE错误大全
- c标签 if else