【发布时间】:2014-06-30 14:12:21
【问题描述】:
我尝试过使用
SELECT COUNT(*) FROM :TableName;
在 JDBI 中我使用了
.bind("Tablename", "MyTable")
结果总是在单引号内:
SELECT COUNT(*) FROM 'MyTable';
有没有合适的方法来参数化 TableName 之类的东西?
【问题讨论】:
标签: java mysql sql database jdbi
我尝试过使用
SELECT COUNT(*) FROM :TableName;
在 JDBI 中我使用了
.bind("Tablename", "MyTable")
结果总是在单引号内:
SELECT COUNT(*) FROM 'MyTable';
有没有合适的方法来参数化 TableName 之类的东西?
【问题讨论】:
标签: java mysql sql database jdbi
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);
【讨论】:
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>
【讨论】: