《spring实战》笔记 第10章 Spring&JDBC

Spring能够帮忙消除持久化代码中那些单调枯燥的数据库访问逻辑
可以依赖Spring来处理底层的数据访问,这样就可以专注于应用程序中数据的管理了

Spring的数据访问哲学

为了避免持久化的逻辑分散到应用的各个组件中,最好将 数据访问的功能放到一个或多个专注于此项任务的组件中。这样的组件通常称为数据访问对象(data access object,DAO)或Repository。

为了避免应用与特定的数据访问策略耦合在一起,编写良好的 Repository应该以接口的方式暴露功能。
在这里插入图片描述
服务对象通过接口访问Repository的好处:
在这里插入图片描述
在这里插入图片描述
为了将数据访问层和应用程序的其它部分隔离开来,Spring采用的方法之一就是提供统一的一场体系,这个异常体系用在了它支持的所有持久化方案中

了解Spring的数据访问异常体系

在这里插入图片描述
我们需要的数据访问异常要具有描述性而且又与特定的持久化框架无关。

在这里插入图片描述
在这里插入图片描述
(不用写catch代码块)

在这里插入图片描述

DataAccessException只是Sping处理检查型异常和非检查型异常 哲学的一个范例。Spring认为触发异常的很多问题是不能在catch代码块中修复的。Spring使用了非检查型异常,而不是强制开发人员编 写catch代码块(里面经常是空的)。这把是否要捕获异常的权力留给了开发人员。

数据访问模板化

Spring将数据访问过程中固定的和可变的部分明确划分为两个不同的 类:模板(template)和回调(callback)。模板管理过程中固定的部分,而回调处理自定义的数据访问代码
在这里插入图片描述
Spring模板类处理数据访问的固定部分:事务控制、资源管理和异常处理

针对不同的持久化平台,Spring提供了多个可选的模板
JdbcTemplate、HibernateTemplate、JpaTemplate等等

配置数据源

在声明模板和Repository之前,我们需要在Spring中配置一个数据源用来连接数据库。无论选择Spring的哪种数据访问方式,你都需要配置一个数据源的引用。

Spring提供了在Spring上下文中配置数据源bean的多种方式,包括:

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

使用JNDI数据源

Spring应用程序经常部署在Java EE应用服务器中。这些服务器允许你配置通过 JNDI获取数据源。这种配置的好处在于数据源完全可以在应用程序之 外进行管理,这样应用程序只需在访问数据库的时候查找数据源就可以了。

在应用服务器中管理的数据源通常以池的方式组织,从 而具备更好的性能,并且还支持系统管理员对其进行热切换

利用Spring,我们可以像使用Spring bean那样配置JNDI中数据源的引 用并将其装配到需要的类中

位于jee命名空间下的<jee:jndilookup>元素可以用于检索JNDI中的任何对象(包括数据源)并将其作为Spring的bean。

如果应用程序的数据源配置在JNDI中, 我们可以使用<jee:jndi-lookup>元素将其装配到Spring中
在这里插入图片描述
其中jndi-name属性用于指定JNDI中资源的名称
如果只设定了jndi-name属性,那么就会根据指定的名称查找数据源
但是,如果应用程序运行在Java应用服务器中,我们需要将resource-ref属性设置为true
这样jndi-name将会自动添加java:comp/env/前缀

在这里插入图片描述

使用数据源连接池

Spring没有提供数据源连接池实现,但是有多个可用方案
如下就是配置DBCP BasicDataSource的方式:
在这里插入图片描述
Java配置方式:
在这里插入图片描述
前四个属性是配置BasicDataSource所必需的。属性driverClassName指定了JDBC驱动类的全限定类名。在这里我 们配置的是H2数据库的数据源。属性url用于设置数据库的JDBC URL。最后,username和password用于在连接数据库时进行认
证。

基于JDBC驱动的数据源

Spring 提供了三个这样的数据源类(均位于org.springframework.jdbc.datasource包中)供选择
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
SingleConnectionDataSource有且只有一个数据库连接,所以不适合多线程的应用程序
而DriverManagerDataSource和SimpleDriverDataSource尽管支持多线程,但是每次请求连接的时候都会创建新连接,这是以性能为代价的

使用嵌入式的数据源

嵌入式数据库作为应用的一部分运行,而不是应用连接的独立数据库服务器。对于开发和测试来讲,嵌入式数据库都是很好的 可选方案。这是因为每次重启应用或运行测试的时候,都能够重新填充测试数据。


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用profile选择数据源

借助Spring的profile特性能够在运行时选择数据源

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过XML来配置:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在Spring中使用JDBC

与其他的技术相比,使用JDBC能够更好地对数据访问的性能进行调优。JDBC允许你使用数据库的所有特性,而这是其他框架不鼓励甚至禁止的。
在这里插入图片描述

应对失控的JDBC代码

在这里插入图片描述

使用JDBC模板

Spring的JDBC框架承担了资源管理和异常处理的工作,从而简化了 JDBC代码,让我们只需编写从数据库读写数据的必需代码

Spring为JDBC提供了三个模板类供选择:
在这里插入图片描述
从 Spring 3.1开始,做这个决定变得容易多了。SimpleJdbcTemplate 已经被废弃了,其Java 5的特性被转移到了JdbcTemplate中,并且 只有在你需要使用命名参数的时候,才需要使用NamedParameterJdbcTemplate。

为了让JdbcTemplate正常工作,只需要为其设置DataSource就 可以了,这使得在Spring中配置JdbcTemplate非常容易
在这里插入图片描述
在这里插入图片描述

在这里,JdbcSpitterRepository类上使用了@Repository注 解,这表明它将会在组件扫描的时候自动创建。它的构造器上使用了 @Inject注解,因此在创建的时候,会自动获得一个JdbcOperations对象。

JdbcOperations是一个接口,定义了 JdbcTemplate所实现的操作。通过注入JdbcOperations,而不 是具体的JdbcTemplate,能够保证JdbcSpitterRepository通过JdbcOperations接口达到与JdbcTemplate保持松耦合
在这里插入图片描述
这个版本的addSpitter()方法简单多了。这里没有了创建连接和语句的代码,也没有异常处理的代码,只剩下单纯的数据插入代码。
不能因为你看不到这些样板代码,就意味着它们不存在。样板代码被 巧妙地隐藏到JDBC模板类中了。当update()方法被调用的时候JdbcTemplate将会获取连接、创建语句并执行插入SQL。

在这里插入图片描述

在这里插入图片描述

查询
在这里插入图片描述

在这个findOne()方法中使用了JdbcTemplate的 queryForObject()方法来从数据库查询Spitter。queryForObject()方法有三个参数:

  • String对象,包含了要从数据库中查找数据的SQL;
  • RowMapper对象,用来从ResultSet中提取数据并构建域对象 (本例中为Spitter);
  • 可变参数列表,列出了要绑定到查询上的索引参数值。

真正奇妙的事情发生在SpitterRowMapper对象中,它实现了 RowMapper接口。对于查询返回的每一行数据,JdbcTemplate将会调用RowMapper的mapRow()方法,并传入一个ResultSet和包 含行号的整数。在SpitterRowMapper的mapRow()方法中,我们创建了Spitter对象并将ResultSet中的值填充进去。

在JdbcTemplate中使用Java 8的Lambda表达式
因为RowMapper接口只声明了addRow()这一个方法,因此它完全 符合函数式接口(functional interface)的标准。这意味着如果使用 Java 8来开发应用的话,我们可以使用Lambda来表达RowMapper的实现,而不必再使用具体的实现类了。

在这里插入图片描述
或者使用Java 8 的方法引用,在单独的方法中定义映射逻辑:
在这里插入图片描述

使用命名参数
命名参数可以赋予 SQL中的每个参数一个明确的名字,在绑定值到查询语句的时候就通 过该名字来引用参数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值