《Spring 5 官方文档》14.DAO support

14. DAO支持

14.1 介绍

在Spring中数据访问对象(DAO)旨在使JDBC,Hibernate,JPA或JDO等数据访问技术有一致的处理方法,并且方法尽可能简单。
这样就可以很容易地切换上述持久化技术,并且切换过程无需担心每种技术的特有异常。

14.2 一致的异常层级

Spring为技术特定异常提供了一个适当的转化,例如:SQLException 所属异常类层级用DataAccessException 作为根异常,这些异常包括了原来的异常,所以不会有丢失可能出错信息的风险。

除了JDBC异常,Spring也包含了Hibernate特定异常,将它们转换为一组集中的运行时异常(对JDO 和 JPA 异常也是如此),在合适的层次上处理多数不可恢复的持久化异常,而不会在dao上产生繁琐的catch-throw块和异常声明(仍然可以在认为合适的地方捕获和处理异常)。向上面提到的一样,JDBC异常(包括数据方言)也都转化为相同的层级结构,意味着在一个统一的项目模型中你也可以执行一些JDBC操作。

以上列举的Spring的各种模板类支持各种ORM框架。如果使用基于拦截器的类,那么我们的程序必须关心并处理HibernateExceptions和JDOExceptions本身,最好是通过分别授权给SessionFactoryUtils’ `convertHibernateAccessException(..)或 convertJdoAccessException()方法。这些方法将这些异常转化为与org.springframework.dao中异常层级兼容的异常。由于JDOExceptions 没有被检查,它可以被简单的抛出,这也牺牲了DAO在异常上的抽象。

下图展示了Spring提供的异常层级,(请注意:在这张图上显示出来的类层级仅仅是整个DataAccessException 的一个子集)

 

14.3 配置 DAO 或 Repository 类的注解

使用@Repository注解是数据访问对象(DAOs)或库能提供异常转换的最好方式,这个注解还允许组件扫描,查找并配置你的 DAOs 和库,并且不需要为它们提供 XML 配置文件。

@Repository
public class SomeMovieFinder implements MovieFinder {
// ...
}

任何DAO或库实现都需要访问持久的源,依赖于持久化技术的使用;例如:一个基于JDBC的库需要访问一个JDBC DataSource,一个基于JPA的库需要访问一个 EntityManager,最简单的方式就是使用 @Autowired, @Inject, @Resource 或@PersistenceContext 这些注解中的一个完成资源的依赖注入,这是一个JPA库的例子:

@Repository
public class JpaMovieFinder implements MovieFinder {

@PersistenceContext
private EntityManager entityManager;

// ...

}

如果你使用传统的Hibernate API,你可以注入SessionFactory:

@Repository
public class HibernateMovieFinder implements MovieFinder {

private SessionFactory sessionFactory;

@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

// ...

}

最后一个例子我们将在这里展示典型的JDBC支持,你将会在初始化方法中注入 DataSource ,
在初始化方法中,你将使用这个DataSource创建一个JdbcTemplate 和其他与SimpleJdbcCall相似的数据访问支持类。

@Repository
public class JdbcMovieFinder implements MovieFinder {

private JdbcTemplate jdbcTemplate;

@Autowired
public void init(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}

// ...

}

 转载自 并发编程网 - ifeve.com

时间: 2024-10-24 07:50:38

《Spring 5 官方文档》14.DAO support的相关文章

《Spring 5官方文档》翻译邀请

公司新的应用已经开始使用Spring 5,所以本月组织大家翻译<Spring 5 官方文档> SINGLE网页版  PDF版本. 如何领取 通过评论领取想要翻译的文章,每次领取一章或一节(根据内容长短),翻译完后再领取其他章节.领取完成之后,建议在一个星期内翻译完成,如果不能完成翻译,也欢迎你邀请其他同学和你一起完成翻译.请谨慎领取,并发网是非盈利组织,没办法去跟进每一篇译文的进展,所以很多文章领取了没有翻译,会导致文章长时间没人翻译. 如何提交? 翻译完成之后请登录到并发编程网后台,点击左上

《Spring Data 官方文档》5.8. 使用自定义转换器重载默认映射至5.10. 异常解释

5.8. 使用自定义转换器重载默认映射 为了对映射过程有更细粒度的控制,你可以使用'CassandraConverter'实现来注册Spring转换器,例如'MappingCassandraConverter'. "MappingCassandraConverter"检查是否有任何Spring转换器可以在这些特殊类试图映射自身对象之前处理. 为了'hijack' MappingCassandraConverter'的正常映射策略,或许为了提高性能或其他自定义映射需求,您首先需要创建一个

《Spring 5 官方文档》16.ORM和数据访问(一)

16.1介绍一下Spring中的ORM Spring框架在实现资源管理.数据访问对象(DAO)层,和事务策略等方面,支持对Java持久化API(JPA)以及原生Hibernate的集成.以Hibernate举例来说,Spring有非常赞的IoC功能,可以解决许多典型的Hibernate配置和集成问题.开发者可以通过依赖注入来配置O-R(对象关系)映射组件支持的特性.Hibernate的这些特性可以参与Spring的资源和事务管理,并且符合Spring的通用事务和DAO层的异常体系.因此,Spri

《Spring 5 官方文档》16.ORM和数据访问(三)

16.4.2 基于JPA的EntityManagerFactory和EntityManager来实现DAO 虽然EntityManagerFactory实例是线程安全的,但EntityManager实例不是.注入的JPA EntityManager的行为类似于从JPA Spec中定义的应用程序服务器的JNDI环境中提取的EntityManager.它将所有调用委托给当前事务的EntityManager(如果有);否则,它每个操作返回的都是新创建的EntityManager,通过使用不同的Enti

Spring Data 官方文档》4.7 Spring Data扩展

4.7 Spring Data扩展 这部分说明Spring Data一系列的扩展功能,可以使Spring Dta使用多样的上下文.目前大部分集成是针对Spring MVC. 4.7.1 Querydsl扩展 Querydsl是一个框架,通过它的流式API构建静态类型的SQL类查询.多个Spring Data模块通过QueryDslPredicateExecutor与Querydsl集成. 例29 QueryDslPredicateExecutor接口 1 public interface Que

《Spring 5官方文档》电子邮件

29. 电子邮件 29.1 介绍 依赖库:使用Spring框架的邮件功能需要将JavaMail的Jar包添加到依赖中.这个库可以Maven中心找到:com.sun.mail:javax.mail. Spring提供了一个实用的发送电子邮件库,它为使用者屏蔽了邮件系统的底层细节和客户端的底层资源处理. Spring邮件相关功能在org.springframework.mail包下,其中MailSender是发送邮件的核心接口:SimpleMailMessage类是对邮件属性(发件人.收件人以等)进

《Spring 5 官方文档》18. Web MVC 框架(十一)

18.16.6 Content Negotiation You can configure how Spring MVC determines the requested media types from the request. The available options are to check the URL path for a file extension, check the "Accept" header, a specific query parameter, or t

《Spring 5 官方文档》18. Web MVC 框架(八)

18.8.5 LocaleChangeInterceptor 您可以通过添加LocaleChangeInterceptor到其中一个处理程序映射来启用更改区域设置(请参见第18.4节"处理程序映射").它将检测请求中的一个参数并更改区域设置.它呼吁setLocale()在LocaleResolver上下文中也存在.以下示例显示,对包含*.view名为的参数的所有资源的调用siteLanguage现在将更改语言环境.因此,例如,对以下URL的请求http://www.sf.net/hom

《Spring 5 官方文档》16.ORM和数据访问(二)

16.3.4编程式事务划分 开发者可以在应用程序的更高级别上对事务进行标定,而不用考虑低级别的数据访问执行了多少操作.这样不会对业务服务的实现进行限制:只需要定义一个Spring的PlatformTransactionManager即可.当然,PlatformTransactionManager可以从多处获取,但最好是通过setTransactionManager(..)方法以Bean来注入,正如ProductDAO应该由setProductDao(..)方法配置一样.下面的代码显示Spring