文档章节

ORM Overview

周浩杰
 周浩杰
发布于 2017/01/04 11:41
字数 1546
阅读 42
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

基于TP5的微信的公众号获取登录用户信息

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作 基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—...

月夜中徘徊
今天
0
0
youTrack

package jetbrains.teamsys.license.runtime; 计算lis package jetbrains.ring.license.reader; 验证lis 安装后先不要生成lis,要把相关文件进行替换 ring-license-checker-1.0.41.jar char......

max佩恩
今天
0
0
12.17 Nginx负载均衡

Nginx负载均衡 下面的dig看到可以返回2个IP,就是解析出来的IP,这样我们可以做负载均衡。 dig www.qq.com 1.vim /usr/local/nginx/conf/vhost/fuzai.conf 2.添加如下配置 upstream qq //定义...

芬野de博客
今天
0
0
SSE(Server Send Event 服务端发送事件)

package com.example.demo.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframe......

Canaan_
今天
0
0
jvm调优

1.jvm运行模式 client模式:启动快,占用内存少,jit编译器生成代码的速度也更快. server模式:主要优势在于代码优化功能,这个功能对于服务器应用而言尤其重要. tiered server模式:结合了client与...

Funcy1122
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部