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

我尝试过使用

SELECT COUNT(*) FROM :TableName;

在 JDBI 中我使用了

.bind("Tablename", "MyTable")

结果总是在单引号内:

SELECT COUNT(*) FROM 'MyTable';

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

【问题讨论】:

    标签: java mysql sql database jdbi


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 2022-11-07
      • 2021-08-25
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多