Spring框架(五)—— 征服数据库

本章内容:

  • 定义Spring对数据访问的支持
  • 配置数据库资源
  • 使用Spring的JDBC模板
  • Spring与Hibernate和JPA的集成

    Spring的持久多种持久化机制,如JDBC、Hibernate、JPA等。

5.1 Spring的数据访问哲学

    遵循面向对象(OO)原则——针对接口编程。

    图5.1 设计数据库访问层的合理方式。


图5.1 服务对象本身并不会处理数据访问,而是将数据访问委托给DAO。

DAO接口取保其与服务器对象的松耦合

5.1.1 Spring的数据访问异常体系

    这里有个关于跳伞运动员的经典例子.......。

  1. JDBC中的SQLException被视为数据库访问所有问题的通用异常,不会就特定的问题给出特定的异常类型。(抛出SQLException异常的问题:无法链接数据库,执行查询有语法错误,表或列不存在,违反完整性约束等)
  2. 持久化框架虽提供的相对丰富的异常体系,但却是本身所特有的。(如Hibernate)
  3.  Spring提供了与平台无关的持久化异常。Spring的异常体系比SQLException丰富的多且没有与特定的持久化方式相关联,这使得我们可以使用Spring抛出一致的异常,而不用关心所选择的持久化方案。可以将选择持久化机制与数据库访问层隔离开来。这里是Spring的非检查型异常

5.1.2 数据访问模板化

    这里用到了“模板方法模式”的思想。

    模板方法将过程中与特定实现相关的部分委托给接口,而这个接口的不同实现定义了过程中的具体行为。

    Spring将数据访问过程中的固定的和可变的部分明确的划分为两个不同 的类:模板(template)和回调(callback)。图5.2展示了这两个类的职责:


图5.2 Spring的DAO模板类负责通用的数据访问功能

DAO回调对象负责应用程序的特定任务

    数据库访问模板化:1.将其配置问Spring上下文中的Bean;2.将其织入到应用程序的DAO中。当然你可以使用Sping提供的DAO基类管理模板。

5.1.3使用DAO支持类

   基于模板-回调设计,Spring提供了DAO支持类,而将业务自己的DAO类作为它的子类。 图5.3展示了模板类、DAO支持类、以及自定义的DAO实现之间的关系。


图5.3 应用程序DAO、Spring的DAO支持类及模板类之间的关系

   Spring为每个数据模板实现类提供了对应的DAO支持类。

    【总结】我是否可以这样理解?模板是一个接口,用来定义一系列的标准;而基类DAO是模板的实现类用于提供操作,而且比模板多了一层。

5.2 配置数据源

    Spring提供了在Spring上下文(这里有知识点要补充)中配置数据源Bean的多种方式,包括:

  •     通过JDBC驱动程序定义的数据源
  •     通过JNDI查找数源
  •     连接池的数据源

5.2.1 使用JNDI数据源

    在诸如JBoss、Tomcat的web容器中你可以配置通过JNDI获取数据源。好处:数据源可以在应用程序之外进行管理,访问时查找就可以;在应用服务器中管理的数据源通常以池的方式组织,从而具备更好的性能,并且支持管理员进行热切换(该怎么用?)。

    jee命名空间下的<jee:jndi-lookup>元素可以用于检索JNDI的任何对象(包括数据源)并将其用于SpringBean中。

5.2.2使用连接池的数据源

    DBCP包含多个提供连接池功能的数据源(在org.apache.commons.dbcp.*下),其中BasicDataSource是最常用的,里面有好多属性,这里不再介绍。   

5.2.3 基于JDBC驱动的数据源

    Spring中提供两种基于JDBC驱动的数据源(org.springframwork.jdbc.datasource):

  •     DriverManagerDataSource:每个连接请求时都会返回一个新建的连接。
  •     SingleConnectionDataSource:在每个连接请求时都会返回同一个连接。(你可以将其视为只有一个连接的池)

5.3 在Spring中使用JDBC

5.3.1 应对失控的JDBC代码

    JDBC优势:

    1.JDBC不要求掌握其他框架的查询语言,建立在Sql之上,可以更好地对数据访问的性能进行调优,且允许用户使用数据库的所有特性。

    2.JDBC让我们在更低的层次上处理数据,能够细粒度的处理数据。

    JDBC的不足:

    编写大量的重复的样板代码(每个操作方法都要连接数据库并小心处理异常)。

5.3.2 使用JDBC模板

    Spring 的JDBC框架承担了资源管理和异常处理的工作,将数据访问的样板代码提取到模板类中,使得这些代码只写一次。Spring为JDBC提供了3个模板类:

  •     JdbcTemplate
  •     NamedParameterJdbcTemplate
  •     SimpleJdbcTemplate(org.springframework.jdbc.core.simple.SimpleJdbcTemplate)

    现在SimpleJdbcTemplate基本可以取代前两个模板。

    使用SimpleJdbcTemplate访问数据

    在Spring的上下文中配置SimpleJdbcTemplate即可。每个应用程序的DAO类都有一个SimpleJdbcTemplate属性及对应的setter方法。

    使用Spring的JDBC DAO的支持类

    JDBC模板对应的三个支持类:JdbcDaoSupport、SimpleJdbcDaoSupport、NamedParameterJdbcDaoSupport。支持类中有对应的模板属性,应用程序的DAO类继承支持类,便可以使用父类的JDBC模板去访问数据库。

5.4 Spring中集成Hibernate

    数据持久化的复杂特性(框架可以提供):

  •     延迟加载(Lazy loading):
  •     预先抓取(Eager fetching):
  •     级联(Cascading):

    这些服务的通用名称是对象/关系映射ORM。

5.4.1 Hibernate

    使用HibernateTemplate模板

    Spring使用HibernateTemplate模板支持Hibernate,该模板负责打开和关闭Session并确保每个事务使用相同的Session等。不足之处:有一定的侵入性,即Spring侵入到DAO中。

    使用上下文Session(contextual session)

    contextual session是使用Hibernate的最佳实践。是HIbernate本身所提供的保证每个事务使用同一Session的方案。

5.4.2 声明Hibernate的Session工厂

    Spring的Hibernate SessionFactory Bean 、Hibernate SessionFactory、Hibernate Session的职责及层次关系如图所示:

图5.4  Spring的Hibernate SessionFactory Bean 、

Hibernate SessionFactory、Hibernate Session的职责及层次关系

    其中,通常采用LocalSessionFactoryBean或AnnotationSessionFactoryBean两种Spring的Bean来获得Hibernate Session。

 

5.4.3构建不依赖于Hibernate代码

    5.4.2中已经声明了一个Hibernate Session 的引用,你可以直接将Hibernate Session装配到DAO类中。当然你可以使用基于注解或xml的方式。(本人推荐注解)

    使用上下文Session的好处是使得Hibernate和Spring的层次分的更清晰,即低耦合性。

5.5 Spring与Java 持久化API

5.1.1 配置实体管理器工厂

   Spring工厂Bean创建实体管理器工厂, 实体管理器工厂(EntityManagerFactory)用来获得实体管理器(EntityManager)。JPA的实体管理器两种类型:应用程序管理类型、容器管理类型。其中,LocalEntityManagerFactoryBean生成应用程序管理类型的EntityManagerFactory;LocalContainerEntityManagerFactoryBean生成容器管理类型的EntityManagerFactory。

5.5.2 编写基于JPA的DAO

总结

    Spring对JDBC和ORM框架的支持简化了各种持久化机制存在的样本代码;

    Spring简化数据访问的方式之一是管理数据库连接的生命周期和ORM框架的Session

    Spring捕获框架的特定异常并将其转换成异常体系中的非检查型异常。

    如何使用JDBC、Hibernate或JPA为Spring应用程序构建持久层。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值