MyBatis:“编译时”mapper params替换,保持准备stmt但使表名可配置?

时间:2012-07-16 00:48:18

标签: ibatis mybatis sql-parametrized-query

MyBatis 3.1.1允许#{...}用于准备好的语句参数, 或每次更换$ {...}。

我遗漏了一些允许参数化SQL语句部分但仍保留其准备语句的内容;即在配置期间更换。

我该怎么做?也许使用一些SQL片段?

更新

我找到了:

<sql id="userColumns"> id,username,password </sql>
<select id="selectUsers" parameterType="int" resultType="hashmap">
    SELECT <include refid="userColumns"/> some_table WHERE id = #{id}
</select>

参见http://www.mybatis.org/core/sqlmap-xml.html#sql 如果可以在其中使用${...},那就是这样。

3 个答案:

答案 0 :(得分:1)

我想我发现了......

<sql id="userColumns"> id,username,password </sql>

然后

<select id="selectUsers" parameterType="int" resultType="hashmap">
    SELECT <include refid="userColumns"/>
    FROM some_table
    WHERE id = #{id}
</select>

所以我会在那里使用$ {...},这应该让我在那里。

请参阅http://www.mybatis.org/core/sqlmap-xml.html#sql

答案 1 :(得分:1)

在我的项目中,我们有一个非常简单的解决方案。

我们在数据对象中有一个名为TABLENAME的字符串。 当我们构造对象时,我们初始化表名。 在sqls中我们有tablename enquoutet。

DataObject中的

String TABLENAME;
public String getTABLENAME() {return TABLENAME;}
public void setTABLENAME(String tablename) {this.TABLENAME = TABLENAME;}

在sqls中:

<delete id="simpleDelete" parameterClass="Integer">
    delete from ${jdbc.schema}.$TABLENAME$ 
    WHERE ID = #ID#
</delete>

我不知道这是否是最好的解决方案,但效果很好。我愿意接受更好的解决方案。

答案 2 :(得分:0)

由于<sql>无法满足此目的,我填写了一个功能请求。 http://code.google.com/p/mybatis/issues/detail?id=627