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数据关系:
多对一
一对多

0 0
原创粉丝点击