| 软件开发的分层思想: 三层架构:
| |
数据表现层 |
业务逻辑层 |
数据持久层 |
| SUN的桌面应用 |
Swing AWT |
普通Java类 |
JDBC |
| SUN的WEB基本应用 |
JSP |
普通Servlet |
JDBC |
| SUN的WEB高级应用 |
JSF |
SessionBean |
Persistence |
| WEB国内流行开源 |
Struts |
Spring |
Hibernate |
一、 对象持久化的理论 1.对象持久化:内存中的对象转存到外部持久设备上,在需要的时候还可以恢复。 2.对象持久化的原因(目标): 物理: 1) 内存不能持久,需要在硬盘上持久保存 //(物理上,物理的都不是根本原因) 2) 内存容量有限,需要在容量更大的硬盘上保存 应用: 3) 共享(Internet的本质:信息的收集、整理、发布) //最重要的原因 4) 检索(大规模) //也很重要 5) 管理(备份、安全) 3.怎样进行对象持久化?(仅从JAVA方面讲) 物理: 1) 对象序列化 2) DB技术(JDBC 数据库) 4.怎样利用数据库做对象持久化? 1) JDBC 优点:功能完备、理论上效率高 缺点:复杂(难)、代码量大、面向R(过程;二维表关系) 2) EJB 仅讲Entity Bean 优点:封装JDBC 缺点:更复杂的API、重量级(侵入式)、功能不完备、难共享 缺点的后果:开发周期长、测试困难、面向过程 以上是 2.0之前的版本,但 3.0跟Hibernate基本一样 3) ORM 轻量级框架(Hibernate) 现阶段最佳的持久化工具:文档齐全、服务很好、工业标准、大量应用、易学 优点:封装JBDC、简单的API、轻量级(只做持久化)(用类库)、PO(持久对象)->POJO(纯JAVA)、开源 缺点:不够JDBC灵活 5.结论: 1)对象持久化是必须的 2)必须使用DB来实现 3)Hibernate必须的(现阶段最佳选择) 开源工具的通常问题:1.文档不全;2.服务不全;3.标准化不够 而Hibernate避免了所有这些问题 二、 ORM和Hibernate的相关知识(理解) 1) ORM:Object Relational Mapping 对象-关系映射实现了面向对象世界中对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。 2) Hibernate是非常优秀、成熟的O/R Mapping框架。它提供了强大的对象和关系数据库映射以及查询功能。
规范: 1.一个映射文件对应一个持久类(一一对应) 2.映射文件的名字和它所描述的持久类的名字保持一致 3.映射文件应该与它所描述的类在同一包中 po -> (pojo) -> oid(唯一,中性) -> getters/setters -> 构造方法 三、Hibernate核心API(理解) Configuration类: Configuration对象用于配置和启动Hibernate。Hibernate应用通过Configuration实例来指定对象-关系映射文件的位置或者动态配置Hibernate的属性,然后创建SessionFactory实例。 SessionFactory接口: 一个SessionFactory实例对应一个数据存储源。应用从SessionFactory中获取Session实例。 1)它是线程安全的,这意味着它的一个实例能够被应用的多个线程共享。 2)它是重量级的,这意味着不能随意创建或者销毁,一个数据库只对应一个SessionFactory。 通常构建SessionFactory是在某对象Bean的静态初始化代码块中进行。 如果应用只是访问一个数据库,只需创建一个SessionFactory实例,并且在应用初始化的时候创建该实例。 如果应用有同时访问多个数据库,则需为每个数据库创建一个单独的SessionFactory。 Session接口: 是Hibernate应用最广泛的接口。它提供了和持久化相关的操作,如添加,删除,更改,加载和查询对象。 1)它是线程不安全的,因此在设计软件架构时,应尽量避免多个线程共享一个Session实例。 2)Session实例是轻量级的,这意味着在程序可以经常创建和销毁Session对象, 例如为每个客户请求分配单独的Session实例。 原则:一个线程一个Session;一个事务一个Session。 Transaction接口: 是Hibernate的事务处理接口,它对底层的事务接口进行封装。 Query和Criteria接口: 这两个是Hibernate的查询接口,用于向数据库查询对象,以及控制执行查询的过程。 Query实例包装了一个HQL查询语句。 Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更面向对象。Criteria更擅长于执行动态查询。 补充:find方法也提供数据查询功能,但只是执行一些简单的HQL查询语句的快捷方式(已过时),远没有Query接口强大! 四、Hibernate开发步骤:(重点:必须掌握) 开始:(设置环境变量和配置) 在myeclipse里导入Hibernate的文件包(包括各数据库的驱动和其他的jar包,对版本敏感,注意各版本的兼容) 按hibernate规范编写名字为hibernate.cfg.xml文件(默认放在工程文件夹下) 步骤一:设计和建立数据库表 可以用Hibernate直接生成映射表。 Oracle里建表: create table t_ad (oid number(15) primary key, ACTNO varchar(20) not null unique,BALANCE number(20)); 步骤二:持久化类的设计 POJO---- POJO 在Hibernate 语义中理解为数据库表所对应的Domain Object。(此类中只含有属性、构造方法、get/set方法) 这里的POJO就是所谓的“Plain Ordinary Java Object”,字面上来讲就是无格式普通Java 对象, 简单的可以理解为一个不包含逻辑代码的值对象(Value Object 简称VO)。 步骤三:持久化类和关系数据库的映射 编写*.hbm.xml文件---该文件配置持久化类和数据库表之间的映射关系 Xml代码 
一个实体对应一个xml文件,组件用id,非组件用property。 *.hbm.xml文件样板: Xml代码 
步骤四:Hibernate配置文件 hibernate.cfg.xml或hibernate.properties 1.需要配置那些信息:持久化映射,方言,特性,登陆信息 多数使用默认的设置。 A、dialect:方言,就是拼驱动程序和SQL语句。每种数据库对应一种方言其实就是指定了用那一种数据库。 Oracle数据库方言:org.hibernate.dialect.OracleDialect MySql数据库方言:org.hibernate.dialect.MySQLDialect B、Object Persistence:对象持久化。把内存中的数据保存到一个永久的介质中,比如说数据库。 C、ORM:对象关系映射,是一个自动的过程 注:持久对象与临时对象最大的区别是有没有数据库id标识
|