概念回顾

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

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

不得不面对的问题

冗余代码

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

对象映射

目前存储数据最常用最流行的工具是关系型数据库,我们通过JDBC借助于SQL语句操作数据库,但是Java是面向对象的编程语言,所有的操作都是对象
在使用JDBC进行操作时,面向对象的概念却被弱化了
比如下面的这一段代码,对于参数的设置,是按照属性字段的索引,你看不到对象的影子
你可能希望有这么一个学生Student类
这个类有几个属性:id、姓名、年龄、性别
当需要执行下面的插入行为时,可以直接将Student的对象实例直接传递进去即可,而不是这样按照索引去设置。
结果集的取回也是类似的
当你想要查询一个列表时,你不得不如下这般处理
你是不是会想,我有一个Student类了,为什么不能直接给我返回一个List<Student> ?那样不是很方便么?
 
所以看得出来,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对象的映射。
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在很多场景都是很好的一种选择。

JDBC与ORM发展与联系 JDBC简介(九)的更多相关文章

  1. hibernate学习笔记之中的一个(JDBC回想-ORM规范)

    JDBC回想-ORM规范 JDBC操作步骤 注冊数据库驱动 Class.forName("JDBCDriverClass") 数据库 驱动程序类 来源 Access sun.jdb ...

  2. 为什么要使用ORM技术?和 JDBC 有何不一样?

    为什么要使用ORM技术?和 JDBC 有何不一样?        1.繁琐的代码问题:        用JDBC的API编程访问数据库,代码量较大,特别是访问字段较多的表的时候,代码显得繁琐.累赘,容 ...

  3. JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文带你厘清个中曲直,给你个选择SpringDataJPA的理由!

    序言 Spring Data JPA作为Spring Data中对于关系型数据库支持的一种框架技术,属于ORM的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度. 本文档隶属于< ...

  4. ORM查询语言(OQL)简介--高级篇(续):庐山真貌

    相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山 ...

  5. ORM查询语言(OQL)简介--高级篇:脱胎换骨

    相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山 ...

  6. ORM查询语言(OQL)简介高级篇

    ORM查询语言(OQL)简介--高级篇:脱胎换骨 在写本文之前,一直在想文章的标题应怎么取.在写了<ORM查询语言(OQL)简介--概念篇>.<ORM查询语言(OQL)简介--实例篇 ...

  7. 开涛spring3(7.2) - 对JDBC的支持 之 7.2 JDBC模板类

    7.2  JDBC模板类 7.2.1  概述 Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDB ...

  8. com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定

    转自: http://blog.csdn.net/superdangbo/article/details/78732700 com.mysql.jdbc.Driver 和 com.mysql.cj.j ...

  9. com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别

    com.mysql.jdbc.Driver 是 mysql-connector-java 5中的,com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6中的 ...

随机推荐

  1. PHP通过经纬坐标计算两个地址的距离

    <?php /** *求两个已知经纬度之间的距离,单位为米 * *@param lng1,lng2 经度 * *@param lat1,lat2 纬度 * *@return float 距离,单 ...

  2. 对Jpa中Entity关系映射中mappedBy的理解

    mappedBy 单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段数据库中1对多的关系,关联关系总是被多方维护的即外键建在多方,我们在单方对象的@OneToMany(mappedby ...

  3. 移动端 rem适配方法

    rem适配 一, 网易适配方法         屏幕宽度/设计稿rem宽度=页面动态font-size值(如:375/7.5=50)         document.documentElement. ...

  4. ionic-基于angularjs实现的多级城市选择组件

    大家都知道在移动端的选择地区组件,大部分都是模拟IOS选择器做的城市三级联动,但是在IOS上比较好,在Android上因为有的不支持ion-scroll.所以就会出现滚动不会自动回滚到某一个的正中间. ...

  5. jQuery-day01-介绍 和 选择器获取元素

    1 ,jQuery介绍 1.1,jquery的介绍,javascript库的关系.体验jquery.把js兼容性代码封装在jquery.js中,本身就是一个javascript库. 1.2,jQuer ...

  6. Mac自动化环境

    1. JDK安装 下载JDK for Mac 我这里使用的是  jdk-7u79-macosx-x64.dmg 验证安装open Terminal  java -version java versio ...

  7. Servlet 监听器Listner

    定义:      专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动. Servlet 规范为每种事件监听器都定义了相应的接口,它用于监听 ...

  8. barrel_shift

    barrel_shift的目的就是在一个bus中根据idx动态选择一部分数据输出如: *dw-:]; -:];// 0~132 *dw-:]; 上面就要求从256的数据单元中选择124个数据单元输出, ...

  9. .NET 应用架构电子书中文版

    <.NET 微服务:容器化 .NET 应用架构指南> 本书主要介绍了基于容器和微服务的应用架构和设计原则,以及基于 .NET Core 和 Docker 容器的应用程序开发实践.为了让大家 ...

  10. MemCache详细解读

    MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...