Oracle(Thin driver)
oracle.jdbc.driver.OracleDriver
jdbc:oralce:thin:@192.168.0.250.1521:oracle
scott
tiger
hibernate :
开源O/R(Object Relational Mapping)映射框架
课程目标:
理解O/R Mapping原理
掌握Hibernate开发的相关知识
能使用Hibernate进行实际项目开发
Hibernate高手进级:性能优化策略
hibernate的开发步骤
1:导入包
2:建立与表对应的javaBean类及与表对应的xml配置文件;
3:建立连接数据库的配置文件:hibernate.cfg.xml;
4:获得SessionFactory 和 Session(分别等价与DataSource,Connection)
Configuration:xml文件的解析类;
configuration.configure(configFile);解析hibernate
sessionFactory = configuration.buildSessionFactory;
Session session = threadLocal + sessionFactory
Session session = threadLocal.get();
if(session == null){
session = sessionFactory.open();
threadlocal.set(session);
}
5:
1.Hibernate与Jdbc的区别:
直接使用JDBC操作数据库的步骤很繁琐;
JDBC操作的是关系型数据库;
我们用JAVA开发程序,则使用面向对象的编程思想;
Hibernate正是在这两种不同的模型之间建立关联,Hibernate给我们提供了利用面向对象的思想来操作关系型数据的接口;
如:save(User user)用jdbc与hibernate的区别;
hibernate的好处:
O/R的好处:操作简单;减少代码量
移置方便;减少缓存
缓存
无侵入性(轻量级框架);解决操作对象
是面向对象编程
不宜使用O/R:大批量的数据如:
OLAP(On-Line Analytical Processing 联机分析处理),
1: 以查询分析数据为主的系统;
如分析公司男女比例,公司本季度的业绩等分析为主的系统,
以返回单个值为主的系统;
2: dba做优化; 要求性能极高,如采用数据库的特性;
采用O/R:关系不复杂;
2.O/R framework: Hibernate ,JDO,Toplink,ibatis(object mapping ibatis,使用遗留的系统);
3.对象 —— 关系映射
属性映射(简单的属性,复杂的属性)
类映射
关联映射
一对一
一对多
多对多
4.简单的实例:
见:hibernate_simple工程文件,readme.txt说明
5.核心接口:
业务逻辑层:
Lifecycle
Validatable
持久层
Session,Transaction
Query,SessionFactory
JNDI JDBC JTA
Interceptor
UserType
6.持久化对象的状态:
Transient对象具有的特征:
* 不处于session缓存中,不被任何一个session实例关联
* 在数据库中没有相应的记录
Persistent对象具有的特征:
* 位于一个Session的缓存中,持久对象总是和一个session实例关联
* 持久对象和数据库中的记录对应
* 持久对象的变化会自动同步到数据库
Detached对象具有的特征:
* 不再位于session的缓存中,不被session关联
* detached对象是由persistent对象转变过来的,因此数据库中会存在一条记录与之对应
见rose图:持久化对象的状态.mdl
7.测试对象的生命周期:
hibernate_session工程文件
8.get和load的区别?
*load方法实现了Lazy(延迟加载或懒加载(lazy)),所以不会马上发出sql;
采用cglib代理实现,针对类产生代理类;
lazy是hibernate的重要特性;
采用load加载数据,如果数据库中不存在相应的数据,
那么抛出异常ObjectNoFoundException;
*get会马上发出sql进行执行查询;采用get方式加载数据,如果数据库不存在该的记录,则返回null;
9.Hibernate基本映射:
类-->数据库表
普通属性--> 表字段
通过<class>标签映射到数据库表,通过<property>标签将普通属性映射到表字段
所谓普通属性,不包括自定义类,集合类和数组等。
实体类四条主要的规则:
* 实现一个默认的(即无参数的)构造方法(constructor)
* 提供一个标识属性(identifier property)(可选)
* 使用非final的类 (可选),如:load方法得到的是cglib的代理类,即它的子类,而final为终态类;
* 为持久化字段声明访问器(accessors)(可选)
<hibernate-mapping>的属性:
package
<class>元素的属性说明:
dynamic-update
dynamic-insert
batch-size
optimistic-lock
lazy
<id>元素的注意事项:
*id生成器:native(是sequence:必须在oracle中建hibernate_sequence),数字型的主键;
increment
identity
assigned
foreign
uuid(字符)
效率最高的是:uuid
*unsaved-value
property元素的属性:
column;
type:java的类型,hibernate的自定义类型;
formula:值由其它属性计算得到;
lazy
unique
not null;
主要:javabean的属性名称,类名不能与sql中的保留字相同。
10 hibernate.cfg.xml配置文件:
11 Hibernate多对一关联
关联映射的本质
* 是将关联关系映射到数据库中,关联关系在对象模型中体现为内存中的一个或多个引用
<many-to-one>标签会在“多”的一端添加一个外键,指向“一”的一端,这个外键是由<many-to-one>
标签中的column属性定义的,如果忽略column属性,默认创建的外键与属性名相同
重点注意:说明持久对象不能引用瞬时状态的对象,所以抛出TransientObjectException异常;
<many-to-one>标签的定义实例:
<many-to-one name="group" column="relatedGroup"/>
可以指定class属性,如果不指定Hibernate会自动找其关联类
理解级联的含义:
//通过级联,是解决TransientObjectException异常的一种手段
12 Hibernate一对多单向关联映射
这种映射的本质是利用了多对一的关联映射的原理
多对一关联映射:是在多的一端添加一个外键维护多指向一的关联引用
一对多关联映射:是在多的一端添加一个外键维护一指向多的关联引用
也就是说,一对多和多对一的映射策略是一致的,只是站的角度不同
缺点:
* 更新student表中的classesid字段时,需要对每一个student发出一个update的sql,
来更新classesid字段
* 如果将t_student表中的classesis设置为非空,则不能保存student数据,因为关系是由
classes维护的,在保存student时,还没有对应的classesid被生成