如何在 JDBI 中动态绑定表名

Posted

技术标签:

【中文标题】如何在 JDBI 中动态绑定表名【英文标题】:How to dynamically bind a table name in JDBI 【发布时间】:2014-06-30 14:12:21 【问题描述】:

我尝试过使用

SELECT COUNT(*) FROM :TableName;

在 JDBI 中我使用了

.bind("Tablename", "MyTable")

结果总是在单引号内:

SELECT COUNT(*) FROM 'MyTable';

有没有合适的方法来参数化 TableName 之类的东西?

【问题讨论】:

【参考方案1】:

bind 不是用于标识符,而是用于值。 Table 是一个数据库对象,它的名字是一个标识符来引用它。

因此您必须显式构造 sql 查询字符串以动态包含表名。

示例

String tableName = "employee";
String sql = "SELECT COUNT(*) FROM " + tableName;

然后,如果您想根据字段值或表达式过滤计数或任何其他结果,您可以绑定它。

示例

sql = sql + " WHERE deptno = :deptNoToBind";
int deptNo = 20;
// ... use db handle to bind
handle.createQuery( sql )
      .bind( "deptNoToBind", deptNo );

您可以看到列或表达式的值是绑定的,但不是标识符。

您正在寻找的功能是@Define - 这是它的使用示例:

import org.skife.jdbi.v2.sqlobject.customizers.Define;
...
@SqlUpdate("create table if not exists <table> (" +
        "startTime TimeStamp not null," +
        "stopTime TimeStamp not null," +
        "uuid varchar(255)" +
        ")")
public void createTable(@Define("table") String table);

【讨论】:

@UnknownDownVoter:否决投票的具体原因!? 讨厌的人会讨厌,眉毛。 ¬¬ 如果您对 使用 语法,则需要使用 @UseStringTemplate3StatementLocator 注释接口,并为此注释将此依赖项添加到您的 pom org.antlrstringtemplate3.2
【参考方案2】:
import org.skife.jdbi.v2.sqlobject.customizers.Define;
import org.skife.jdbi.v2.sqlobject.stringtemplate.UseStringTemplate3StatementLocator;

@UseStringTemplate3StatementLocator
public interface CreateTableDAO 

    @SqlUpdate("create table if not exists <table> (" +
        "startTime TimeStamp not null," +
        "stopTime TimeStamp not null," +
        "uuid varchar(255)" +
        ")")
    public void createTable(@Define("table") String table);


别忘了为 UseStringTemplate3StatementLocator 注解添加依赖

<dependency>
    <groupId>org.antlr</groupId>
    <artifactId>stringtemplate</artifactId>
    <version>3.2</version>
</dependency>

【讨论】:

以上是关于如何在 JDBI 中动态绑定表名的主要内容,如果未能解决你的问题,请参考以下文章

不能在 sql 查询 APEX ORACLE 中使用绑定变量作为表名

使用绑定变量在雪花中加载数据

Oracle - 如何使用动态绑定参数定义动态 SQL?

如何绑定动态变量?

Oracle - 如何使用动态绑定参数定义动态SQL?

如何阻止动态元素在 Jquery/Jquery Mobile 中重新绑定?