首先我们来介绍一下什么是jdbcTemplate,从名字上就能看出,就是jdbc的模版类,实际上本质上就是用java实现一个jdbc连接,只是因为这个是由Spring进行封装的,所以他们取名为jdbcTemplate,于是可以简单理解为,spring帮我们封装了jdbc,我们只需要配置,就可以直接进行使用。
这里说一句题外话,spring是目前java项目中,使用最广的技术。作为一名普通的java开发,我们总是希望能了解最底层,最基础的技术,但是如果你将身份换到老板或者架构师,他们最大的希望是能够迅速进行开发,避免重复性的工作量,以最低的成本去实现最大的效率。所以市面上现在流行或者曾经流行过的技术,其本质都是封装,封装重复性的代码,尽量让开发者把关注点放到业务逻辑上。spring的流行,就是因为他封装的太好,并且还时刻在更新,就比如我们今天介绍的jdbcTemplate。
首先我们来介绍java提供的连接jdbc的方式,这也是最基础的方式,希望我们在享受spring带来遍历的同时,也要有时间去务实基础,这样我们才能越来越优秀。
// 获取连接
Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
// 获取queryRunner对象
QueryRunner qr = new QueryRunner();
// 准备hander : beanHander或beanListHander
BeanListHandler<People> beanList = new BeanListHandler<>(People.class);
// 准备SQL
String sql = "select * from table";
//执行sql
List<Product> list = qr.query(conn, sql, beanList);
for(Product product : list) {
System.out.println(product);
}
//依次关闭连接
conn.close();
每次和数据库的建立连接都会消耗很多的资源,所以我们需要一种机制,放置很多连接,如果需要我们就去取一个连接,不用了就把连接放回去,这个就是所谓的池机制,比如常用的线程池,http连接池,,数据库的就叫数据库连接池。目前我知道的连接池有c3p0连接池,dbcp连接池,Druid连接池(由阿里巴巴提供的,据我了解是目前算除了spring外应用比较广的)。这里我们就不展开说了。
接下来到重点了,我们如何配置并使用Spring提供的jdbcTemplate呢
先介绍一种最标准的写法,不管是多数据源或者单数据源时,都可以使用
pom依赖
<!-- MySQL连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- jdbcTemplate -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
配置文件:application.properties中进行相关配置,我们先配两个不同的数据源
#常用数据库配置
spring.datasource.primary.url=jdbc:mysql://localhost:3306/test01
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
#非常用数据库的配置
spring.datasource.second.url=jdbc:mysql://localhost:3306/test02
spring.datasource.second.username=root
spring.datasource.second.password=root
spring.datasource.second.driver-class-name=com.mysql.jdbc.Driver
代码中进行配置
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
// 表明这是一个配置文件,需要在启动时优先加载
@Configuration
public class JdbcContext {
/**
* 常用数据库配置
*/
@Bean(name = "primaryDataSource") // bean的名称,可以在注入的时候进行匹配
@ConfigurationProperties(prefix = "spring.datasource.primary") // 配置文件的前缀,会去主动读取此前缀开头配置的数据
public DataSource primaryDataSource() {
// 这样我们就已经能读取常用数据库的配置了
return DataSourceBuilder.create().build();
}
@Bean(name = "primaryJdbcTemplate")
public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource primaryDataSource) {
// 这里使用@Qualifier的作用是为了指定注入那个dataSource,其实如果dataSource和jdbc在同一个类里的话,直接调用方法也行
// return new JdbcTemplate(primaryDataSource());
return new JdbcTemplate(primaryDataSource);
}
/**
* 非常用数据库配置
*/
@Bean(name = "secondDataSource") // bean的名称,可以在注入的时候进行匹配
@ConfigurationProperties(prefix = "spring.datasource.secoinnd") // 配置文件的前缀,会去主动读取此前缀开头配置的数据
public DataSource secondDataSource() {
// 这样我们就已经能读取非常用数据库的配置了
return DataSourceBuilder.create().build();
}
@Bean(name = "secondJdbcTemplate")
public JdbcTemplate secondJdbcTemplate(@Qualifier("secondDataSource") DataSource secondDataSource) {
return new JdbcTemplate(secondDataSource);
}
}
使用
@Qualifier("primaryJdbcTemplate") // bean的名称
private JdbcTemplate primaryJdbcTemplate;
@Qualifier("secondJdbcTemplate")
private JdbcTemplate secondJdbcTemplate;
// 接下来jdbcTemplate就会进行自动注入了,然后我们直接拿对象操作就行了
接下里给大家介绍一个稍微高级一点的写法,每次注入的时候,我们都需要进行@Qualifier指定名称,很麻烦,所以我们可以使用@Primary注解,此注解的意思是可以在@Autowired根据类型注入时,默认使用哪个类型注入,就不用@Qualifier专门进行指定了,但是要注意,同一个类型,只能有一个primary。有时间了我会专门写一篇博客给大家分享一下这个。
好了,今天太晚了,明天我再给大家分享jdbcTemplate如何使用。