Mybatis 包含的SQL片段不替换参数

Mybatis 包含的SQL片段不替换参数,mybatis,ibatis,Mybatis,Ibatis,我的映射器界面如下所示 公共接口CommonMapper{ long SelectSequenceNumber字符串sequenceName; } 我准备的sql映射程序如下所示 值{sequenceName}的下一个值 从DUAL中选择{sequenceName}.NEXTVAL -> 当我测试映射器{sequenceName}时,部分不替换为给定的 14:36:09.492 [main] DEBUG ....selectSequenceNumber - ==> Preparing:

我的映射器界面如下所示

公共接口CommonMapper{ long SelectSequenceNumber字符串sequenceName; } 我准备的sql映射程序如下所示

值{sequenceName}的下一个值 从DUAL中选择{sequenceName}.NEXTVAL -> 当我测试映射器{sequenceName}时,部分不替换为给定的

14:36:09.492 [main] DEBUG ....selectSequenceNumber - ==>  Preparing: VALUES NEXT VALUE FOR ? 
14:36:09.724 [main] ERROR ....PersistenceTests - failed to apply function for SqlSession
org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "?" at line 1, column 23.
### The error may exist in .../CommonMapper.xml
### The error may involve ....CommonMapper.selectSequenceNumber
### The error occurred while executing a query
### SQL: VALUES NEXT VALUE FOR ?
### Cause: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "?" at line 1, column 23.

这正常吗?如何解决此问题?

您需要使用字符串替换${sequenceName},而不是使用{}设置参数,以便在查询中直接放置字符串,例如提供对象名称、动态sql等

<sql id="sequenceNumber">
  <choose>
    <when test="_databaseId == 'derby'">
      VALUES NEXT VALUE FOR ${sequenceName}
    </when>
    <otherwise>
      SELECT ${sequenceName}.NEXTVAL FROM DUAL
    </otherwise>
  </choose>
</sql>
<select id="selectSequenceNumber" resultType="_long">
  <!--<include refid="....mapper.CommonMapper.sequenceNumber"/>-->
  <include refid="sequenceNumber"/>
</select>

除了我没有找到另一个错误参数“\u databaseId”之外,我是否可以实际使用_databaseId。据我所知,如果_databaseId是一个全局参数,并且您能够将其写入XML中,那么您可以在任何XML中使用它。请注意,如果输入来自不受信任的源,则使用${}语法可能会使您的应用程序易受SQL注入攻击。