JdbcTemplate 配置多数据源

有时候需要对接第三方厂商的数据库或者视图,我们不想让多数据源入侵我们现有的项目。那么可以试下JdbcTemplate。

这里以Oracle视图为例。

  1. 先确定下对方Oracle版本。然后引入对应版本的pom


  org.springframework.boot
  spring-boot-starter-jdbc



  com.github.noraui
  ojdbc8
  12.2.0.1

  1. 配置第三方数据源参数
    我这里只定义了一个数据源,也可以定义多个。
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
  1. 创建一个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);
    }

}
  1. 在service中先将jdbcTemplate注入。
  @Autowired
  @Qualifier("secondaryJdbcTemplate")
  protected JdbcTemplate jdbcTemplate;

    @Value("${third.trafficManagement.param.driverInfoSql}")
  private String driverSql;
  1. 使用queryForList查询。
    该方法最终调用的public T query(PreparedStatementCreator psc, final PreparedStatementSetter pss, final ResultSetExtractor 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) {
    //这里可以传入class对象,支持返回泛型List
    List> maps = jdbcTemplate.queryForList(driverSql, plateNo);
    if(maps.size() > 0){return maps.get(0);}
    return null;
  }
  1. 如果要使用分页,需要手动查询总条数:jdbcTemplate.queryForObject("SELECT count(id) FROM user",Integer.class)

你可能感兴趣的:(JdbcTemplate 配置多数据源)