JdbcTemplate 配置多数据源
2020-05-23 本文已影响0人
ivms8200
有时候需要对接第三方厂商的数据库或者视图,我们不想让多数据源入侵我们现有的项目。那么可以试下JdbcTemplate。
这里以Oracle视图为例。
- 先确定下对方Oracle版本。然后引入对应版本的pom
<!-- Spring Boot JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- oracle -->
<dependency>
<groupId>com.github.noraui</groupId>
<artifactId>ojdbc8</artifactId>
<version>12.2.0.1</version>
</dependency>
- 配置第三方数据源参数
我这里只定义了一个数据源,也可以定义多个。
third:
trafficManagement:
datasource:
url : jdbc:oracle:thin:@//ip:port/orcl
username : user
password: password
driver-class-name: oracle.jdbc.OracleDriver
# driver-class-name: oracle.jdbc.driver.OracleDriver
param:
driverInfoSql: SELECT j.*,c.* FROM TEST01.JDC c LEFT JOIN TEST01.JSZ j ON c.SFZMHM = j.SFZMHM WHERE c.HPHM = ? ORDER BY j.GXSJ
- 创建一个Spring配置类
@Configuration
public class DataSourceConfig {
/**
* @deprecated DataSource用来读取application.properties/yml中的不同配置。
* 如果有多个数据源,则需要创建多个DataSource。
* @return DataSource
*/
@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@ConfigurationProperties(prefix="third.trafficManagement.datasource")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
/**
* @deprecated 注入上面的DataSource Bean来创建JdbcTemplate实例
* @param dataSource
* @return JdbcTemplate
*/
@Bean(name = "secondaryJdbcTemplate")
public JdbcTemplate secondaryJdbcTemplate(
@Qualifier("secondaryDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
- 在service中先将jdbcTemplate注入。
@Autowired
@Qualifier("secondaryJdbcTemplate")
protected JdbcTemplate jdbcTemplate;
@Value("${third.trafficManagement.param.driverInfoSql}")
private String driverSql;
- 使用queryForList查询。
该方法最终调用的public <T> T query(PreparedStatementCreator psc, final PreparedStatementSetter pss, final ResultSetExtractor<T> rse)
方法,所以不用担心sql注入。
但是jdbcTemplate查询单个对象如果在数据库中查到的结果size大于1或者小于1,都会报错。需要手动try/catch
所以我选择使用jdbcTemplate2.queryForList(driverSql, plateNo)方法。size=0返回null,其余取第0条。
/**
* @param plateNo
* @return
* @deprecated 获取驾驶人信息
*/
@Override
public Map getDriverInfo(String plateNo) {
List<Map<String, Object>> maps = jdbcTemplate.queryForList(driverSql, plateNo);
if(maps.size() > 0){return maps.get(0);}
return null;
}