Pat*_*Pat 96 spring spring-jdbc spring-orm spring-data
我正在浏览Spring支持的数据访问技术,我注意到它提到了多个选项,我不确定它们之间的区别:
据我所知,Spring JDBC提供了模板,用于减少用于通过简单的旧方式访问数据库的样板代码 - 您编写自己的SQL查询.
Spring-ORM提供了通过ORM技术访问数据库的简化模板,如Hibernate,My(i)Batis等.
Spring-DAO按照Spring的网站:
Spring中的数据访问对象(DAO)支持旨在使您能够以一致的方式轻松使用JDBC,Hibernate或JDO等数据访问技术
我对ORM与JDBC有一点关系,因为它们针对的是访问数据库的不同方式.但Spring-DAO简直令人困惑!
有谁能请澄清这三者之间究竟有什么不同?哪种情况应该首选?
此外,还有另一个项目Spring-DATA可用(http://projects.spring.io/spring-data/)现在,它是否是Spring支持的所有数据访问技术的父项目,或者它只是Spring的新名称-dao?
Gae*_*tan 154
以下是每种技术的介绍.
Spring的DAO
Spring-DAO并不是一个严格意义上的弹簧模块,而是应该指示你编写DAO并写好它们的约定.因此,它既不提供接口,也不提供实现或模板来访问您的数据.编写DAO时,应该对它们进行注释,@Repository以便将与底层技术(JDBC,Hibernate,JPA等)相关的异常一致地转换为正确的DataAccessException子类.
例如,假设您现在正在使用Hibernate,并且您的服务层会捕获HibernateException以便对其做出反应.如果更改为JPA,则DAO接口不应更改,并且服务层仍将使用捕获的块进行编译HibernateException,但您永远不会输入这些块,因为您的DAO现在正在抛出JPA PersistenceException.通过@Repository在DAO上使用,与底层技术相关的异常将转换为Spring DataAccessException; 您的服务层捕获这些异常,如果您决定更改持久性技术,Spring DataAccessExceptions仍会抛出相同的Spring,因为Spring 已经转换了本机异常.
但请注意,由于以下原因,这限制了使用:
@Repository,因为bean将通过扫描过程自动添加.此外,Spring可以为注释添加其他有用的功能.Spring的JDBC
Spring-JDBC提供了JdbcTemplate类,它可以删除管道代码并帮助您专注于SQL查询和参数.您只需要使用a配置它DataSource,然后您可以编写如下代码:
int nbRows = jdbcTemplate.queryForObject("select count(1) from person", Integer.class);
Person p = jdbcTemplate.queryForObject("select first, last from person where id=?",
rs -> new Person(rs.getString(1), rs.getString(2)),
134561351656L);
Run Code Online (Sandbox Code Playgroud)
Spring-JDBC还提供了一个JdbcDaoSupport,您可以扩展它以开发DAO.它基本上定义了两个属性:一个DataSource和一个JdbcTemplate,它们都可以用来实现DAO方法.它还提供了从SQL异常到spring DataAccessExceptions的异常转换器.
如果您打算使用普通的jdbc,那么这是您需要使用的模块.
Spring的ORM
Spring-ORM是一个涵盖许多持久性技术的伞形模块,即JPA,JDO,Hibernate和iBatis.对于这些技术中的每一种,Spring都提供了集成类,以便按照Spring的配置原则使用每种技术,并与Spring事务管理顺利集成.
对于每一个技术中,配置基本上包括在注入DataSource豆成某种SessionFactory或EntityManagerFactory等豆.对于纯JDBC,不需要这样的集成类(除了JdbcTemplate),因为JDBC只依赖于DataSource.
如果你打算使用像JPA或Hibernate这样的ORM,你不需要spring-jdbc,只需要这个模块.
Spring的数据
Spring-Data是一个总体项目,它提供了一个通用API来定义如何以更通用的方式访问数据(DAO +注释),涵盖SQL和NOSQL数据源.
最初的想法是提供一种技术,以便开发人员以技术无关的方式为DAO(finder方法)和实体类编写接口,并且仅基于配置(DAO和实体上的注释+弹簧配置,是它基于xml或java的),决定实现技术,无论是JPA(SQL)还是redis,hadoop等(NOSQL).
如果您遵循spring为finder方法名称定义的命名约定,则甚至不需要为最简单的情况提供与finder方法相对应的查询字符串.对于其他情况,您必须在finder方法的注释中提供查询字符串.
加载应用程序上下文时,spring为DAO接口提供代理,其中包含与数据访问技术相关的所有样板代码,并调用已配置的查询.
Spring-Data专注于非SQL技术,但仍为JPA(唯一的SQL技术)提供了一个模块.
下一步是什么
知道这一切,你现在要决定选择什么.这里的好消息是,您不需要为该技术做出明确的最终选择.这实际上就是Spring的所在:作为开发人员,您在编写代码时专注于业务,如果您做得好,更改底层技术就是实现或配置细节.
注意:交易管理
Spring提供了一个用于事务管理的API.如果您计划使用spring进行数据访问,那么您还应该使用spring进行事务管理,因为它们很好地集成在一起.对于spring支持的每种数据访问技术,都有一个匹配的事务管理器用于本地事务,或者如果需要分布式事务,则可以选择JTA.所有这些都实现了相同的API,因此(再一次)技术选择只是一个可以在不对业务代码产生进一步影响的情况下进行更改的配置.
注意:Spring文档
您提到的Spring文档的链接相当陈旧.以下是最新版本的文档(4.1.6,涵盖所有主题):
Spring-data不是Spring框架的一部分.有一个共同的模块,您应该首先阅读以习惯这些原则.文档可以在这里找到:
| 归档时间: |
|
| 查看次数: |
67697 次 |
| 最近记录: |