如何以编程方式使用Spring的JdbcTemplate?

时间:2009-11-22 16:35:49

标签: java spring dependency-injection spring-jdbc

我们使用Spring JdbcTemplate,它是通过Spring配置配置的,如下图所示。有没有办法在不注入数据源的情况下执行此操作?我想以编程方式创建JdbcTemplate实例,并使用TheOracleDS“初始化”数据源。

我们当前的配置:

Java类

private JdbcTemplate jdbcTemplate;

@Resource(name = "myDataSource")
public void setDataSource(DataSource dataSource) {
     this.jdbcTemplate = new JdbcTemplate(dataSource);
}

Spring config

<jee:jndi-lookup id="myDataSource" jndi-name="java:/TheOracleDS"/>

Oracle数据源配置

<xa-datasource>
      <jndi-name>TheOracleDS</jndi-name>
      ...
</xa-datasource>

更新:原因我问这是我不完全相信依赖注入/拥有Spring管理bean ..

3 个答案:

答案 0 :(得分:6)

不确定为什么要这样做但是......你可以使用Spring JndiDataSourceLookup查找JDNI数据源:

JndiDataSourceLookup lookup = new JndiDataSourceLookup();
lookup.setResourceRef(true); // if the lookup occurs in a J2EE container
DataSource ds = lookup.getDataSource(jndiName);

或者只使用Sun的类执行“手动”查找:

Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/AcmeDB");

然后,只需将数据源引用传递给JdbcTemplate构造函数或调用setDataSource(ds)

但是,正如我所说,我不知道为什么你不想使用注射剂。

答案 1 :(得分:5)

以下是我编写的项目中的一些示例代码:

SimpleJdbcTemplate db;
DataSource dataSource = new SingleConnectionDataSource(System.getProperty(
         "lingcog.db.connectstring"),
      System.getProperty("lingcog.db.username"),
      System.getProperty("lingcog.db.password"), false);

db = new SimpleJdbcTemplate(dataSource);

如果我使用注射,也许我的代码会更简单,但这是如何在不使用注射的情况下完成此操作的一个很好的例子。

您可以使用org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup对象通过JDNI名称查找所需的数据源。

DataSource dataSource = new JndiDataSourceLookup().getDataSource("java:/TheOracleDS")
SimpleJdbcTemplate db=new SimpleJdbcTemplate(dataSource);

答案 2 :(得分:3)

只需使用原始JNDI查找:

public void setDataSourceName(String name) {
    InitialContext ctx = new InitialContext();
    jdbcTemplate = new JdbcTemplate((DataSource) ctx.lookup(name));
}