- 浏览: 454048 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (211)
- java (37)
- spring相关 (3)
- struts (10)
- 面试 (1)
- jsp/servlet (18)
- 持久化框架 (1)
- IT相关新闻 (3)
- 服务器 (11)
- 插件 (4)
- pushlet (3)
- js (24)
- oracle (29)
- mysql (9)
- hibernate (5)
- 开发工具 (6)
- jquery (6)
- 页面标签jstl,el (1)
- linux (25)
- 英语 (1)
- log4j (1)
- html/css (6)
- sqlserver (2)
- dwr (1)
- 设计模式 (4)
- vmware (2)
- office (1)
- eclipse (5)
- svn (1)
- webservice (1)
最新评论
-
18335864773:
建议使用 pageoffice 组件套红
js操作word套红 -
lopez:
数据库系统的客户程序只要向数据库系统声明了一个事务,数据库系统 ...
Hibernate事物控制与管理 -
liujq4512:
删了还是没用
An internal error occurred during: "Initializing Java Tooling". -
elaine0111:
非常感谢这篇文章,嘿嘿,解决了我的问题。我把这段代码保存在我的 ...
Js设置文本框中焦点位置在最后 -
weishuguangeye:
不错!
单例模式(Singleton)
其实J2ee的规范指南里面就已经包括了一些对象持久化技术,例如JDO(Java Data Object)就是Java对象持久化的新规范,一个用于存取某种数据仓库中的对象的标准化API,提供了透明的对象存储,对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。我们如果要理解对象持久化技术,首先要问自己一个问题:为什么传统的JDBC来持久化不再能满足大家的需求了呢?
笔者认为最好是能用JDBC真正编写过程序了才能真正体会ORM的好处,同样的道理,真正拿Servlet/Jsp做过项目了才能体会到Struts、Spring等框架的方便之处。很幸运的是笔者这两者都曾经经历过,用混乱的内嵌Java代码的Jsp加Servlet转发写过完整的Web项目,也用JDBC搭建过一个完整C/S项目的后台。所以现在接触到新框架才更能体会它们思想和实现的优越之处,回顾从前的代码,真是丑陋不堪啊。^_^
回到正题,我们来研究一下为什么要从JDBC发展到ORM。简单来说,传统的JDBC要花大量的重复代码在初始化数据库连接上,每次增删改查都要获得Connection对象,初始化Statement,执行得到ResultSet再封装成自己的List或者Object,这样造成了在每个数据访问方法中都含有大量冗余重复的代码,考虑到安全性的话,还要加上大量的事务控制和log记录。虽然我们学习了设计模式之后,可以自己定义Factory来帮助减少一部分重复的代码,但是仍然无法避免冗余的问题。其次,随着OO思想深入人心,连典型的过程化语言Perl等都冠冕堂皇的加上了OO的外壳,何况是Java中繁杂的数据库访问持久化技术呢?强调面向对象编程的结果就是找到一个桥梁,使得关系型数据库存储的数据能准确的映射到Java的对象上,然后针对Java对象来设计对象和方法,如果我们把数据库的Table当作Class,Record当作Instance的话,就可以完全用面向对象的思想来编写数据层的代码。于是乎,Object Relationship Mapping的概念开始普遍受到重视,尽管很早很早就已经有人提出来了。
缺点我们已经大概清楚了,那么如何改进呢?对症下药,首先我们要解决的是如何从Data Schema准备完美的映射到Object Schema,另外要提供对数据库连接对象生命周期的管理,对事务不同粒度的控制和考虑到扩展性后提供对XML、Properties等可配置化的文件的支持。到目前为止,有很多框架和技术在尝试着这样做。例如似乎是封装管理得过了头的EJB、很早就出现目前已经不在开发和升级了的Apache OJB、首先支持Manual SQL的iBATIS,还有公认非常优秀的Hibernate等等。在分别介绍它们之前,我还想反复强调这些框架都在试图做什么:
毕竟Java Object和数据库的每一条Record还是有很大的区别,就是类型上来说,DB是没有Boolean类型的。而Java也不得不用封装类(Integer、Double等)为了能映射上数据库中为null的情况,毕竟Primitive类型是没有null值的。还有一个比较明显的问题是,数据库有主键和外键,而Java中仍然只能通过基本类型来对应字段值而已,无法规定Unique等特征,更别提外键约束、事务控制和级联操作了。另外,通过Java Object预设某Field值去取数据库记录,是否在这样的记录也是不能保证的。真的要设计到完全映射的话,Java的Static被所有对象共享的变量怎么办?在数据库中如何表现出来……
我们能看到大量的问题像一座座大山横在那些框架设计者们面前,他们并不是没有解决办法,而是从不同的角度去考虑,会得到很多不同的解决方案,问题是应该采取哪一种呢?甚至只有等到真正设计出来了投入生产使用了,才能印证出当初的设想是否真的能为项目开发带来更多的益处。笔者引用一份文档中提到一个健壮的持久化框架应该具有的特点:
A robust persistence layer should support----
1. Several types of persistence mechanism
2. Full encapsulation of the persistence mechanism.
3. Multi-object actions
4. Transactions Control
5. Extensibility
6. Object identifiers
7. Cursors: logical connection to the persistence mechanism
8. Proxies: commonly used when the results of a query are to be displayed in a list
9. Records: avoid the overhead of converting database records to objects and then back to records
10. Multi architecture
11. Various database version and/or vendors
12. Multiple connections
13. Native and non-native drivers
14. Structured query language queries(SQL)
现在来简短的介绍一下笔者用过的一些持久化框架和技术,之所以前面强调那么多共通的知识,是希望大家不要盲从流行框架,一定要把握它的本质和卓越的思想好在哪里。
1. Apache OJB
OJB代表Apache Object Relational Bridge,是Apache开发的一个数据库持久型框架。它是基于J2ee规范指南下的持久型框架技术而设计开发的,例如实现了ODMG 3.0规范的API,实现了JDO规范的API, 核心实现是Persistence Broker API。OJB使用XML文件来实现映射并动态的在Metadata layer听过一个Meta-Object-Protocol(MOP)来改变底层数据的行为。更高级的特点包括对象缓存机制、锁管理机制、Virtual 代理、事务隔离性级别等等。举个OJB Mapping的简单例子ojb-repository.xml:
<class-descriptor class=”com.ant.Employee” table=”EMPLOYEE”>
<field-descriptor name=”id” column=”ID”
jdbc-type=”INTEGER” primarykey=”true” autoincrement=”true”/>
<field-descriptor name=”name” column=”NAME” jdbc-type=”VARCHAR”/>
</class-descrptor>
<class-descriptor class=”com.ant.Executive” table=”EXECUTIVE”>
<field-descriptor name=”id” column=”ID”
jdbc-type=”INTEGER” primarykey=”true” autoincrement=”true”/>
<field-descriptor name=”department” column=”DEPARTMENT” jdbc-type=”VARCHAR”/>
<reference-descriptor name=”super” class-ref=”com.ant.Employee”>
<foreignkey field-ref=”id”/>
</reference-descriptor>
</class-descrptor>
2. iBATIS
iBATIS最大的特点就是允许用户自己定义SQL来组配Bean的属性。因为它的SQL语句是直接写入XML文件中去的,所以可以最大程度上利用到SQL语法本身能控制的全部特性,同时也能允许你使用特定数据库服务器的额外特性,并不局限于类似SQL92这样的标准,它最大的缺点是不支持枚举类型的持久化,即把枚举类型的几个对象属性拼成与数据库一个字段例如VARCHAR对应的行为。这里也举一个Mapping文件的例子sqlMap.xml:
<sqlMap>
<typeAlias type=”com.ant.Test” alias=”test”/>
<resultMap class=”test” id=”result”>
<result property=”testId” column=”TestId”/>
<result property=”name” column=”Name”/>
<result property=”date” column=”Date”/>
</resultMap>
<select id=”getTestById” resultMap=”result” parameterClass=”int”>
select * from Test where TestId=#value#
</select>
<update id=”updateTest” parameterClass=”test”>
Update Tests set Name=#name#, Date=”date” where TestId=#testId#
</update>
</sqlMap>
3. Hibernate
Hibernate无疑是应用最广泛最受欢迎的持久型框架,它生成的SQL语句是非常优秀。虽然一度因为不能支持手工SQL而性能受到局限,但随着新一代Hibernate 3.x推出,很多缺点都被改进,Hibernate也因此变得更加通用而时尚。同样先看一个Mapping文件的例子customer.hbm.xml来有一个大概印象:
<hibernate-mapping>
<class name=”com.ant.Customer” table=”Customers”>
<id name=”customerId” column=”CustomerId” type=”int” unsaved-value=”0”>
<generator class=”sequence”>
<param name=”sequence”> Customers_CustomerId_Seq </param>
</generator>
</id>
<property name=”firstName” column=”FirstName”/>
<property name=”lastName” column=”LastName”/>
<set name=”addresses” outer-join=”true”>
<key column=”Customer”/>
<one-to-many class=”com.ant.Address”/>
</set>
…
</class>
</hibernate-mapping>
Hibernate有很多显著的特性,最突出的就是它有自己的查询语言叫做HQL,在HQL中select from的不是Table而是类名,一方面更加面向对象,另外一方面通过在hibernate.cfg.xml中配置Dialect为HQL可以使得整个后台与数据库脱离耦合,因为不管用那种数据库我都是基于HQL来查询,Hibernate框架负责帮我最终转换成特定数据库里的SQL语句。另外Hibernate在Object-Caching这方面也做得相当出色,它同时管理两个级别的缓存,当数据被第一次取出后,真正使用的时候对象被放在一级缓存管理,这个时候任何改动都会影响到数据库;而空闲时候会把对象放在二级缓存管理,虽然这个时候与数据库字段能对应上但未绑定在一起,改动不会影响到数据库的记录,主要目的是为了在重复读取的时候更快的拿到数据而不用再次请求连接对象。其实关于这种缓存的设计建议大家研究一下Oracle的存储机制(原理是相通的),Oracle牺牲了空间换来时间依赖于很健壮的缓存算法来保证最优的企业级数据库访问速率。
以上是一些Mapping的例子,真正在Java代码中使用多半是继承各个框架中默认的Dao实现类,然后可以通过Id来查找对象,或者通过Example来查找,更流行的是更具Criteria查找对象。Criteria是完全封装了SQL条件查询语法的一个工具类,任何一个查询条件都可以在Criteria中找到方法与之对应,这样可以在Java代码级别实现SQL的完全控制。另外,现在许多ORM框架的最新版本随着JDk 5.0加入Annotation特性都开始支持用XDoclet来自动根据Annotation来生成XML配置文件了。
笔者不可能详细的讲解每一个框架,也许更多的人在用Hibernate,笔者是从OJB开始接触ORM技术的,它很原始却更容易让人理解从JDBC到ORM的过渡。更多的细节是可以从官方文档和书籍中学到的,但我们应该更加看中它们设计思想的来源和闪光点,不是盲从它们的使用方法。
到这里全部Java杂谈这个主题就正式结束了,笔者也可以长叹一口气,拿到毕设题目后也该开始忙自己的毕业设计了。最近看了很多Spring AOP的资料,实习下班回家还会研究Ajax和极限编程,如果有时间了话,会把自己的学习笔记拿出来分享的。衷心希望大家都能不断的进步,在喜欢的道路上不回头的走下去……^_^
另外,大家也回帖也够累的,呵呵,就让此帖沉下去吧,现在重写看到这些,觉得好多好多地方没说清楚或者有漏洞,自己都觉得挺惭愧的
不过我觉得,任何人在学习一门技术的道路上都是要带着错误去前进的,而且要用于带着错误和疑惑向前走,适当的时候停下来抖一抖,抖掉身上累赘的错误然后再继续前进,最终达到精通的高峰!畏首畏尾只会阻碍人前进……笔者脸大,所以坚持写下来了,呵呵……
现在工作加毕设实在是忙,每每看到论坛的朋友学习讨论技术的热情这么高,都很感动,再过2个半月本科毕业,一定要接着写,义无反顾的写下去,大伙一起进步才是真正的成功!
==================结束===================
发表评论
-
java生成pdf以及解决中文中文乱码问题
2013-03-11 16:33 12411itext版本:5.4.0 下载 ... -
jax-ws webservice编程
2013-01-29 16:07 64761.理解JAX-WS 1.1JAX-WS概述 JAX ... -
was6.1修改java编译版本
2013-01-11 09:06 1949jsp中如果用到了jdk1.5的新特性,在was6.1下编译会 ... -
eclipse生成javadoc乱码解决方式
2013-01-11 09:05 847在Extra javadoc options下增加如下参数 j ... -
Eclipse Jee项目开发前准备 (转)
2012-12-31 09:06 1002Eclipse Jee项目编码设置 Window-> ... -
SVN 签出源码 Struts Spring Hibernate
2011-09-15 09:38 1177SVN 签出源码 Struts Spring ... -
几种Java数据库连接池实现(一)
2011-08-31 14:15 1676几种Java数据库连接池实现(一) (一) package s ... -
win7下硬盘安装ubuntu
2011-08-22 20:36 992安装方法见附件 -
比较好的java网站[推荐]
2011-04-07 12:42 15871. The Source for Java Technol ... -
jad反编译jar文件
2011-02-15 16:56 1497//首先使用jar命令将jar文件解压缩到classes目录 ... -
接口与抽象类区别
2011-01-19 15:21 655接口与抽象类区别 《设计模式Java手册》中的,觉得写得很简 ... -
正则入门
2010-12-20 13:21 870< type="text/javascript ... -
序列键生成器与单例及多例模式
2010-12-13 10:37 1089在一个关系数据库中,所有的数据都是存储在表里,而每一个表都有一 ... -
Java中日期格式转换
2010-12-10 15:35 1504Java中日期格式转换 /** * 字符串转换为jav ... -
获取天气预报
2010-12-08 11:30 1024最近工作有用到web services,而这两天也比较有空,就 ... -
java解压缩zip包
2010-11-10 12:32 2105package test; import java.io.B ... -
项目中常见的错误
2010-09-27 08:47 75805项目中遇到的错误(c9bcf64c) sql错误 找不到 ... -
单例模式(Singleton)
2010-09-25 22:51 1252BestUpon 写道 首先我们先 ... -
Java杂谈(十二)--JVM
2010-08-20 09:01 1034本来这次应该讲 ... -
Java杂谈(十一)--Spring
2010-08-20 09:01 893引用《Spring2.0技 ...
相关推荐
本教程将聚焦于三个关键的框架概念:ORM(对象关系映射)、MVC(模型-视图-控制器)以及IOC( inversion of control,控制反转)。我们将探讨这些概念的基本原理,以及如何动手实现这些框架。 首先,让我们来深入...
NBearV3 Step by Step教程——ORM篇 这是一个高人写的
Hibernate 是一个基于 Java 语言的对象关系映射(ORM)框架,用于将 Java 对象映射到关系型数据库中。Hibernate 提供了一些高级的数据访问和缓存机制,提高了数据访问的效率和性能。 本篇文章详细介绍了 Java Web ...
This project is based on Java, is a lightweight ORM model. Only concerned about the Object-Relationl Mapping, therefore more simple and easier to use, easier to control. Key support functions and ...
- 数据库操作:ORM框架如Hibernate通过反射将数据库记录映射为Java对象。 8. **反射的优缺点** - 优点:提高代码的灵活性,可以在运行时动态地调整程序行为,实现动态加载和动态调用。 - 缺点:性能开销较大,...
在这个“Java8应用封装,手写ORM,LOG,framework”的项目中,开发者显然专注于利用Java8的新特性来构建自己的轻量级框架,包括对象关系映射(ORM)、日志系统(LOG)以及一些通用的工具类和自动化配置。 1. **Java...
Java自定义的类似ORM的数据库操作框架是一种高效且灵活的数据访问解决方案,旨在简化数据库的交互过程,类似于流行的ORM(对象关系映射)框架,如Hibernate和MyBatis。ORM框架的核心理念是将数据库操作转化为面向...
ebatis是一个易于使用的Elasticsearch ORM框架,采用Java语言开发,源码文件共计471个,其中Java源文件457个,XML配置文件8个,属性文件2个,Git忽略文件1个,LICENSE文件1个,Markdown文件1个以及YAML文件1个。
Java轻量级ORM框架是Java开发中的一个重要工具,它简化了数据库操作,使得开发者可以更加专注于业务逻辑,而不是繁琐的数据访问代码。ORM(Object-Relational Mapping)框架将对象模型与关系数据库模型进行映射,...
- **ORM**:JPA使用ORM机制,将Java对象与数据库表进行映射。 - **查询语言**:JPA支持两种查询语言:JPQL(Java Persistence Query Language)和Criteria API。 - **生命周期管理**:JPA支持实体的生命周期管理,...
在深入体验Java Web开发的过程中,我们常常需要掌握其核心基础以及高级特性,这些知识点对于成为一名优秀的Java Web开发者至关重要。本文将结合"深入体验Java Web开发内幕"的主题,详细阐述一些关键的技术点,并提及...
本资源提供了一套基于Java的Elasticsearch搜索引擎ORM框架的设计源码,包含769个文件,其中包括321个JavaScript脚本文件,182个Markdown文档,以及157个Java源代码文件。此外,还包括44个HTML页面文件,33个PNG图片...
Java面试题55.ORM是什么?ORM框架是什么?.mp4
Java ORM(Object-Relational Mapping)是Java编程中用于数据库操作的一种技术,它将对象模型与关系数据库模型进行映射,使得程序员可以使用面向对象的方式来操作数据库,而无需关心底层SQL语句的编写。ORM框架简化...
这篇博文“利用java反射、注解及泛型模拟ORM实现”旨在探讨如何结合这三种技术来实现对象关系映射(ORM),这是一种将数据库表与Java对象之间进行绑定的技术,简化了数据操作。 首先,我们来理解一下这三个概念: ...
本源码为基于Java和Kotlin的简易ORM操作工具设计,包含363个Java文件、15个XML文件等,共416个文件。该项目旨在为用户提供一个全面、便捷的ORM操作解决方案,通过Java、Kotlin技术的结合,为用户带来高效的使用体验...
该项目为Java语言的简单数据库ORM库设计源码,总共有84个文件,其中74个为Java源文件,4个为属性文件,2个为Git忽略文件,以及包含1个LICENSE文件、1个Markdown文件、1个XML文件和1个Manifest文件。该库旨在简化...
在本篇“基于Java简易ORM框架实现(二)”中,我们将深入探讨如何构建一个简单的对象关系映射(Object-Relational Mapping,ORM)框架。ORM框架是Java开发中常用的一种技术,它允许开发者以面向对象的方式操作数据库,...
Java 核心封装,原生ORM、LOG格式化、自定义Excel、Mail等等常用工具 让Java开发者使用起来像python一样,做到直接调用库即可完成一件事。 1、java封装模块 想要将java的开发变的像python一样,让库的封装更彻底一点...