如何重用带有参数的SQL片段?

时间:2014-11-13 03:17:09

标签: mybatis ibatis

我打算制作一个片段,用于重复使用参数。

<insert ...>
  <selectKey keyProperty="id" resultType="_long" order="BEFORE">
    <choose>
      <when test="_databaseId == 'derby'">
        VALUES NEXT VALUE FOR SOME_ID_SEQ
      </when>
      <otherwise>
        SELECT SOME_ID_SEQ.NEXTVAL FROM DUAL
      </otherwise>
    </choose>
  </selectKey>
  INSERT INTO ...
</insert>

我可以使用参数制作SQL片段吗?

<sql id="selectKeyFromSequence">
  <selectKey keyProperty="id" resultType="_long" order="BEFORE">
    <choose>
      <when test="_databaseId == 'derby'">
        VALUES NEXT VALUE FOR #{sequenceName}
      </when>
      <otherwise>
        SELECT #{sequenceName}.NEXTVAL FROM DUAL
      </otherwise>
    </choose>
  </selectKey>
</sql>

这样我可以像这样重用它们吗?

<insert ...>
  <include refid="...selectKeyFromSequence"/> <!-- How can I pass a parameter? -->
  INSERT INTO ...
</insert>

这可能吗?

2 个答案:

答案 0 :(得分:12)

从版本3.3.0开始,您可以这样做:

<sql id="myinclude">
  from ${myproperty}
</sql>

<include refid="myinclude">
  <property name="myproperty" value="tablename"/>
</include>

请参阅http://www.mybatis.org/mybatis-3/sqlmap-xml.html

中的SQL部分

答案 1 :(得分:2)

您无法将参数传递给代码。有类似的SO questioniBatis issueMyBatis issue

  

包括在解析xmls时的内联,因此不存在   一旦启动过程完成(从MyBatis问题),他们自己。

但是,您可以在标签内使用变量。您不将其作为参数传递,但可以将其作为参数提供给具有include标记的函数。您需要在所有函数中使用相同的变量名称,即#{sequenceName}