持久层与ORMaping

原创 2006年07月06日 16:35:00

 最近在做一个项目用到了持久化层。学到了些东西,跟大家分享下:

持久化就是把数据保存到可掉电式存储设备中供之后使用。我们每天都在用的oracel就是一个持久化工具。通过它我们将数据持久化到磁盘上。

有了持久化为什么还要持久层呢?
主要是为了解决以下几个问题:
1、如果业务层发生变化,比如需要将客户端程序从C/S迁移到B/S,我们的持久化代码是否要重新编译。
2、如果底层数据持久化机制发上了变化,如从oracle数据库更改成sqlserver或者用于测试的小型数据库mysql,我们的持久化代码是否要重新编译。

从本质上讲持久化进化到持久层的目的就是为了解耦合,实现业务逻辑和数据逻辑的分离。
举个很简单的例子:
我们复制文件,有可能复制到软盘/U盘/甚至是网络上的任意一台电脑的硬盘,如果按照开发人员的思维方式就要写一堆if/else来判断设备类型,如果更完善一点还要考虑并发,同一时间不能向一个设备发数据,调度好线程。但是实际上我们只需要Ctrl+C/Ctrl+V就搞定了,操作系统帮我们做好了一个持久化层。将我们的业务逻辑(拷贝文件)和数据逻辑(传输数据)分离了。

设计得好的持久成可以达到以下目的:
1、数据存储逻辑的分离
业务层代码不会出现数据操作的代码如insert/update/select,只需要编写业务代码如:
Customer c=new Customer();
c.setName("jack");
c.setAge(20);
saveandupdate(c);
使得开发人员可以更好的专业划分,另外测试起来也相对容易
2、更好的性能
成熟的持久化层可以提供数据库连接池/语句cache/数据cache,减少数据库的查询压力。
数据库连接池:每次数据库连接都需要建立socket、验证密码/权限、记录日志、分配cpu内存等等,这是相当耗费资源的。  如果仅仅为了一条查询语句就要建立连接然后释放连接那就太浪费了。数据库连接池就是将暂时不用的连接不进行关闭,保存下了,以备下次直接使用。
语句cache:一般情况下我们认为update语句很快,也就一眨眼的时间,但是这一眨眼的时间数据库为我们做了很多事——  sql语法检查、语义分析、创建执行计划等。大型的系统由成百上千的终端操作数据库,而实际上操作最多的表也就十几个,运行的语句也就几十种。如果将这些语句也缓存起来,性能也能够提高很多。
数据cache:这是最常见的,如果数据库中的数据没有变化那就不用从数据库中select了,直接读内存就好了。减少了网络传输、内存与磁盘数据交换等开销。

说了这么多持久层的功能,大家可能觉得说的这么好,设计开发这个层一定很困难。那是当然了,但是这个不用我们自己从头来搞,这里就引出了ORMaping。先介绍一下ORMaping的理论。

ORMaping就是对象关系映射。ORMaping发展到现在已经出现了很多好的成熟的产品,而且很多都是开源的免费的。采用这些产品可以减少乏味的代码/更加面向对象的设计/更好的性能/更好的移植性。

一般的开发步骤是:
1、编写ORMap配置文件,一般是xml的。这是比较耗时的,但是可以进行迭代开发,一边开发一边修改(建议采用自动测试工具Unit系列,每次修改完成回归测试一下建立信心)。

2、借助工具,根据配置文件生成数据库ddl,以及实体类代码,比如同时生成Customer表和Customer.java源码, 表有字段name,相应的Customer.java有属性name和相应的方法getName()/setName(String)。 对于遗留系统,可以借助工具连接数据库反向生成配置文件和实体类代码,十分方便快捷。

3、编写提供给业务层的方法,其中涉及到事务的处理、异常处理、操作实体类,类似于以前的业务开发,但是 完全不涉及到sql语句(通过配置文件ORMap产品和数据库在底层进行sql交互,对我们来说是透明的),完全的面向对象代码。这步 稍微费点时间但是相对于以前的业务开发便利了太多。

JAVA三层架构,持久层,业务层,表现层的理解

SSH:Struts(表示层 )+Spring(业务层)+Hibernate(持久层)Struts: Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。在 MVC框架 中,...
  • ljf_study
  • ljf_study
  • 2017年03月21日 16:22
  • 7392

J2EE的表现层、持久层、业务层

为了实现web层(struts)和持久层(Hibernate)之间的松散耦合,我们采用业务代表(Business Delegate)和DAO(Data Access Object)两种模式。DAO模式...
  • king0406
  • king0406
  • 2016年05月22日 20:12
  • 1484

表现层、持久层、业务层

为了实现web层(struts)和持久层(Hibernate)之间的松散耦合,我们采用业务代表(Business Delegate)和DAO(Data Access Object)两种模式。DAO模式...
  • elong490
  • elong490
  • 2014年08月21日 09:20
  • 2830

三大框架整合ssh(一)-----持久层搭建

这一节其实就是搭建hibernate开发环境,如果你可以自己搭建就跳过吧。但我还是把不做贴出来,并把可能出问题的方法指出来。 下面是这个项目的持久层目录图: 这一步主要是关于数据的操作,但是这时候你...
  • zl544434558
  • zl544434558
  • 2013年10月18日 13:51
  • 1845

数据持久化层和DAO层的关系

DAO =Data Access Objects,也就是所谓的数据访问对象,这个对象是和数据打交道的,当然是持久化层的。目前通用的是dao是数据层,也可以说为持久化层,service是逻辑层,也可以叫...
  • woshiliulei0
  • woshiliulei0
  • 2016年02月18日 15:10
  • 2344

Mybatis 基于Java的持久层框架(一)

简介 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。MyB...
  • u011345136
  • u011345136
  • 2015年01月24日 16:15
  • 3268

Hibernate持久层全面描述

这里介绍增加Hibernate持久层提高了开发的效率,使软件的体系结构更加清晰,在代码编写和系统维护方面变得更容易。特别是在大型的应用里边,会更有利。 在向大家详细介绍Hibernate持久层之...
  • u012110719
  • u012110719
  • 2014年11月21日 18:19
  • 1226

拥有了JDBC,为什么还要有Hibernate和Mybatis等持久层框架?

JDBC,我想对于学Java的人简直太熟悉了,如果谁说不知道,那么狠遗憾的告诉你,你不是Java人! 这篇文章的主要目的还是想把大家引入后面我们重点要说的内容,那就是Mybatis和Hibernate...
  • andamajing
  • andamajing
  • 2017年05月05日 14:25
  • 958

Spring总结4—对持久层的支持(附:事务管理)

Spring对持久层采用的策略 没有重新实现新的持久层,只是对现有持久层方案进行封装,更利于使用 采用DAO模式 提供了大量的模板类来简化编程(HibernateTemplate、JdbcTempl...
  • u010796790
  • u010796790
  • 2016年04月24日 21:06
  • 1205

myBatis持久层缓存

缓存的意义:将用户经常查询的数据当在缓存(内存)中,用户去查询数据就不用从磁盘(关系型数据库数据文件)查询,而是从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。 myBatis提供一级缓...
  • qq_27656675
  • qq_27656675
  • 2017年03月28日 18:26
  • 316
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:持久层与ORMaping
举报原因:
原因补充:

(最多只允许输入30个字)