文档章节

ORM Overview

周浩杰
 周浩杰
发布于 2017/01/04 11:41
字数 1546
阅读 43
收藏 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入门-初次见面 !

 

 

 

 

 

 

© 著作权归作者所有

周浩杰
粉丝 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
Jodd 3.6.5 发布,Java 常用工具包

Jodd 3.6.5 发布,更新内容如下: [http] now accepts local path on 30x. [http] Added default headers to . [madvoc] Fixed action string in case of proxified classes. [servlet] Res......

oschina
2015/03/24
2.4K
10
Jodd 3.6.7 发行说明,Java 常用工具包

Jodd 3.6.7 是个非常与众不同的版本,虽然主要是 bug 修复,但是 Java 升级到了 Java 7。 新特性: [vtor] Added message to validation annotation. [util] Added method to parse internet...

oschina
2015/11/19
2.3K
10
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互相联动。我粗糙的做了两种缩略图,介绍如下: 一、缩略图可点击,点击后更...

会哭的鳄鱼
01/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

可爱的python测试开发库(python测试开发工具库汇总)

欢迎转载,转载请注明来源: github地址 谢谢点赞 本文地址 相关书籍下载 测试开发 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装。 链接 selenium - web UI自动化测试。 链...

python测试开发人工智能安全
今天
2
0
Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
今天
1
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部