1、spring提供了一组数据访问框架,集成了多种数据访问技术。支持JDBC、ibatis、hibernate、jpa等持久化框架。

2、spring的数据访问哲学

  spring的目标之一就是允许开发人员在开发应用程序时,能够遵循面向对象原则中的“针对接口编程”。spring对数据访问的支持也不例外。DAO是数据访问对象(data access object)的缩写,DAO提供了数据读取和写入到数据库中的一种方式。他们以接口的方式发布功能,应用程序的其他部分可以通过接口来进行访问。如图:

服务对象通过接口来访问DAO,它使得服务对象易于测试,因为他们不再与特定的数据访问实现绑定在一起。此外,数据访问层是以持久化技术无关的方式来进行访问的。持久化方式的选择独立于DAO,只有相关的数据访问方法通过接口来进行发布。这可以实现灵活的设计并使得切换持久化框架对应用程序其他部分所带来的影响最小。如果将数据访问层的实现细节渗透到应用程序的其他部分中,那么整个应用程序将与数据访问层耦合在一起,从而导致僵化的设计。

3、spring的数据访问异常体系

  JDBC访问数据会强制捕获SQLException异常,JDBC对于所有的数据访问问题都会抛出SQLException异常,但是这个异常却没有告诉你哪里出错了以及如何进行处理,不能再catch块中解决问题。一些持久化框架提供了相对丰富的异常体系。分别对应于特定的数据访问问题。这样就可以针对想处理的异常编写catch代码块。

  不同于JDBC,spring提供了多个数据访问异常,分别描述了它们抛出时所对应的问题。如图:

尽管spring的异常体系比JDBC简单的SQLException丰富得多,但它并没有与特定的持久化方式相关联。这意味着我们可以用spring抛出一致的异常,而不用关心所选择的持久化方案。这有助于我们将所有持久化机制与数据访问隔离开来。spring认为触发异常的很多问题是不能在catch代码块中修复的。spring使用了非检查型异常,而不是强制开发人员编写catch代码块。这把是否要捕获异常的权力留给了开发人员。

4、数据访问模板化

  spring将数据访问过程中固定的和可变的部分明确划分为两个不同的类:模板(template)和回调(callback)。模板管理过程中固定的部分,而回调处理自定义的数据访问代码。如图:

  针对不同的持久化平台,spring提供了多个可选的模板。如图:

使用数据访问模板只需将其配置为spring上下文中的bean并将织入到应用程序的DAO中。或者,你还可以使用spring的DAO支持类进一步简化应用程序的DAO配置。尽管直接织入模板是不错的选择,但是spring还提供了一系列便利的DAO基类,这些基类可以用于管理模板。

5、使用DAO支持类

  数据访问模板并不是spring数据访问框架的全部。每个模板提供了一些简便的方法,使我们不必创建明确的回调实现,从而简化了数据访问。另外,基于模板-回调设计,spring提供了DAO支持类,而将业务自己的DAO类作为它的子类。如图:

  spring不仅提供了多个数据模板实现类,还为每种模板提供了对应的DAO支持类。如图:

6、配置数据源

  不管选择哪一种spring DAO的支持方式,都需要配置一个数据源的引用。spring提供了在spring上下文中配置数据源bean的多种方式,包括:

  1)通过JNDI查找的数据源;

  Spring应用程序经常部署在JavaEE应用服务器中,如WebSphere、JBoss或者像Tomcat这样的Web容器。这些服务器允许你配置通过JNDI获取数据源。这种配置的好处在于数据源完全可以在应用程序之外进行管理,这样应用程序只需在访问数据库的时候查找数据源完全可以在应用程序之外进行管理,这样应用程序只需在访问数据库的时候查找数据源就可以了。另外,在应用服务器中管理的数据源通过以池的方式组织,从而具备更好的性能,并且支持系统管理员对其进行热切换。

  利用spring,我们可以像使用Spring Bean那样配置JNDI中数据源的引用并将其装配到需要的类中。位于jee命名空间下的<jee:jndi-lookup>元素并将其装配到Spring中。如:<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/zhyypt" resource-ref="true" />

  2)连接池的数据源;

  尽管Spring并没有提供数据源连接池实现,但Jakarta Commons Data-base Connection Pooling(DBCP)项目是一个不错的选择。

  DBCP包含了多个提供连接池功能的数据源,其中BasicDataSource是最常用的,因为它易于在Spring中配置,而且类似于Spring自带的DriverManagerData-Source。配置如下:

  3)通过JDBC驱动程序定义的数据源;

  在Spring中,通过JDBC驱动定义数据源是最简单的配置方式。Spring提供了两种数据源对象供选择。

  DriverManagerDataSource:在每个连接请求时都会返回一个新建的连接。与DBCP的BasicDataSource不同,由DriverManagerDataSource提供的连接并没有进行池化管理。

  SingleConnectionDataSource:在每个连接请求时都会返回同一个连接。尽管SingleConnectionDataSource不是严格意义上的连接池数据源,但是你可以将其视为只有一个连接的池。

  以上两个连接的配置如下:

7、使用JDBC模板

  Spring的JDBC框架承担了资源管理和异常处理的工作,从而简化了JDBC代码。Spring为JDBC提供了3个模板类使用。

  JdbcTemplate:最基本的Spring JDBC模板,这个模板支持最简单的JDBC数据库访问功能以及简单的索引参数查询。

  NamedParameterJdbcTemplate:使用该模板执行查询时,可以将查询值以命名参数的形式绑定到SQL中,而不是使用简单的索引参数。

  SimpleJdbcTemplate:该模板类利用Java5的一些特性,如自动装箱、泛型以及可变参数列表来简化JDBC模板的使用。

  在Spring3.0中,对NamedParameterJdbcTemplate已经不在支持——所以相对于SimpleJdbcTemplate,没有理由在选择简单的JdbcTemplate了。只需要设置DataSource就能够让SimpleJdbcTemplate正常工作。在Spring中配置SimpleJdbcTemplate非常容易,如下所示:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">

  <constructor-arg ref="dataSource"/>

</bean>

  属性dataSource所引用的dataSource可以是javax.sql.DataSource的任意实现。

  现在,可以将jdbcTemplate装配到DAO中并使用它来访问数据库。

public class JdbcSpitterDAO impliments SpitterDAO{

  private SimpleJdbcTemplate jdbcTemplate;

  public void setJdbcTemplate(SimepleJdbcTemplate jdbcTemplate){

    this.jdbcTemplate = jdbcTemplate;

  }

}

  还需要装配JdbcSpitterDAO的jdbcTemplate属性,如下:

<bean id="spitterDao" class="com.zhyypt.spitter.SimpleJdbcTemplateSpitterDao">

  <property name="jdbcTemplate" ref="jdbcTemplate"/>

</bean>

  对于应用程序中的每一个JDBC DAO类,我们都需要添加一个SimpleJdbcTemplate属性以及对应的setter方法,并确保将SimpleJdbcTemplate  Bean装配到每个DAO的SimpleJdbcTemplate属性中。这会产生大量的重复工作。

  一种可行的解决方案就是为所有的DAO创建一个通用的父类,在其中会有SimpleJdbcTemplate属性。然后让所有的DAO类继承这个类并使用父类的SimpleJdbcTemplate进行数据访问。Spring提供了内置的基类(JdbcDaoSupport、SimpleJdbcDaoSupport和NamedParameterJdbcDaoSupport),分别对应于不同的Spring JDBC模板。要使用这些DAO支持类,就要确保DAO类继承此类。如:

public class JdbcSpitterDao extends SimpleJdbcDaoSuppoort implements SpitterDao{

...

}

  

转载于:https://www.cnblogs.com/jizhuan/p/6565811.html

spring数据持久化相关推荐

  1. Spring Cloud Alibaba基础教程:Nacos的数据持久化

    <Spring Cloud Alibaba基础教程>连载中,关注我一起学习!前情回顾: <使用Nacos实现服务注册与发现> <支持的几种服务消费方式> <使 ...

  2. Spring Cloud Alibaba基础教程:Nacos的数据持久化 1

    前情回顾: <Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现> <Spring Cloud Alibaba基础教程:支持的几种服务消费方式> ...

  3. 数据持久化框架为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框 ...

  4. Java 数据持久化系列之池化技术

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 在上一篇文章Java 数据持久化系列之JDBC中,我们了解到使用 ...

  5. nacos持久化配置MySQL8_Nacos 数据持久化 mysql8.0

    java java8 java开发 Nacos 数据持久化 mysql8.0 一.问题描述 直接下载的稳定版本nacos编译后的文件,不支持mysql8及其以上版本,按照官网文档:https://na ...

  6. jpa 不自动建表_如何来实现SpringBoot应用的JPA数据持久化和热插拔

    数据持久化 JPA ( Java Persistence API)是用于管理Java EE和Java SE环境中的持久化,以及对象/关系映射的Java API. JPA最新规范为"JSR 3 ...

  7. sentinel 官方文档_Sentinel控制台监控数据持久化到MySQL数据库

    阅读文本大概需要3分钟. 根据官方wiki文档,Sentinel控制台的实时监控数据,默认仅存储 5 分钟以内的数据.如需持久化,需要定制实现相关接口. https://github.com/alib ...

  8. jooq实体 和mysql_几个数据持久化框架Hibernate、JPA、Mybatis、JOOQ的比较

    因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template. Hibernate ...

  9. 后端技术:数据持久化框架为什么放弃 Hibernate、JPA、Mybatis,最终选择 JDBCTemplate!...

    因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template. Hibernate ...

最新文章

  1. 利用python爬取IP地址归属地等信息!
  2. MYSQL:如何正确高效的使用 MySQL 索引?
  3. Java最佳实践–高性能序列化
  4. 小米MIX 4 8月不会发布:或配屏下摄像头/100W快充
  5. sqlalchemy 事务
  6. elementui上传图片加参数_Vue + Element UI使用富文本编辑器
  7. iOS优化内存,提升性能 之五
  8. kali linux之选择和修改exp与windows后渗透
  9. log4j 配置文件示例_Log4j2示例教程–配置,级别,附加程序
  10. ECharts使用—折线图动态加载
  11. vm虚拟机做为pxe服务器,vm esxi创建的虚拟机怎么通过pxe启动
  12. 现代 opengl 的驱动安装
  13. 待忧伤开满山岗,等青春散场
  14. 算法④:把字符串变成数字
  15. Maven插件列表_Maven插件查询_Maven插件查看
  16. 如何在pdf文件上进行电子签名
  17. linux中dd命令详解,Linux基础知识之dd命令详解
  18. cannot delete inactive domain with nvram
  19. DbContext 查询(三)
  20. java计算机毕业设计智慧门诊综合管理系统源码+mysql数据库+系统+部署+lw文档

热门文章

  1. Python中使用psutil查看内存占用的情况(内存)
  2. golang错误:The process cannot access the file because it is being used by another process
  3. python删除、替换字符串某字符后的字符串(删除字符串、替换字符串、strip、split、rstrip、lstrip、replace)
  4. Qt:Qt实现飞秋拦截助手—介绍
  5. how pwm update
  6. netty Demo
  7. 基于json的jquery地区联动
  8. 哪些数据库是行存储?哪些是列存储?有什么区别?
  9. 如何用Excel快速生成SQL语句,用过的人都说好
  10. LwIP之netbuf