- dmewy
- 等级: 初级会员

- 性别:

- 文章: 35
- 积分: 0
- 来自: 上海

|
基于B/S的典型三层架构

- “持久”简单的来讲就是把数据保存到可掉电式存储设备中供之后使用,特别是企业应用中,数据持久化也就意味着将内存中的数据保存到硬盘上加以”固化”,持久化的过程大多通过关系型数据库完成
- 所谓的持久层,也就是在系统中一个相对独立的逻辑层面,专注于数据持久化逻辑的实现
- 与系统其他部分相对而言 这个部分应该有一个较为清晰和严格的逻辑边界
如何进行对象-关系数据库的匹配?
public class User { private String name; private String password; private List address; ……… } create table tbl_user ( name varchar(255) not null , password varchar(255), ………. primary key (name) )
|
| 对象 |
关系数据库 |
| 类的属性(基本类型) |
表的列 |
| 类 |
表 |
| 1:n/n:1 |
外键 |
| n:m |
关联表 |
| 继承 |
单表继承,具体表继承,类表继承 |
- 粒度(granularity)的问题
- 子类型(subtypes)的问题
- 同一性(identity)的问题
- 与关联(associations)有关的问题
- 对象结构导航(navigation)的问题
-
- 范式不匹配的代价
- 花费很多时间和精力来手工实现对象和关系的匹配。
- 甚至要扭曲对象模型直到它与下层的关系技术匹配为止。
- JDBC API本身的问题。JDBC和SQL提供了一个面向语句(即命令)的方法从SQL数据库中来回移动数据。至少在三个时刻(Insert,Update,Select)必须指定一个结构化关系,这增加了设计和实现所需要的时间。
基于关系数据库的持久层可选方案
| |
优点 |
缺点 |
| Apache OJB |
性能、稳定性,属于Apache 基金组织 |
文档资源太少,支持标准太多成了负担(ODMG 3.0,JDO1.0) |
| iBATIS |
可以控制更多的数据库操作细节。实用于遗留系统的改造和对既有数据库的 复用 |
持久层封装不够彻底,只是一个DBHelper。 |
| Hibernate |
成熟、流行、功能强大。并逐渐发展成Java 持久层事实上的标准。 |
不够透明 |
基于关系数据库的持久层可选方案
| |
优点 |
缺点 |
SQL/ JDBC |
成熟,流行,使用DAO模式 |
代码烦杂,可读性差,维护困难,移植困难 |
| Entity Bean |
CMP(EJB1.1之后),未来的EJB3 |
错误的设计。不可移植,依赖性强,不可序列化,不支持多态的关联查询 |
| JDO |
简单、透明、标准 |
不够成熟 |
- ORM,即Object-Relationl Mapping,O/R Mapping主要解决对象层次的映射、对象关系的映射以及对象的持久化问题。 这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。
-
- O/R Mapping作为面向对象数据库编程中的重要术语,由Martin在其2003年出版的重要著作《Agile Software Development:Principles、Pattens、and Practices》中提到。其所谓的“对象/关系映射”指的是应用程序中使用到的生命短暂的对象与数据库中可以持久保存的记录之间所建立的一种一致性关系,这种关系使得应用程序对关系数据库中的存储、访问操作简化为对实体对象的操作,同时隐匿了数据持久化工作的复杂性。这种映射关系可以是双向的。
- 把概念上的类正向映射到数据库的表。
-
- 把数据库的表反向映射到概念上的类。
-
- 把设计好的类正向映射到数据库的表。因为设计好的类已经具有了属性和操作,因此映射这种映射不是静态的,它也需要考虑数据库表的活动的方面,
-
- 例如:存储过程和触发器。
- 把数据库的表反向映射到设计好的类。这种形式的映射需要解决数据库存储过程和触发器活动时对应用程序的影响
-
- 在程序内存空间中把表中的记录缓存为类的对象。这种情况多使用的运行期,而且要考虑数据库的事务处理,返回数据库提交或会滚的结果。
-
- 所谓概念上的类是指那些只包含属性数据而忽略其操作方法的类,这些类通常作为一个数据容器,类似记录或数组。这使得其与数据库的表之间更容易映射。因此,这类O/R Mapping的挑战来自于类与表之间的关系处理 ,例如:继承、多重性(如:一对多或多对多等对应关系)
- 提高生产率(Productivity)
-
- 可维护性(Maintainability)
-
- 更好性能(Performance)
-
- 厂商独立性(Vendor independence)
- Hibernate概述
-
- Hibernate是非常优秀、成熟的O/R Mapping框架。它提供了强大的对象和关系数据库映射以及查询功能。
-
- Hibernate优势
-
- 开源(LGPL)
- 成熟
- 流行(约13 000 downloads/month)
- 自定义API
- JBoss 将用Hibernate3实现Entity Beans
Hibernate开发步骤
一:持久化类的设计
二:持久化类和关系数据库的映射.
三:应用的开发
- 为类的持久化类字段申明访问方法(get/set)。Hibernate对JavaBeans风格的属性实行持久化。
-
- 实现一个默认的构造方法(constructor)。这样的话Hibernate就可以使用Constructor.newInstance()来实例化它们。
-
- 如果是集合类型的属性,它的类型必须定义为集合的接口。例如:List、Set。
-
- 提供一个标识属性(identifier property)。如果没有该属性,一些功能不起作用,比如:级联更新(Cascaded updates)Session.saveOrUpdate()。
- XDoclet:它通过在Java源代码中加入特定的JavaDoc tag,从而为其添加特定的附加语义,之后通过XDoclet工具对代码中JavaDoc Tag进行分析,自动生成与代码对应的配置文件(http://xdoclet.sourceforge.net/)
-
- XDoclet提供了对Hibernate的支持,这样我们可以直接由Java代码生成Hibernate映射文件。
持久化类和关系数据库的映射
Middlegen: 从数据库中已有的表结构中生成Hibernate映射文件。
Hibernate核心接口
- 概述:Configuration 类负责管理Hibernate 的配置信息。它包括如下内容:
- Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。
- Hibernate映射文件(*.hbm.xml)。
-
- Hibernate配置的两种方法:
- 属性文件(hibernate.properties)。
- 调用代码:Configuration cfg = new Configuration();
- Xml文件(hibernate.cfg.xml)。
- 调用代码:Configuration cfg = new Configuration().configure();
-
- 数据库连接的配置
- hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
- hibernate.connection.driver_class com.mysql.jdbc.Driver
- hibernate.connection.url jdbc:mysql:
- hibernate.connection.username root
- hibernate.connection.password
- 数据库连接池的配置-DBCP(App Server连接池首选)
- hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider
- 配置DBCP连接池
- 其它
- hibernate.show_sql true
- hibernate.jdbc.fetch_size 50
- hibernate.jdbc.batch_size 25
- 概述:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂——例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。
- 会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。
-
- 调用代码:
- SessionFactory sessionFactory = cfg.buildSessionFactory();
- 概述:
- Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。
- Session也称为持久化管理器,因为它是与持久化有关的操作接口。
- Session通过SessionFactory打开,在所有的工作完成后,需要关闭。
- 它与Web层的HttpSession没有任何关系。
-
- 调用代码
- Session session = sessionFactory.openSession();
- 概述:
- 它将应用代码从底层的事务实现中抽象出来——这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)——允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。
- 调用代码:
- Transaction tx = session.beginTransaction();
-
- 注:使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)。
- 概述:
- Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言编写。
-
- 调用代码:
- Query query = session.createQuery(“from User”);

- public void testCreate() throws Exception{
- Configuration cfg = new Configuration();
- cfg.addURL(UserTest.class.getResource("/com/test/um/User.hbm.xml"));
- SessionFactory sessionFactory = cfg.buildSessionFactory();
-
- Session session = sessionFactory.openSession();
- Transaction tx = session.beginTransaction();
-
- SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd");
- User user = new User("Jack",format.parse("1980-04-12"),"Jack@yahoo.com.cn");
-
- session.save(user);
- tx.commit();
-
- assertNotNull(user.getId());
- session.clear();
- User user_2 = (User)session.get(User.class,user.getId());
- assertNotNull(user_2);
-
- session.close();
- }
接上
- 保存用户:session.save(user);
- 修改用户:session.update(user);
- 保存或修改用户:session.saveOrUpdate(user);
- 删除用户:session.delete(user);
- 删除所有用户:session.delete(“from User ”);
-
- 查询用户名为“test”的用户:
- Query query = session.createQuery("from User where user.name = :name");
- query.setParameter(“test",user.getName());
- User findUser = (User) query.list().get(0);
- 第一章.rar (131.1 KB)
- 描述: 这个能发的好短,很多代码一个帖子帖不全.
现把原PPT帖上!
- 下载次数: 20
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
| 返回顶楼 |
|
|