细想一下,我们工作过的这些年,没工作的也至少活了那么十几二十年。一个工具(比如老司机开的汽车!)的出现,它肯定是为了解决某类问题从而解放生产力的。因此介绍一下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细节。 |
3 | 不需要关注数据库实现(不需要太过关于数据库实现) |
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入门-初次见面 !