Mybatis 3.0.5 сопоставление операторов вставки / обновления с несколькими входами - PullRequest
1 голос
/ 06 октября 2011

Может быть, я упускаю что-то очевидное, но я не могу выполнить успешно выполненный простой оператор вставки.

Используя следующий интерфейс

public interface CustomItemMapper 
{
    Integer insert(CustomItem item, @Param("extra") String someparam);
}

и следующее сопоставление XML

  <insert id="insert" useGeneratedKeys="false" parameterType="map" keyProperty="id">
    insert into CustomItem (id, column2, column3, column4, column5, column6)
        values (#{id}, #{field2}, #{field3}, #{field4}, #{field5}, #{extra})
  </insert>

и этот код

SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) servletContext.getAttribute("SqlSessionFactory");
SqlSession session = sqlSessionFactory.openSession();
try 
{ 
    CustomItemMapper mapper = session.getMapper(CustomItemMapper.class); 
    mapper.update(item);
    session.commit();
} 
finally 
{ 
    session.close(); 
} 

Я получаю следующий отладочный вывод:

Checked out connection 368716606 from pool.
ooo Connection Opened
==>  Executing: insert into CustomItem (id, column2, column3, column4, column5, column6) values (?, ?, ?, ?, ?, ?) 
==> Parameters: null, null, null, null, null, actual_value_of_extra(String)
xxx Connection Closed
Returned connection 368716606 to pool.

, за которым следует исключение SQL (невозможно ввести ноль в столбец id).

Таким образом, единственное значение, которое было передано правильно, - это дополнительная предоставленная строка.Я проверил, что имена полей являются правильными, и объект не является нулевым в этой точке, и поля заполнены правильно.

Я также попытался использовать parameterType="CustomItem" вместо parameterType="map", но результат не изменился.

Буду признателен, если кто-нибудь сообщит мне, что мне здесь не хватает.

Заранее спасибо.

PS: Я тоже сталкиваюсь с той же проблемой с операторами вставки.

Ответы [ 2 ]

5 голосов
/ 06 октября 2011

Вам необходимо указать имя другого параметра в вашем методе отображения.Я предполагаю, что CustomItem - это Java-бин с методами get для field1 и т. Д. Как уже упоминалось, измените тип параметра, чтобы он не был Map.

Из mybatis документация ,

Вы можете передать несколько параметров в метод отображения.Если вы это сделаете, они будут названы по их позиции в списке параметров по умолчанию, например: # {1}, # {2} и т. Д. Если вы хотите изменить имя параметров (только несколько), то вы можетеиспользуйте аннотацию @Param («paramName») для параметра.

Итак, измените свой Mapper,

public interface CustomItemMapper 
{
    Integer insert(@Param("item")CustomItem item, @Param("extra") String someparam);
}

и измените xml на,

 <insert id="insert" useGeneratedKeys="false" parameterType="map" keyProperty="id">
    insert into CustomItem (id, column2, column3, column4, column5, column6)
        values (#{id}, #{item.field1}, #{item.field2}, #{item.field3}, #{item.field4}, #{extra})
  </insert>
0 голосов
/ 06 октября 2011

Если вы передаете экземпляр CustomItem в вызов update(), тогда parameterType определенно должно быть полностью определенным именем класса, а не "map" - вы должны использовать последний, только если Вы передавали java.util.Map методу insert().

...