最近在一個springboot項目中使用到了JdbcTemplate,現將積累的一部分使用經驗分享給大家。本文總結了springboot使用JdbcTemplate的三種方式。
第一種:
依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1</version>
<scope>runtime</scope>
</dependency>
application.properties配置文件:
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@10.30.10.15:1521:orcl
spring.datasource.username=test
spring.datasource.password=test
啓動類:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages = { "com.read" })
public class Starter {
public static void main(String[] args) {
SpringApplication.run(Starter.class, args);
}
}
測試類:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Map;
@SpringBootTest(classes = Starter.class)
@RunWith(SpringRunner.class)
public class JdbcTemplateTest {
@Autowired
JdbcTemplate jdbcTemplate;
@Test
public void selectTest() {
Map result = jdbcTemplate.queryForMap("select * from test.order a where a.id = '2019091800001487' ");
System.out.println(result.toString());
}
}
該種方式比較關鍵的地方是下圖中的依賴:
注意: 此依賴一定要指定好版本,並注意與其他依賴版本的一致性,否則可能導致依賴的jar包沒有下載或者版本衝突,最終導致啓動報錯。
比較重要的幾個jar包:
HikariCP-3.2.0.jar;spring-boot-autoconfigure-2.1.2.RELEASE.jar;spring-jdbc-5.1.4.RELEASE.jar
第二種:
依賴不再使用spring-boot-starter-jdbc,如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test-autoconfigure</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1</version>
<scope>runtime</scope>
</dependency>
啓動類:
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.env.Environment;
import javax.sql.DataSource;
@SpringBootApplication
@ComponentScan(basePackages = { "com.read" })
public class Starter {
@Autowired
private Environment env;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));//用戶名
dataSource.setPassword(env.getProperty("spring.datasource.password"));//密碼
dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
return dataSource;
}
public static void main(String[] args) {
SpringApplication.run(Starter.class, args);
}
}
第三種:
啓動類:
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
@SpringBootApplication
@ComponentScan(basePackages = { "com.read" })
public class Starter {
@Autowired
private Environment env;
@Bean
public JdbcTemplate setBean() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));//用戶名
dataSource.setPassword(env.getProperty("spring.datasource.password"));//密碼
dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
return new JdbcTemplate(dataSource);
}
public static void main(String[] args) {
SpringApplication.run(Starter.class, args);
}
}
依賴等與第二種相同。
總結:推薦用第一種方式,比較方便而且更符合springboot的理念,但是要注意配置文件裏面的配置項一定是spring.datasource開頭的,因爲默認以spring.datasource開頭的配置項裝配數據源,如下圖:
第二種和第三種方式基本一樣 ,但在多數據源的情況下,第三種方式比較有優勢,如下:
application.properties配置文件:
spring.datasource1.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource1.url=jdbc:oracle:thin:@10.30.0.15:1521:orcl
spring.datasource1.username=test
spring.datasource1.password=test
spring.datasource2.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource2.url=jdbc:oracle:thin:@10.1.50.118:1521:orcl
spring.datasource2.username=system
spring.datasource2.password=oracle
啓動類:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
@SpringBootApplication
@ComponentScan(basePackages = { "com.read" })
public class Starter {
@Autowired
private Environment env;
@Bean(name = "jdbcTemplate1")
@Primary
public JdbcTemplate setJdbcTemplate1() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl(env.getProperty("spring.datasource1.url"));
dataSource.setUsername(env.getProperty("spring.datasource1.username"));//用戶名
dataSource.setPassword(env.getProperty("spring.datasource1.password"));//密碼
dataSource.setDriverClassName(env.getProperty("spring.datasource1.driver-class-name"));
return new JdbcTemplate(dataSource);
}
@Bean(name = "jdbcTemplate2")
public JdbcTemplate setJdbcTemplate2() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl(env.getProperty("spring.datasource2.url"));
dataSource.setUsername(env.getProperty("spring.datasource2.username"));//用戶名
dataSource.setPassword(env.getProperty("spring.datasource2.password"));//密碼
dataSource.setDriverClassName(env.getProperty("spring.datasource2.driver-class-name"));
return new JdbcTemplate(dataSource);
}
public static void main(String[] args) {
SpringApplication.run(Starter.class, args);
}
}
測試類:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Map;
@SpringBootTest(classes = Starter.class)
@RunWith(SpringRunner.class)
public class JdbcTemplateTest {
@Autowired
@Qualifier("jdbcTemplate1")
JdbcTemplate jdbcTemplate1;
@Autowired
@Qualifier("jdbcTemplate2")
JdbcTemplate jdbcTemplate2;
@Test
public void selectTest() {
Map result = jdbcTemplate1.queryForMap("select * from test.order a where a.id = '10000726' ");
System.out.println(result.toString());
}
}