•下面我们做一个测试,假设有如下场景:
•一个班级(Classes)有多个学生(Student)
•两个实体之间是一对多的关系
•使用对象序列化来实现信息的存储和查询
–代码演示这个过程
- 可行性分析
•利用Serializable实现的持久层怎样算是一张表?
•新增、修改、删除如何实现?
•怎么查询?
•代码演示上面三个问题?
不适用Serializable做持久层的理由
•Serializable是java所提供的,与Java的耦合度比较高。扩展性不好。
•序列化的对象一旦被保存为二进制文件后,可读性不强
•序列化方式是基于类本身的,当类的签名(serialVersionUID)发生变化,将不能恢复。
•在序列化与反序列化时性能降低
Serializable来替代数据库要遵循的准则
选择怎样的方式来实现持久层
•持久层构建方案:
•纯JDBC的构建
•JDO
•IBatis
使用JDBC设计Dao层的考虑
•对每个表都生成entity
•为项目需要的关键表设计Dao
•每个Dao都依赖对应entity
•每个DAO的方法返回如果是实体集合,则返回Collection类型
•每个Dao的方法如果是增删改的逻辑,则返回int(表示成功、失败)或void(表示失败利用异常来捕获)
•每个Dao的findByxxx方法都要考虑主从表与表间关系的查询
•每个Dao层增删改方法都要考虑当一对多、多对一、多对多关系时所应该对其他数据库表的操作
•如果业务中对主从表关系明确,而从表的数据并不一定要即时出现时,则需要考虑使用“延时加载”策略
•如果业务中对数据库表中关系明确,需要考虑使用SQL语句,将所有内容查询出来,而不是利用Java的语法实行多条SQL。
•当主从表关系明确时,主表对数据库的读写操作频繁存在,而同时DAO对主表的更新方法会连带持久化从表时,为了避免过多的开销,有必要针对从表Entity实现“脏检查”策略
O/R Mapping方式的持久层
•Hibernate、EJB3.0、JDO、IBatis都属于O/R Mapping方式的框架。当前业界最流行的是Hibernate和IBatis。
•真正的面向对象,设计者只关心需求人员给出的业务对象,并设计成Entity,至于entity所对应的表结构,并没有任何意义。数据库只是持久化的工具而已。
为什么选择O/R Mapping方式的持久层
•最重要的原因是开发效率
•在使用Jdbc的开发中开发人员要花费大量的时间做与业务无关的事情(比如:提供连接,提供PreparedStatement、提供ResultSet、实现连接、预处理SQL、对SQL传值等等)
•忽略主旨的业务关注细节的点滴开销会太大,所以选择O/R Mapping框架是最合理的。
•这样可以把心思放在设计和业务逻辑上
O/R Mapping方式的持久层实现策略
•对每个表都生成entity
–解决方案:在Hibernate中利用XML来配置表与实体之间的映射
•为项目需要的关键表设计Dao
•每个Dao都依赖对应entity
•每个DAO的方法返回如果是实体集合,则返回Collection类型
•每个Dao的方法如果是增删改的逻辑,则返回int(表示成功、失败)或void(表示失败利用异常来捕获)
–上面四点都不是持久层框架考虑的因素,而是由设计师来设计Dao模式
•每个Dao的findByxxx方法都要考虑主从表与表间关系的查询
–解决方案:在Hibernate中利用XML映射了主从表和表间的关系。按照持久化传播性的原则,允许开发者抓取主表所对应的实体对象,而同时也将从表所对应的实体对象,而同时也将从表所对应的实体对象一起抓取
•每个Dao层增删改方法都要考虑当一对多、多对一、多对多关系时所应该对其他数据库表的操作
–解决方案:设置cascade
•如果业务中对主从表关系明确,而从表的数据并不一定要即时出现时,则需要考虑使用“延时加载”策略
–解决方案:设置Lazy属性
•如果业务中对数据库表中关系明确,需要考虑使用SQL语句,将所有内容查询出来,而不是利用Java的语法实行多条SQL。
–解决方案:Hibernate自带的HQL可以实现与SQL语句同样强大的功能
•当主从表关系明确时,主表对数据库的读写操作频繁存在,而同时DAO对主表的更新方法会连带持久化从表时,为了避免过多的开销,有必要针对从表Entity实现“脏检查”策略
–Hibernate中,对于脏数据有良好的支持,Antlr框架自动解释hql生成sql。
•除此之外Hibernate还提供了
–缓存的支持(可以读取之前已经查询过的数据)
–从映射文件自动生成表结构
•选择O/R Mapping方式的持久层意味着一种传统设计方案的倒置:由“从数据库->对象”的方式转变为“对象设计->数据库”的方式。
•优点:
–开发效率的提高
–轻量级的封装
–具有更好的扩展性