`
zhangziyangup
  • 浏览: 1078514 次
文章分类
社区版块
存档分类
最新评论

用Java实现自己的数据库OR映射框架

 
阅读更多

OR框架翻译过来就是对象关系映射框架,一提起OR框架,马上就会想起大名鼎鼎的Hibernate,Ibatis,以及其他的一些对象关系映射框架,并惊叹它的神奇。在惊叹之余,不免会产生兴趣一探他们的实现原理。下面我们就一起来实现一个简单的OR框架。

首先,我们为什么要使用OR框架?虽然现在OOA,OOP的思想已经成为软件编程的主流思想,但是关系型数据库依然是最主流、效率最高的数据库。所以问题来了,如何将我们面向对象思想程序中产生的数据持久化到关系型数据库中呢?当然了,方法很多,最直接的就是使用sql语言将数据依照他们的关系存到数据库当中,但是这样实现起来非常麻烦,为了实现一个简单的功能,常常需要我们写上几百行的代码,费时又费力;也可以使用流行ORM框架,例如Hibernate,Ibatis等,事实上,大多数的中小型公司的确是使用Hibernate作为自己的首选。Hibernate是一个非常优秀的OR框架,它对JDBC进行了轻量级的封装,使我们可以随心所欲的使用面向对象的思想来操纵数据库。下面,我们就来探究一下如何实现一个简单的OR框架,完成与Hibernate相同的功能。

为了说明实现的中心思想,我们先略去细枝末节。对实现做出以下规则:

  1. VO对象的类名要对映数据库的表名,例:VO对象类名为User.java,则数据库表则为user;
  2. VO对象的成员变量名对映数据库表的字段名,例:User中的成员变量为id,name,birthday,则数据库user表中字段名称也必须为id,name,birthday;
  3. VO对象中成员变量的类型与数据库表中字段类型的对应关系为(我们使用的数据库为MYSQL数据库,请根据实际情况自定义规则):Integer对映int(8),Long对应int(16),Float对应float(10,2),Double对应double(16,4),Date对应timestamp,String对应text。
  4. VO对象中必须包括一个Integer类型的成员变量id,数据库中相映的字段名为id,类型为int(8),主键,自动增长。

这里我们只贴一些关键性的代码,整体项目我已经长传到csdn,大家可以另行下载。
首先我们建一个VO类:

这个类有一个Integer类型的id,另外还有其他三个成员变量,以及相应的get/set方法,是一个标准的POJO。

根据我们的OR对应规则,数据库中对映的表名为user,表中的字段名和字段类型为

id int(8) auto_increment primary key
name text
value float(8,2)
date timestamp

然后,我们需要一个通用的DAO类,通用DAO包括5个方法(列出的方法为主要方法,并且方法体已省略),代码如下:


类中的四个方法分别对对象进行增、改、删、查四个操作。

接下来是我们的核心类,这个类的主要任务就是根据对象的增删改查四种情况产生对应的SQL语句,然后通过SQL语句进行数据库操作,从而完成OR映射。代码如下:

  1. add方法负责产生一个insert语句,运行add(user),则返回字符串:insert into user(name, value, date ) values('****', ****, '**********' );
  2. update方法负责产生一个update语句,运行update(user),则返回字符串:update user set name='****', value=***, date='*********' where id=*;
  3. delete方法负责产生一个delete语句,运行delete(user),返回字符串:delete from user where id=*;
  4. query方法负责产生一个query语句,运行query(user),返回字符串:select name, value, id, date from user where name like '%****%';
  5. 另外,为了方便建表,我们还需要一个create方法,用来产生建表语句,将user作为参数传入后返回字符串:create table if not exists user(id int(8) auto_increment, name text, value float(8,2), date timestamp, primary key(id))

以上就是我们核心类要完成的功能。

接下来,我们写一个连接数据库的类,对连接操作简单封装一下:


这里我的数据库名是business,用户名,密码分别是root和123,大家根据自己的情况自行修改,并且不要忘了引入mysql的jdbc。

最后我们建立一个test类测试一下是否成功。

test类有5个方法,分别测试建表、插入、修改、查询、删除五个操作。

写到这里,我们已经看出,所谓的OR映射就是通过java的对象,使用反射得到对象的信息,然后产生SQL语句,再使用JDBC对数据库进行操作。在这个程序当中,我们没有做事务处理,没有使用连接池,没有做多表的映射,可移植性也做的不好,只是将一个简单的java对象持久化到数据库相应的表中,但作为一个练习,已经阐明了如何去实现自己的OR框架,希望各位看官读完以后能有所启发。写的不好,权当是抛砖引玉,欢迎各看官指点。

项目下载地址: 源码下载
分享到:
评论

相关推荐

    使用java实现OR框架

    使用java和mysql阐述实现ORM框架的方法。

    支持多数据库的ORM框架ef-orm.zip

    表结构元数据的API也向用户开放,同时支持在使用过程中,灵活调整映射关系,因此用户可以用API动态的创建表结构的模型,从而实现各种动态类型和表的映射(例如POJO中包含一个Map,用于映射各种动态扩展的字段)企业...

    FREEZE是一个java实体层高性能分布式存储框架

    FREEZE是一个java实体层高性能分布式存储框架,分布式存储可通过简单的配置完成,开发人员可不关心数据存储位置及数据库类型差异;支持OR自动映射;支持字段过滤查询及模糊查询;支持自定义sql语句;配置简单、代码...

    java面试题

    请你谈谈对Hibernate OR映射的理解? 答:将数据库中的每一张表都映射成一个实体。 配置了lazy="true"一定会懒加载吗? 答:不一定,如果在配置中你也使用了fetch属性的话此时lazy就会失效。 Hibernate数据库标识与...

    Hibernate java对象持久化技术.ppt

    Hibernate入门 OR映射技术 通过Hibernate API操纵数据库 检索策略和方式 数据库事务、并发、缓存与性能优化 高级配置

    基于SpringJDBC的轻量级ORM框架sborm.zip

    3、实现一套简单的ORM(直接使用spring rowmapper,insert自己实现),可以基于对象进行crud和相对复杂(感觉比hibernate强大一点)的sql操作; 4、基于对象指定查询的字段,大部分时候可以忘掉表结构进行业务...

    play framework 框架手册 word 版

    [强烈推荐, 文档不多, 很快就可以看完, 看完了, 就会使用play了] 目录 MVC应用程序模型 - 7 - app/controllers - 8 - app/models - 8 - app/views - 8 - 请求生命周期 - 8 - 标准应用程序布局layout - 9 - app...

    在Ruby on Rails中优化ActiveRecord的方法

    像这样的框架就是映射框架。通过 ActiveRecord,我只定义数据库模式:或者用 SQL 或者用称为迁移(migration)的 Ruby 类。将对象模型设计建立于数据库结构之上的那些框架称为包装框架。与大多数包装框架不同,Rails...

    play框架手册

    11.在play框架里使用Ajax - 94 - 通过jsAction标签使用jQuery - 95 - 12. Internationalization国际化支持 - 96 - 仅使用 UTF-8! - 96 - 国际化你的信息 - 96 - 通过应用程序定义支持的语言 - 96 - 依照你的区域定义...

    springmybatis

    MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...

    asp.net知识库

    在 SQL Server 2005 中使用表值函数来实现空间数据库 SQL Server 2005的30个最重要特点 同时安装sql2000和sql2005的经验 类如何与界面绑定 在Asp.net中如何用SQLDMO来获取SQL Server中的对象信息 使用Relations建立...

    spring chm文档

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle建议用户自己设计数据库管理和安全的权限规划,而不要简单的使用这些预定角色。将来的版本中这些角色可能不会作为预定义角色。  DELETE_CATALOG_ROLE, EXECUTE_CATALOG_ROLE,SELECT_CATALOG_ROLE这些角色...

Global site tag (gtag.js) - Google Analytics