在总结hibernate这里之前需要和之前接触过的关系模型做一个大概的总结。关系模型中,诸如视图、存储过程的使用,在开发之初也带来很多方便。但随着维护工作的加大,总会出现下面这样几个问题:
1)很多业务逻辑工作交给了视图、存储过程。
例如:调试一个几十行的视图,嘿嘿,不能这样任性。所以当数据和业务逻辑揉做在一起是在维护时是非常头疼的。
2)数据库应该对开发者应该是透明的
这句话怎么讲呢?在学习数据库之初,很多时候既是DBA、也是架构师、也是程序猿。最后我们在编程时不知不觉直接select*t_user ,这样直接操作了数据库表。但是一般情况下是,程序猿是无法知晓数据库结构的。
3)不利于调试
其实在第一点中也讲到了,大家肯定有着这样的体会。程序调试了半天,最后发现竟然是存储过程少了个空格。是不是觉得顿时心塞,你懂得。
之上都是对关系模型在使用过程中的一些感受,而后接触到概念模型之后,发现概念模型在面向对象上更利于我们理解,概念模型大家都知道是在软件分析之初来构建的,用来帮助开发人员之间交流和理解软件的正确需求的,而在软件设计的阶段就需要使用到域模型了。
域模型分为实体域对象、过程域对象、事件域对象。
实体域对象就是我们生活中常见的,诸如学生、教师、试卷。结合J2EE,可以理解为POJO,何为POJO就是最为干净的实体类,不涉及业务逻辑。
过程域对象指的是咱们系统中的业务逻辑,诸如考试、它们是依托实体域存在的。结合J2EE,就是我们使用的EJB中的sessionbean了,j2se中对应具有行为的javabean了。
事件域这个不怎么理解,看网上的资料讲的是一些系统中自动触发的事件,诸如异常、错误等。
无论是域模型还是关系模型都是用来持久化数据到硬盘上的,对比之上域模型在和关系模型时,两者在实现上有差别。域模型在内存中为对象,以及对象之间的关系;而关系模型则表现为表和表之间的关系。所以这个持久化就是将数据从内存存储到硬盘的过程,称之为持久化。当然对于域模型来讲,并不是所有的域模型都需要持久到数据库,例如sessionbean就是无需持久到数据库。
在学习java之初我们大多使用的是jdbc来直接操作数据库的。主要是这么几个对象的使用
drivermanager:负责创建数据库连接
connection:连接数据库
statement:执行sql
preparedStatement:和statement类似,只不过还具有预定义sql语句的功能。
resultset:结果集。
示例:
//获得连接
Connectionconnection=java.sql.DriverManager.getConnection(url,username,pwd);
//定义sql语句
Connection.prepareStatement(strsql);
对象关系映射,主要解决的还是域模型和关系模型的联系。通常用xml来定义之间的关系,然后相应的orm中间件会参照对应的关系来将制定的域模型来映射到数据库表中。例如:hibernate是主要通过sessionfactory来工作的,sessionfactory在读取映射关系之前会配置对应的sql语句,最后再调用相应的方法执行对应的sql语句。诸如orm的应用很多,hibernate是其中一种,还有toplink等。
以上是最为常用的两种用来持久化模式,都为解决关系模型的出现的一些问题提供好的解决方案。使得开发人员更加更好的理解面向对象的持久化,更多的使用的还是第三方的商业持久化中间件,例如JPA以及hibernate。