我今天学习了徐老师讲的hibernate知识,我做了简单的笔记:
一、Hibernate
a) 连接java应用程序和关系型数据库的中间件,对JDBC API封装,负责对象持久化
b) 位于持久化层,封装所有的数据访问细节,使业务逻辑层更关注于业务逻辑,一种ORM映射工具。
二、Hibernate API
1.Configuration 配置hibernate,根启动hibernate,创建
sessionFactory对象。
2.SessionFactory 初始化hibernate,充当数据源代理,创建
session对象。线程安全的,可被多个线程共享。重量级的,
需要一个很大的缓存,用于存放于定义的sql语句和映射元数
据等。用户还可为它配置一个缓存插件,称为二级缓存。
3.Session 使用最广泛,也被称为持久化管理器,它提供和持久
化相关的操作。增、删、改、查等。不是线程安全的,避免多
个线程共享。轻量级的,创建和销毁不需要消耗太多资源。
Session中有一个缓存,称为一级缓存。存放当前工作单元加
载的对象。
4.Transaction hibernate数据库事务接口,
它对底层的事务接口作了封装.底层事务接
口包括:
JDBC API
JTA(java Transaction API)
CORBA(common object request Broker architecture)
5.Query和Criteria接口:都是查询接口,query实例
包装了HQL查询语句,hql是面向对象的,他引用类
名及类的属性名,而不是表名和字段名。Criteria接
口完全封装了基于字符串形式的查询语句,比
query接口更面向对象,他擅长执行动态查询。
sessoin接口的find方法也具有数据查询功能,但他
只是执行一些简单的hql查询语句的快捷方式,远没
有query接口功能强大。
三、对象-关系映射
a) 在持久化类的方法中加入程序逻辑
不管在类中是否存在name属性,只要在Customer.hbm.xml文件中映射了name属性,在hql语句中就能访问他。
<property>
insert属性 若为false,在insert语句中不包含该字段,该字段永远不能被插入。默认值true。
<property>
update属性 若为false,update语句不包含该字段,该字段永远不能被更新。默认值为true。
<class>
mutable属性 若为false,等价于所有的<property>元素的update属性为false,整个实例不能被更新。默认为true。
<class>
dynamic-insert属性 若为true,等价于所有的<property>元素的dynamic-insert为true,保存一个对象时,动态生成insert语句,语句中仅包含取值不为null的字段。默认false。
<class>
dynamic-update属性 若为true,等价于所有的<property>元素的dynamic-update为true,更新一个对象时,动态生成update语句,语句中仅包含取值不为null的字段。默认false。
四、映射对象标识符
a) Java按地址区分同一个类的不同对象.
关系数据库用主键区分同一条记录.
Hibernate使用OID来建立内存中的对象和数据库中记录的对应关
系。对象的OID和数据库的表的主键对应。为保证OID的唯一性,应
该让Hibernate来为OID付值。