JDBC与ORM发展与联系 JDBC简介(九)

概念回顾

回顾下JDBC的概念:
JDBC(Java Data Base Connectivity,java数据库链接)是一种用于执行SQL语句的Java API,能够为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
JDBC提供了一种基准,据此能够构建更高级的工具和接口,使数据库开发人员可以编写数据库应用程序。
JDBC是Java数据库链接技术,因此,他必然根植于Java语言,使用JDBC离不开Java开发环境,是Java语言对于数据库链接的技术实现。
JDBC做为一种协议的体现,在Java代码中就是一系列的接口与实现的约定。
数据库驱动厂商以及应用程序开发者基于这一协议进行对接,从而解耦,从而能够相互分离的独立发展。
 
既然最终体现形式为一组API这组API到底作了什么?
想要了解JDBC到底作了什么,在windows平台的话,能够直接打开命令窗口
根据用户名密码进行链接,而后发送语句,而后查看结果
image_5c4aa710_48d2
 
JDBC是Java数据库链接,仍旧是在作”链接数据库“这件事情自己,哪怕变出花来,他的根本仍旧是链接数据库
数据库就是那个数据库,他一直在那里,数据库有他们固有的操做流程步骤以及SQL执行规范
当你用命令窗口链接数据库,发送SQL语句时,你是在操做数据库
使用JDBC只是换了一种方式,再也不是手动了,而是借助于Java代码,而后依赖于底层的数据库驱动,去操做数据库
简言之,你原本是在命令窗口里面,输入一行SQL以后敲回车
如今变成了借助于Java代码,经过几个对象相互配合进而发送SQL
作的全部事情都没有任何变化,查询仍是那个查询,更新仍是那个更新,变得只是形式

你觉得开个法拉利去车站接人和骑电动车去接人有本质区别么?
你要作的仍是去车站接人,你要接的人仍是那我的,可是形式变了,停车位置变了,时间变了,连旁边的妹子看你得眼光可能也变了,可是,可是,你的事儿仍是那个事儿,若是接不到人,一切还不是扯淡?
 
因此说一个数据库客户端通常能够提供给咱们那些服务,JDBC就可以提供给咱们那些服务
不过,对于客户端来讲,结果直接就能够呈现出来了,可是对于Java代码---方法的调用,须要处理更多的细节,哪些是输出,哪些是输入,参数的传递
因此JDBC没有看起来这么简单
 
JDBC做为数据库链接的中间层,将应用程序与数据库链接进行解耦,给开发者提供了极大地方便,今后之后,不再须要面向数据库驱动进行编程了
只须要面向JDBC进行编程便可,因此JDBC的出现,对于Java链接数据库实现了大一统的局面,解放了生产力
可是,你既然做为中间层,将二者进行解耦,你就要负责对接,不然就真的完全断开了,就不叫作解耦了。。。
这其中最重要的一点就是结果集的返回
对于相似命令行或者Navicat的客户端,是直观的呈现,眼睛来识别,而对于接口调用,则是API各个方法中的数据的对接,结果集的解析
JDBC是对数据库操做的Java描述,因此对于好比查询来讲,结果集的逻辑呈现也是下图相似式样
image_5c4aa710_15c1
JDBC对于结果集的处理核心就是将这样子的数据返回给应用程序,直观看起来很简单的行列,映射到字段中就涉及到很复杂的转换了
总共有多少行记录?又有多少列?有哪些字段是要处理的?字段顺序是什么?字段类型是什么?SQL类型与Java类型又是如何映射?有些字段的精度又是什么?
某列的值应该跟哪个实体中的字段进行对照?等等这些都是结果集要处理的,因此说JDBC的确又很复杂

不得不面对的问题

冗余代码

借助于JDBC编程,有不少模块化的代码,在第一个JDBC示例中,全部的步骤都是须要循序渐进完成的
而这些步骤很显然,有些是结构化的模式化的,好比链接数据库,关闭链接,异常处理,这些其实对于应用开发者其实并不想处理,可是却不得不处理
简言之,JDBC功能足够,可是便捷性欠缺,结构化自己没错,结构化模式化流程化才能成为标准,可是必然会产生冗余步骤,如何灵活是一个问题

对象映射

目前存储数据最经常使用最流行的工具是关系型数据库,咱们经过JDBC借助于SQL语句操做数据库,可是Java是面向对象的编程语言,全部的操做都是对象
在使用JDBC进行操做时,面向对象的概念却被弱化了
好比下面的这一段代码,对于参数的设置,是按照属性字段的索引,你看不到对象的影子
你可能但愿有这么一个学生Student类
这个类有几个属性:id、姓名、年龄、性别
当须要执行下面的插入行为时,能够直接将Student的对象实例直接传递进去便可,而不是这样按照索引去设置。
image_5c4aa710_42df
结果集的取回也是相似的
当你想要查询一个列表时,你不得不以下这般处理
你是否是会想,我有一个Student类了,为何不能直接给我返回一个List<Student> ?那样不是很方便么?
image_5c4aa710_12f4
 
因此看得出来,Java做为纯粹的面向对象编程语言,一切皆是对象,可是目前经常使用的数据库倒是关系型数据库
关系模型就像一张二维表格,于是一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织,这并非对象型的
JDBC的操做方式是也不是面向对象的,整个过程面向对象编程的思惟观念很大程度上被遏制了
因此,尽管JDBC将应用程序与数据库驱动进行解耦,应用程序开发者面向JDBC进行编程,而不须要面向数据库进行编程
可是谁也没办法否定Java是纯粹的面向对象,因此在对象与关系型数据库的字段之间,又缺乏了一层,这层用于将字段与对象进行映射对照
没有这层功能,只能是应用程序开发者借助于JDBC本身手动的将字段组装成对象,很繁琐,并且,不成规范,就如同没有JDBC以前开发数据库操做的程序那样,须要本身实现。
简言之,关系型数据库不是面向对象的,而JAVA倒是纯粹的面向对象的语言,这势必不能很流畅的合做,JDBC对象的映射全靠本身

ORM

鉴于以上提出来的问题,在使用Java开发时,咱们但愿真正的创建一个对象型数据库,或者说至少使用起来看起来像一个对象型数据库
可是,目前经常使用的数据库又的确是关系型数据库,这一点短时间内又没法改变
因此出现了ORM,对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping)
面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。
而面向对象的编程思想是软件开发的一大趋势,而关系数据库也是目前的必然存在,两种理论的差异的不匹配,造就了ORM,乱世出英雄。

ORM到底作什么?

JDBC将应用程序开发者与底层数据库驱动程序进行解耦,做为中间层承上启下
而ORM是插入在应用程序与JDBCAPI之间的一个中间层,JDBC并不能很好地支持面向对象的程序设计
ORM解决了这个问题,经过JDBC将字段高效的与对象进行映射
应用程序开发人员再也不须要直接与JDBC API进行打交道了,可使用更加便利的ORM工具,提升开发效率
因此ORM是干什么的?
ORM用于完成Java对象与关系型数据库的映射,是JDBC的一层封装,提升了易用性。
简言之,ORM工具就是JDBC的封装,简化了JDBC的使用,完成关系型数据库中数据与Java对象的映射。
image_5c4aa710_22d8
ORM工具框架最大的核心就是封装了JDBC的交互,你不在须要处理结果集中的字段或者行或者列
借助于ORM能够快速进行开发,而无需关注JDBC交互细节
可是既然是JDBC的封装,多一层封装,就势必会带来性能的开销,这是没法回避的事实,不过如今技术不断发展,性能开销愈来愈小。
从上面的解释看,好似有些狭义,会认为ORM框架仅仅完成对象的映射,其实并否则,ORM最原始的是一个概念,全部的ORM产品是基于ORM思想的实现实体
他们每每都附加了更多的功能,好比不少ORM框架也叫作持久化ORM框架
什么意思呢?
持久化简单理解就是脱离内存能够独立保存,保存到数据库,保存到文件等等形式,都是持久化
“持久化ORM框架”中的持久化通常是指保存到数据库,因此说若是一个ORM提供了CRUD操做API,应用程序能够借助于ORM完成数据持久化的操做,这就算是一个持久化ORM框架
就如同不少DataSource的实现中添加了不少功能,有些就直接被叫作数据库链接池
因此说具体怎么讲,都是字面的含义,真正须要作的是理解ORM思想的含义:
完成对象与关系型数据库的映射,封装底层与数据库的交互,而且不少都提供了强大的附加功能,好比持久化
如今的ORM基本上都是包括对持久类对象进行CRUD操做的API
 
对于Java来讲,经常使用的有Hibernate和Mybatis(iBatis)还有Spring JDBC等,在ORM核心思想的基础上周边又作了不少事情
因此说基本上不多有人直接使用原生的JDBC,可能有的公司中不会使用这些框架,由于毕竟框架的引入会牺牲性能
并且框架是做为JDBC的封装,就比如一个工具类,并且是别人封装的工具类,终归有些地方可能有的人用的不顺手,或者说不适合有些场景,大公司有些会本身研发一套本身须要的类ORM工具,本身使用
ORM框架各有千秋利弊,你能够不用各类已成的框架,可是,没有任何人能够否认ORM背后的思想, ORM会必定程度上下降性能可是借助于代码生成工具等能够极大地提升开发效率
并且,ORM工具备极强的可维护性,虽然会下降性能,可是更多的时候多是代码不够完美,算法不够高明,逻辑不够清晰,因此负责任的说ORM在不少场景都是很好的一种选择。

原文出处:https://www.cnblogs.com/noteless/p/10319299.htmlhtml

相关文章
相关标签/搜索