Serializable替代数据库

•下面我们做一个测试,假设有如下场景:

•一个班级(Classes)有多个学生(Student)

•两个实体之间是一对多的关系

•使用对象序列化来实现信息的存储和查询

–代码演示这个过程

  1. 可行性分析

•利用Serializable实现的持久层怎样算是一张表?

•新增、修改、删除如何实现?

•怎么查询?

•代码演示上面三个问题?

不适用Serializable做持久层的理由

•Serializable是java所提供的,与Java的耦合度比较高。扩展性不好。

序列化的对象一旦被保存为二进制文件后,可读性不强

•序列化方式是基于类本身的,当类的签名(serialVersionUID)发生变化,将不能恢复。

•在序列化与反序列化时性能降低

Serializable来替代数据库要遵循的准则

选择怎样的方式来实现持久层

•持久层构建方案:

•纯JDBC的构建

Hibernate

EJB3.0

•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方式的持久层意味着一种传统设计方案的倒置:由“从数据库->对象”的方式转变为“对象设计->数据库”的方式。

•优点:

–开发效率的提高

–轻量级的封装

–具有更好的扩展性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值