我正在使用spring Jdbc,如何不通过Connection接口从jdbc模板检索数据库供应商名称。 Spring是否提供了一个API,可以提供一个持有数据库名称的枚举,以便我可以将代码与硬编码字符串值解耦

您可以在DatabaseMetaData文档中找到所需的信息。

String vendor = jdbcTemplate.getDataSource().getConnection().getMetaData().getDatabaseProductName();

更新!

根据M. Deinum的建议,您可以使用ConnectionCallback,因此您无需关闭连接或进行连接。

例如:

private String getProduct() {
return this.jdbcTemplate.execute(new ConnectionCallback() {
@Override
public String doInConnection(Connection connection) throws SQLException,
DataAccessException {
return connection.getMetaData().getDatabaseProductName();
}
});
}

实际上,这很危险,因为您正在打开一个非托管连接。相反,您应该使用ConnectionCallback或再次关闭连接。

好吧,这是一个如何找到他想要的信息的示例。当然必须对连接进行良好的管理,但这不是这里的问题。问题是在哪里可以找到此信息,我认为您无需使用Connection就可以获取此信息。

我不是这样说的。但是根据我的经验,人们从此处复制/粘贴代码,然后在x次调用此代码后由于池已耗尽而出现问题。因此,mu建议您使用ConnectionCallback而不需要将其关闭(或考虑关闭它)。

你是对的。我没有想到人们会复制和粘贴代码:)我将编辑答案

谢谢,我已经在用这个了。问题是我需要预先知道给定数据库的供应商名称,而无需使用上面的代码来查找它。无论如何,我可以获得DB的枚举,例如docs.spring.io/spring/docs/current/javadoc-api/org/,因此它不依赖于字符串值

最简单的方法是使用JdbcUtils#extractDatabaseMetaData方法-http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/support/JdbcUtils.html#extractDatabaseMetaData-javax.sql。 DataSource-java.lang.String-

喜欢:

JdbcUtils.extractDatabaseMetaData(jdbcTemplate.getDataSource(),"getDatabaseProductName");

还有一个JdbcUtils#commonDatabaseName方法试图标准化数据库产品名称-http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/support/JdbcUtils.html#commonDatabaseName -java.lang.String-

因此用法应如下所示? JdbcUtils.commonDatabaseName(JdbcUtils.extractDatabaseMetaData(jdbcTemplate.getDataSource()," getDatabaseProductName"))

当然,如果您想将它们组合在一起,那对我来说似乎很好,尽管您需要将参数转换为String到commonDatabaseName。

您可以使用类似的方法获取基础连接,然后一旦从数据库元数据中获取所需的信息,就可以释放它。

DataSource dataSource = jdbcTemplate.getDataSource();

Connection connection = DataSourceUtils.getConnection(dataSource);

String dbProductName = connection.getMetaData().getDatabaseProductName();

DataSourceUtils.releaseConnection(connection, dataSource);

希望这对您有所帮助。 !

谢谢,我已经在用这个了。问题是我需要预先知道给定数据库的供应商名称,而无需使用上面的代码来查找它。无论如何,我可以获得DB的枚举,例如docs.spring.io/spring/docs/current/javadoc-api/org/,因此它不依赖于字符串值