${}
не поддерживает индекс параметров в соответствии с моим тестом. Вы можете использовать аннотацию Param
, чтобы указать имя параметра в декларации API-интерфейса mapper.
public MatchResult get(long id, @Param("tablename") String tablename);
Mapper XML:
<select id="get" resultType="myresult">
select * from ${tabelname} where id=#{0}
</select>
Альтернативой является использование объекта вашего собственного класса или карты в качестве параметра, если вы не хотите, IBatis/MyBatis
конкретной аннотации Param
в вашем картографа API декларация.
Возьмите карту в качестве примера, ваш Java API может быть: заявления XML
public MatchResult get(Map<String, Object> params);
картографа могут быть:
<select id="get" parameterType="map" resultType="myresult">
select * from ${tablename} where id=#{id}
</select>
И поставил идентификатор и имя таблицы на карту с ключевых «id» и «tablename» перед вызовом API.
Это помогло мне понять, что в моем случае мне нужно было заменить '# {' на '$ {': первая предназначена для MyBatis для создания параметра PreparedStatement, в то время как последняя предназначена для простой инъекции String. См. Раздел «String Substitution» в http://www.mybatis.org/mybatis-3/sqlmap-xml.html – cellepo
^Очень важный момент о различии между синтаксисом $ {...} и # {...}. Один является безопасным SQL-инъекцией (#), а другой NOT ($), – indivisible