2015-02-23 2 views

ответ

4

${} не поддерживает индекс параметров в соответствии с моим тестом. Вы можете использовать аннотацию 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.

+0

Это помогло мне понять, что в моем случае мне нужно было заменить '# {' на '$ {': первая предназначена для MyBatis для создания параметра PreparedStatement, в то время как последняя предназначена для простой инъекции String. См. Раздел «String Substitution» в http://www.mybatis.org/mybatis-3/sqlmap-xml.html – cellepo

+0

^Очень важный момент о различии между синтаксисом $ {...} и # {...}. Один является безопасным SQL-инъекцией (#), а другой NOT ($), – indivisible

Смежные вопросы