文档章节

ORM Overview

周浩杰
 周浩杰
发布于 2017/01/04 11:41
字数 1546
阅读 45
收藏 0
ORM

细想一下,我们工作过的这些年,没工作的也至少活了那么十几二十年。一个工具(比如老司机开的汽车!)的出现,它肯定是为了解决某类问题从而解放生产力的。因此介绍一下ORM 概述,对了解3W是大有好处的。

我认为了解ORM,只要看懂下面几个Q&A即可。

 

Q1:what's jdbc ?

A1:可能大家都会说,java连接数据库的API嘛!这样回答,是没错。但我不会告诉你,这不是完全对。我是怎么理解的?JDBC可以拆开来读。"J/DB/C"。也就是java/database/connectivity,也可以理解成java/connect/database。因为database作为一个独立的,人家可不管你java还是C又或者是半死不活的delphi。jdbc对数据库的功能支撑有多强,直接决定后面mybatis、hibernate、springjdbc等框架的能力能到哪个份上。jdbc它本身就是APIS,用于执行SQL语句以及解决数据库兼容问题的。

 

Q2:Pros and Cons of JDBC ?

A2:

优点 缺点
直接明了,一部到位! 如果在大项目里面边,想想也真是恐怖!
性能好! 代码是不是有点多?
写小应用,还是非常不错的 没啥封装,写起来痛苦。
语法够简单,学起来容易 查询基于特定的DBMS
  难以实现MVC这个概念

 

Q3:why Orm ?

A3:当我们去实现一个系统的时候,我们通常去用面向对象的方法去分析,去实现。因为我们的系统所呈现出来的样子,它就是立体的数据模型。比如我作为一个普通的用户,然后我登录了某东商城。那么某东的网站,可能就会马上从N多个系统抓取数据如个人信息,订单信息,理财信息,订单物流信息,评论信息等等组成一个立体的数据模型呈现出来。但是在这个模型建立之前,上面那些信息它们有可能就是静态的数据,安静地以二维表格的数据躺在多个数据节点上(如mysql,或oracle)。这里只是打比方,因为现在数据库可不仅仅的以表格的存储方式保存数据。MongoDB就以JSON的格式进行数据存储,Neo4j以图形的方式!到这里,我们只要知道,我们开发系统目标是要开发出让人容易理解,健壮的立体的数据模型呈现给用户,和二维的数据之间是生来就有矛盾的。因为现在人类的技术,还没有什么足够强大的数据库技术能把一个个活生生的立体的人的全部数据立体的保存,更新,检查。现在是真的没有 !所以ORM的出现就是在中间搭了个桥梁,让两种数据形态在转变的过程中,能够极可能的优雅,用一种便于开发理解的方式进行。如果有一天,数据有了另一种存储的形态,什么JDBC,ODBC 都是会改的。

上一个简单的例子

public class Employee {
   private int id;
   private String first_name; 
   private String last_name;   
   private int salary;  

   public Employee() {}
   public Employee(String fname, String lname, int salary) {
      this.first_name = fname;
      this.last_name = lname;
      this.salary = salary;
   }
   public int getId() {
      return id;
   }
   public String getFirstName() {
      return first_name;
   }
   public String getLastName() {
      return last_name;
   }
   public int getSalary() {
      return salary;
   }
}

想象着,我们要把上面这样一个对象存储起来。我们是不是得有这么一张RBDMS系统的表?like this

create table EMPLOYEE (
   id INT NOT NULL auto_increment,
   first_name VARCHAR(20) default NULL,
   last_name  VARCHAR(20) default NULL,
   salary     INT  default NULL,
   PRIMARY KEY (id)
);

好,看着简单,问题来了。

问题一:当我们的程序员风风火火的干了半天,开发了几个页面。我们的产品经理竟然说要改数据结构?

问题二:从数据库里面获取这个Employee表的数据,以及往Employee表里面塞数据的时候。

暴露出来的几个问题:

问题 说明
粒度 在我们写的系统里,表达一个模型可能需要5个类。但对应在数据库里边,可能是3张表的数据
继承 在数据库系统里面,没有任何继承这些迹象。而继承在我们java开发的系统里面,是自然而然的事情
主键

表里面确实有一样东西可以表达,那就是主键。

但java对象里面呢?(a==b) 或 a.equals(b). 如果覆盖了hashcode呢?那多了去了。

关联 java对象里面使用引用来表达对象间的关系。数据表之间是使用外键来表达表与表之间的关系
访问

访问一个java对象是怎么访问?

访问一个这个java对象在表的记录行与列又是怎么样的?

完全不一样嘛!

于是,finally, orm came out !orm就是为了解决以上面的问题的。

 

Q4:what's Orm? 

A4:orm它是一种技术,一种用于处理关系型数据库和面向对象编程语言数据转换的技术。相比于纯粹的JDBC,Orm有以下的好处:

SN 优点
1 业务代码直接访问对象,而不是数据库表
2 从OO层面上,直接隐藏SQL细节。
不需要关注数据库实现(不需要太过关于数据库实现)
4 实体至于业务对象,而不是数据库表
5 优秀的事务管理,以及多种主键生成策略

基本地,一个Orm解决方案会包括下面四个方面

SN 解决方案
1 有一套完整的API能针对java OO对象进行CRUD.
2 有一种语言或API能够访问java OO对象 OO对象指定的属性
3 有一个用于配置映射元数据的工具
4 一种与事务对象交互以执行脏数据检查,延迟加载,其它优化功能的技术

 

Q5:Are these any other Orms? 

A5:有,java的世界里,永远不缺轮子。TopLink,Spring DAO,Castor etc.

 

The next chapter will be Hibernate入门-初次见面 !

 

 

 

 

 

 

© 著作权归作者所有

上一篇: Hibernate-初次见面
下一篇: Hibernate-闲聊篇
周浩杰
粉丝 1
博文 15
码字总数 10055
作品 0
深圳
高级程序员
私信 提问
Java 常用工具包--Jodd

Jodd 是一个开源的 Java 工具集, 包含一些实用的工具类和小型框架。简单,却很强大! Jodd = Tools + IoC + MVC + DB + AOP + TX + JSON + HTML < 1.5 Mb Jodd 被分成众多模块,按需选择,其...

匿名
2009/06/25
66.2K
20
spring 简介(译)

文档地址:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#overview-getting-started-with-spring 1.启动 spring框架是一个轻量级的问题方案,可以为你的......

流光韶逝
2016/07/08
27
0
openlayers3 自定义鹰眼缩略图

openlayers3自带的鹰眼缩略图控件功能很局限,想到自己动手去做,结果很容易就做出来了,这里主要用到的是两个map互相联动。我粗糙的做了两种缩略图,介绍如下: 一、缩略图可点击,点击后更...

会哭的鳄鱼
2018/01/25
0
0
git如何删除本地所有未提交的更改

位于分支 develop 您的分支与上游分支 'origin/develop' 一致。 未跟踪的文件: (使用 "git add ..." 以包含要提交的内容) :all :crm_overview :fm_overview :oa_overview :pm_overview da......

cheenwe
2014/07/26
0
0
KOHANA3.3 ORM中文详解

ORM === 校验: 1.ORM内部为强制校验 2.ORM外部校验 (保存,更新,插入时校验) 过滤: 校验不在包含过滤功能 参数及方法变更: 1.find不在带参数 2.save拆分为create跟update,并增加校验类参数,规...

新新
2014/07/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JS数组去重的几种常见方法

一、简单的去重方法 // 最简单数组去重法/** 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中* IE8以下不支持数组的indexOf方法* */function uniq(array){ var ...

Jack088
3分钟前
0
0
kafka 集群监控

一、监控kafka工具有很多,但是对于运维人员来说kafka Manager 就可以了 二、下载kafkaManager 编译安装 地址https://github.com/yahoo/kafka-manager 三、下下来的是源码 需要在开始安装官方...

雁南飞丶
4分钟前
0
0
php开发环境搭建

一、wamp环境搭建 安装apache 安装mysql 解压php 在httpd.conf中配置apache,让apache支持php #加载php作为apache的一个模块 LoadModule php5_module "d:/server/php/php5apache2_4.dll" 5. ......

lujc
7分钟前
0
0
java+testng接口测试

最近写了三个接口,很不想写了,觉得好麻烦呀,用postman比这个简洁多了,为什么要写代码呀,为都要学习代码呀呀,我现在还没觉得手写代码比用工具工作上优势体现在哪里了~~知道的告诉我下...

EvanDev
15分钟前
0
0
反向代理(内网穿透)工具Ngrok安装

ngrok是一个反向代理工具,1.x版本源码开源;可以自己搭建一个服务来使用,将本地的web或tcp服务通过公共端口和外部建立一个安全通道,这样就可以通过外网直接访问本地对应的服务,在进行微信...

zerokb-小浪
23分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部