spring: 使用Spring提供的JDBC模板(使用profiles选择数据源/使用基于JDBC驱动的数据源)
Spring提供的JDBC框架负责管理资源和异常处理,从而可以简化开发者的JDBC代码。开发者只需要编写写入和读取数据库相关的代码即可。
正如在之前的小节中论述过的,Spring将数据库访问过程中的模板样式代码封装到各个模板类中了,对于JDBC,Spring提供了下列三个模板类:
- JdbcTemplate——最基本的JDBC模板,这个类提供了简单的接口,通过JDBC和索引参数访问数据库;
- NameParameterJdbcTemplate——这个JDBC模板类是的开发者可以执行绑定了指定参数名称的SQL,而不是索引参数;
- SimpleJdbcTemplate——这个版本的JDBC模板利用了Java 5的一些特性,例如自动装箱/拆箱、接口和变参列表等,用于简化JDBC模板的使用。
从Spring 3.1开始已经将SimpleJdbcTemplate废弃,它所拥有的Java 5那些特性被添加到原来的JdbcTemplate中了,因此你可以直接使用JdbcTemplate;当你希望在查询中使用命名参数时,则可以选择使用NamedParameterJdbcTemplate。
INSERTING DATA USING JDBCTEMPLATE
要使用JdbcTemplate对象,需要为之传递DataSource对象。如果使用Java Config配置JdbcTemplatebean,则对应代码如下:
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
这里通过构造函数将DataSource对象注入,而dataSourcebean则来自DataSourceConfiguration文件中定义的javax.sql.DataSource实例。
然后就可以在自己的repository实现中注入jdbcTemplatebean,例如,假设Spitter的repository使用jdbcTemplatebean,代码可列举如下:
package org.test.spittr.dao; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.stereotype.Repository;
import org.test.spittr.data.Spitter; @Repository
public class JdbcSpitterRepository implements SpitterRepository {
@Autowired
private JdbcOperations jdbcOperations; .....
}
这里JdbcSpitterRepository被@Repository注解修饰,component-scanning扫描机制起作用时会自动创建对应的bean。按照“面向接口编程”的原则,我们定义JdbcOperations接口对应的实例,而JdbcTemplate实现了这个接口,从而使得JdbcSpitterRepository与JdbcTemplate解耦合。
使用JdbcTemplate实现的addSpitter()方法非常简单,代码如下:
public void addSpitter(Spitter spitter) {
jdbcOperations.update(SQL_INSERT_SPITTER,
spitter.getUsername(),
spitter.getPassword(),
spitter.getFirstName(),
spitter.getLastName());
}
可以看出,这个版本的addSpitter十分简单,不强制开发者写任何管理资源和处理异常的代码,只有插入语句和对应的参数。
当调用update()方法时,JdbcTemplate获取一个连接、创建一个statement,并执行插入语句。
JdbcTemplate内部捕获了可能抛出的SQLException异常,然后转为更具体的数据库访问异常,并重新抛出。由于Spring的数据库访问异常都是运行时异常,开发者可以自己决定是否捕获这些异常。
READING DATA WITH JDBCTEMPLATE
使用JdbcTemplate工具从数据库中读取数据也非常简单,下列代码展示了改造过后的findOne()函数:调用JdbctTemplate的queryForObject函数,用于通过ID查询Spitter对象。
public Spitter findOne(long id) {
return jdbcOperations.queryForObject(
SQL_SELECT_SPITTER,
new SpitterRowMapper(),
id);
}
private static final class SpitterRowMapper implements RowMapper<Spitter> {
public Spitter mapRow(ResultSet resultSet, int i) throws SQLException {
return new Spitter(
resultSet.getLong("id"),
resultSet.getString("firstName"),
resultSet.getString("lastName"),
resultSet.getString("username"),
resultSet.getString("password"));
}
}
findOne()函数使用JdbcTemplate的queryForObject()方法从数据库中查询Spitter记录。queryForObject()方法包括三个参数:
- SQL字符串,用于从数据库中查询数据;
- RowMapper对象,用于从结果集ResultSet中提取数据并构造Spitter对象;
- 变量列表,用于指定查询参数(这里是通过id查询)。
这里需要注意SpitterRowMapper类,它实现了RowMapper接口,对于查询结果,JdbcTemplate调用mapRow()方法——一个ResultSet参数和一个row number参数。mapRow()方法的主要作用是:从结果集中取出对应属性的值,并构造一个Spitter对象。
和addSpitter()方法相同,findOne()方法也没有那些JDBC模板样式代码,只有纯粹的用于查询Spitter数据的代码。
https://yq.aliyun.com/articles/54079
spring: 使用Spring提供的JDBC模板(使用profiles选择数据源/使用基于JDBC驱动的数据源)的更多相关文章
- spring: 在Spring应用中使用JDBC(使用profiles选择数据源/使用基于JDBC驱动的数据源)
在实际开发过程中有很多持久化技术可供选择:Hibernate.iBATIS和JPA等.尽管如此,还是有很多应用使用古老的方法即JDBC技术,来访问数据库. 使用JDBC技术不需要开发人员学习新的框架, ...
- 数据源管理 | 基于JDBC模式,适配和管理动态数据源
本文源码:GitHub·点这里 || GitEE·点这里 一.关系型数据源 1.动态数据源 动态管理数据源的基本功能:数据源加载,容器维护,持久化管理. 2.关系型数据库 不同厂商的关系型数据库,提供 ...
- Spring 框架的JDBC模板技术
1. 概述 Spring 框架提供了很多持久层的模板类来简化编程; Spring 框架提供的JDBC模板类: JdbcTemplate 类; Spring 框架提供的整合 Hibernate 框架的模 ...
- Spring JDBC模板类—org.springframework.jdbc.core.JdbcTemplate(转)
今天看了下Spring的源码——关于JDBC的"薄"封装,Spring 用一个Spring JDBC模板类来封装了繁琐的JDBC操作.下面仔细讲解一下Spring JDBC框架. ...
- Spring框架的JDBC模板技术和事物
Spring框架的JDBC模板技术 技术分析之Spring框架的JDBC模板技术概述 1. Spring框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单 ...
- 四、spring的JDBC模板和事务管理
Spring的JDBC模板 Spring是JavaEE开发的一站式框架,对各种持久化技术都提供了简单的模板 ORM持久化技术 模板类 JDBC org.springframework.jdbc.cor ...
- Spring的jdbc模板3:完成CURD操作
测试类代码如下 package zcc.spring_jdbc.demo2; import java.sql.ResultSet; import java.sql.SQLException; impo ...
- Spring的jdbc模板2:使用开源的连接池
上篇简要介绍了如何在spring中配置默认的连接池和jdbc模板,这篇来介绍开源的连接池配置与属性引入 C3P0连接池配置: 引入jar包 配置c3p0连接池 <?xml version=&qu ...
- 演示Spring框架的JDBC模板的简单操作
1. 步骤一:创建数据库的表结构 create database spring_day03; use spring_day03; create table t_account( id int prim ...
随机推荐
- Stolz–Cesàro theorem
w http://planetmath.org/sites/default/files/texpdf/33795.pdf Stolz–Cesàro theorem - Wikipedia https ...
- sqlbulk的问题
今天在bulk的时候遇到一个很“奇怪”的问题 无论怎样修改传入的值,也会报类型转换的错误.后来 在此文中找到了正解 bbs.csdn.net/topics/390430064 SqlBulkCopy不 ...
- jQuery获取相邻标签的值
<!-- Mazey's jQuery --><script language="javascript" type="text/javascript&q ...
- mysql练手
1.根据图创建下列表格 没有外键的表先创建,创建顺序为teacher,class,course,student CREATE TABLE class ( cid INT NOT NULL auto_i ...
- Linux Debian 如何部署 Qt?
Linux Debian 如何部署 Qt? 在这里以 HelloWorld 为例 目录结构如下: . ├── HelloWorld ├── HelloWorld.sh ├── imageformats ...
- PAT 1072. 开学寄语(20) JAVA
下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其QQ,封其电脑,夺其手机,收其ipad,断其wifi,使其百无聊赖,然后,净面.理发.整衣,然后思过.读书.锻炼.明智.开悟.精进 ...
- (4.5)DBCC的概念与用法(DBCC TRACEON、DBCC IND、DBCC PAGE)
转自:http://www.cnblogs.com/huangxincheng/p/4249248.html DBCC的概念与用法 一:DBCC 1:什么是DBCC 我不是教学老师,我也说不到没有任何 ...
- POJ 1470 Closest Common Ancestors【近期公共祖先LCA】
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013912596/article/details/35311489 题目链接:http://poj ...
- Fidder详解之抓包
前言 本文是博主发表的第一篇文章,如有傻逼之处,请大家见谅.最近遇到很多人说接口相关的问题,比如:什么是接口,我该怎么做接口测试,还有我总是抓不到APP上的https请求(这个巨坑,不知道坑了多少小白 ...
- web前端基础知识学习网站推介
内容:一.基础知识及学习资料1. HTML入门学习:http://www.w3school.com.cn/html/index.aspHTML5 入门学习:http://www.w3school.co ...