Java专家之路(二)---数据访问和数据持久化框架的总结

Java数据访问和持久化(SQL)

方案一:JDBC

什么是JDBC?

Java语言访问数据库的一种规范,是一套API。JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库。
JDBC规范采用接口和实现分离的思想设计了Java数据库编程的框架。接口包含在java.sql及javax.sql包中,其中java.sql属于JavaSE,javax.sql属于JavaEE。
为了使客户端程序独立于特定的数据库驱动程序,JDBC规范建议开发者使用基于接口的编程方式,即尽量使应用仅依赖java.sql及javax.sql中的接口和类。

架构图:

这里写图片描述
这里写图片描述
这里写图片描述

JDBC规范下载链接

http://download.oracle.com/otndocs/jcp/jdbc-4_2-mrel2-spec/index.html

JAVA使用JDBC访问数据库的步骤:

1.得到数据库驱动程序
2.创建数据库连接
3.执行SQL语句
4.得到结果集
5.对结果集做相应的处理(增,删,改,查)
6.关闭资源:这里释放的是DB中的资源

实例练习

参考一:java8官网实例
https://docs.oracle.com/javase/tutorial/jdbc/basics/gettingstarted.html
参考二:
http://wiki.jikexueyuan.com/project/jdbc/introduction.html

方案二:JdbcTemplate

jdbcTemplate是什么?

点击查看——》Spring官方参考:
如果是传统的JDBC代码,就连简单的select语句也需要冗长的出错处理,并且每个函数都不断地重复同样的代码。

JdbcTemplate正是为了减少上述繁琐的代码而设计出来的。它是对JDBC的一种封装,抽象我们常用的一些方法。Simple and Stupid就是它的目标。

JdbcTemplate是spring提供的替代原生JDBC的类。

应用场景?

这里写图片描述
如果选用了spring框架,而且你针对数据库访问也不是很复杂,那么你选择JdbcTemplate作为数据访问非常合适。

JdbcTemplate的好处是:集成在spring框架中,不需要继承额外的其他数据访问的jar包;

JdbcTemplate的方法相对也简单,spring已经封装了很多具体操作。

实例操作

点击——》参考链接:

方案三:ORM

ORM是什么?

ORM 是Object-Relation-Mapping,即对象关系影射技术,是对象持久化的核心
详情请戳——>百科介绍

为什么需要ORM?

主要是解决jdbc的各种问题

ORM是对JDBC的封装,从而解决了JDBC的各种存在问题:

  • a) 繁琐的代码问题

用JDBC的API编程访问数据库,代码量较大,特别是访问字段较多的表的时候,代码显得繁琐、累赘,容易出错。
例如:

PreparedStatement pstmt=con.prepareStatment("insert into account value(?,?,?,?,?,?,?,?,?)");

ORM则建立了Java对象与数据库对象之间的影射关系,程序员不需要编写复杂的SQL语句,直接操作Java对象即可,从而大大降低了代码量,也使程序员更加专注于业务逻辑的实现。

  • b) 数据库对象连接问题

关系数据对象之间,存在各种关系,包括1对1、1对多、多对1、多对多、级联等。在数据库对象更新的时候,采用JDBC编程,必须十分小心处理这些关系,以保证维持这些关系不会出现错误,而这个过程是一个很费时费力的过程。

ORM建立Java对象与数据库对象关系影射的同时,也自动根据数据库对象之间的关系创建Java对象的关系,并且提供了维持这些关系完整、有效的机制。

  • c) 系统架构问题

JDBC属于数据访问层,但是使用JDBC编程时,必须知道后台是用什么数据库、有哪些表、各个表有有哪些字段、各个字段的类型是什么、表与表之间什么关系、创建了什么索引等等与后台数据库相关的详细信息。

使用ORM技术,可以将数据库层完全隐蔽,呈献给程序员的只有Java的对象,程序员只需要根据业务逻辑的需要调用Java对象的Getter和 Setter方法,即可实现对后台数据库的操作,程序员不必知道后台采用什么数据库、有哪些表、有什么字段、表与表之间有什么关系。

d) 性能问题
采用JDBC编程,在很多时候存在效率低下的问题。
pstmt =conn.prepareStatement(“insert into user_info values(?,?)”);
for (int i=0; i<1000; i++) {
pstmt.setInt(1,i);
pstmt.setString(2,”User”+i.toString());
pstmt.executeUpdate();
}
以上程序将向后台数据库发送1000次SQL语句执行请求,运行效率较低。

采用ORM技术,ORM框架将根据具体数据库操作需要,会自动延迟向后台数据库发送SQL请求,ORM也可以根据实际情况,将数据库访问操作合成,尽量减少不必要的数据库操作请求。

ORM的优势

  首先,让我们来做下比较,在同等条件同等数据量的情况,不使用ORM与使用ORM相比,显然不使用ORM执行时间会快那么一点点,但这点你很快就觉得没什么可值得骄傲的了:比如你在某次页面数据交互中,因使用ORM执行时间用了200ms,而没有使用ORM执行时间只须要190ms,提高了10ms啊!!!如果你做的是底层,提高的是CPU运算速度或者是I/O的速度,确实不赖。而这里是信息系统,这些在用户面前根本就感觉不到,即使你用了210ms、220ms用户也不关心这些,然而为了能够提高这些微不足道的x毫秒,你却要写大量重复的代码,不停的Ctrl+C/Ctrl+V,最后代码日积月累,你的代码行确实增加了,而且很快,日复一日,年复一年…恭喜,你终于成为一个代码量超过x万行的伟大的代码民工(不享受农民工待遇的“高级高素质”IT民工)!其实通过Cache的实现,能够实现对性能的调优。
  
  其次,从项目周期和开发进度上来说,ORM无疑提供了最佳方案。对象映射可以使业务对象与数据库分离,使数据库层透明,开发人员真正的面向对象。ORM通过对开发人员隐藏SQL细节可以大大的提高生产力。没有哪个项目不计成本,无限制拖延下去的,多数是尽少投入尽快完成,还要易维护。使用ORM可以大大降低学习和开发成本。实际开发中,真正对客户有价值的是其独特的业务功能,而不应该把大量时间花费在写数据访问、增删改查(CRUD)方法、后期的Bug查找和维护上。在使用ORM后,ORM框架已经把数据库变成了我们所熟悉的实体对象,我们只需了解面向对象开发就可以实现数据库应用程序的开发,不需要浪费时间在SQL上。同时也可减少代码量,减少数据层出错机会。
  
  再次,从职业生涯规划和人员能力提升方面,ORM因为节省大量的开发时间,无疑可以让开发人员有机会去做更有意义的事情,涉猎更多的知识。如果某人始终从事的都是这些模式重复的代码开发,顶多就是个熟练工。
  
  最后,从根本上讲,当前信息系统开发基本上都是基于面向对象和关系数据库的,而面向对象是从软件工程基本原则(如耦合、聚合、封装、继承、多态),而关系数据库则是从数学理论(如关系模型、关系代数、关系运算、函数依赖)发展而来的,两套理论存在显著的区别。ORM就是为解决这个不匹配的现象而产生的。所以从某种意义讲,在ORM还未完全普遍存在的情况下,这种CRUD,也为想进入IT行业的一些青年提供了入门的机会;如果某天ORM像SQL语句或程序的顺序、分支、循环一样普遍,这样的IT从业者,何去何从还另当别论,然而国人大多数开发人员都是做CRUD的。

ORM带来了什么样的问题?

点击——>参考文章一:
点击——>参考文章二:

ORM是否非得使用?

  1. 如果你不处理对象,使用ORM就没什么意义了。
  2. 如果您的关系表/列与对象/属性映射1:1,则使用ORM没有太多的意义。
  3. 如果您的对象与其他对象没有任何1:1,1:m或m:n关系,则使用ORM并不重要。
  4. 如果您有复杂的手动调优SQL,则使用ORM没有太多意义。
  5. 如果您决定将数据库作为其接口存储过程,则使用ORM没有太多意义。
  6. 如果您有一个不能重构的复杂的旧模式,则使用ORM没有太多的意义。

所以这里是相反的:如果你有一个坚实的对象模型,对象之间的关系是1:1,1:m和m:n,没有存储过程,就像ORM解决方案将给出的动态SQL 你一定要用ORM。

ORM的实现原理、思路?

请点击——>参考文章一:
请点击——>参考文章二:Hibernate为例
请点击——>参考文章三:
请点击——>参考文章四:
请点击——>参考文章五:“Sql Mapping”以mybatis为例

有哪些ORM方案可供选择?

Hibernate
Hibernate的前世今生

2001年,澳大利亚墨尔本一位名为Gavin King的27岁的程序员,在这一年的11月,发布了Hibernate的第一个版本。

2002年,已经有人开始关注和使用Hibernate了

2003年9月,Hibernate开发团队进入JBoss公司,开始全职开发Hibernate,从这个时候开始Hibernate得到了突飞猛进的普及和发展。

2004年,整个Java社区开始从实体bean向Hibernate转移,特别是在Rod Johnson的著作《Expert One-on-One J2EE Development without EJB》出版后,由于这本书以扎实的理论、充分的论据和详实的论述否定了EJB,提出了轻量级敏捷开发理念之后,以Hibernate和Spring为代表的轻量级开源框架开始成为Java世界的主流和事实标准。在2004年Sun领导的J2EE5.0标准制定当中的持久化框架标准正式以Hibernate为蓝本

2006年,J2EE5.0标准正式发布以后,持久化框架标准Java Persistent API(简称JPA)基本上是参考Hibernate实现的,而Hibernate在3.2版本开始,已经完全兼容JPA标准

学习参考网站一:官网
学习参考网站二:jboss开发者社区
学习参考网站三:GitHub
学习参考网站四:Hibernate专家YouTube视频

Hibernate的实现原理

请点击——>参考文章二:Hibernate为例

Hibernate的应用场景?

快速迭代 适合 使用面向对象的 持久层框架。在开发过程中 对象的变更非常频繁。
这种 持久层框架 适合 快速 重构 ,提高开发效率。
但是 这种框架 易学难精,用的不好就容易造成性能问题,用的好性能并不输于ibatis框架。
在做性能优化方面 可借助 缓存实现。

Hibernate和ORM的关系?

Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate 提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。

小结:ORM是一种思想,Hibernate是实现了ORM思想的java持久层ORM框架。

ibatis/MyBatis——别具一格的ORM
mybatis的前世今生?

这里写图片描述
Ibatis:iBATIS一词来源于“internet”和“abatis”的组合

在2001年,一个叫做iBATIS的项目由Clinton Begin创立。最初的重点是加密软件解决方案的开发。第一个由iBATIS发布的产品是Secrets,[1]与PGP类似的个人数据加密和签名工具。秘密是完全用Java编写的,是在开源许可下发布的。那一年,微软发表了一篇文章[2]来证明其最近的.NET 1.0框架比Java更有生产力。为此,微软建立了自己的Sun公司的Web版本“Pet Store”,这是Sun用来展示Java最佳实践(Java BluePrints)的Web项目。微软声称.NET比Java快十倍,四倍。

2002年,克林顿开发了一个名为JPetStore的应用程序来演示Java可能比.NET更高效,也可以实现比Microsoft实现更好的体系结构。 JPetStore 1.0产生了很大的影响[4],克林顿使用的数据库层次引起了社区的关注。很快,iBATIS数据库层1.0项目就开始了,由两个组件组成:iBATIS DAO和iBATIS SQL Maps。 iBATIS 2.0于2004年6月发布。[5]这是一个完整的重新设计,同时保持相同的功能。克林顿向iBATIS软件基金会捐赠了iBATIS的名字和代码,这个项目在ASF留了六年时间。最终iBATIS DAO被弃用,考虑到更好的DAO框架,如Spring框架。

2010年5月19日,iBATIS 3.0发布,同时开发团队决定继续开发Google Code的框架[6]。在一个名为MyBatis的新项目下。

2010年6月16日,Apache宣布iBATIS退休并搬到了Apache Attic。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

点击链接——》官网参考:

mybatis的实现原理?

点击——>参考文章一
点击——>参考文章二

mybatis和ORM的关系?

mybatis的着力点,则在于POJO 与SQL之间的映射关系。然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。 相对Hibernate“O/R”而言,mybatis是一种“Sql Mapping”的ORM实现。

小结:ORM是一种思想,mybatis是这种思想下的一种实现方式。

mybatis和Hibernate的对比?

点击——》参考链接:

小结:我们的评价应该要客观实在,两种ORM实现框架,各有各的优势和特点,应看具体业务需求特点来做选择,然后根据框架的特点,并遵循各自框架的最佳实践的原则来使用你所选择的框架,对其进行不断的优化。

mybatis的应用场景?

它封装少、高性能·可优化、维护简单等优点成为了目前java移动互联网网站服务的首选持久层框架,它特别适合分布式和大数据网络数据库编程。

系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的sql语句(或存储过程)才能达到系统性能设计指标,在这种情况下Mybatis会有更好的可控性和表现,可以进行细粒度的优化。

openJPA

学习参考网站一:官网
学习参考网站二:GitHub

学习参考网站一:官网
学习参考网站二:GitHub

JDO

学习参考链接:官网

JPA——统一ORM江山
JPA是什么?

请点击——参考链接

ORM和JPA的关系?

~JPA Java Persistence API,是Java EE 5的标准ORM接口,也是ejb3规范的一部分。

Hibernate,当今很流行的ORM框架,是JPA的一个实现,但是其功能是JPA的超集。

JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现。那么Hibernate是如何实现与JPA的这种关系的呢。Hibernate主要是通过三个组件来实现的,及hibernate-annotation、hibernate-entitymanager和hibernate-core。

hibernate-annotation是Hibernate支持annotation方式配置的基础,它包括了标准的JPA annotation以及Hibernate自身特殊功能的annotation。

hibernate-core是Hibernate的核心实现,提供了Hibernate所有的核心功能。

hibernate-entitymanager实现了标准的JPA,可以把它看成hibernate-core和JPA之间的适配器,它并不直接提供ORM的功能,而是对hibernate-core进行封装,使得Hibernate符合JPA的规范。

hibernate是持久化实现技术,而jpa是持久化的标准,一个是具体实现,一个是接口协议,当然springdata jpa是在hibernate的基础上更上层的封装实现。

目前比较成熟的 JPA 框架主要包括 Jboss 的 Hibernate EntityManager、Oracle 捐献给 Eclipse 社区的 EclipseLink、Apache 的 OpenJPA 等。

小结:JPA规范的推出,参考了之前Hibernate的实现方式,主要是想要统一java中ORM的世界,JPA推出后,Hibernate对JPA进行了积极地拥护和实现。

点击——参考链接

ORM方案选择对比,选型的原则?

请点击——参考博客

小结:文章会持续更新……

Java数据访问和持久化(NoSQL)

方案一:redis

方案二:MongoDB

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值