Как вернуть идентификаторы при вставке в mybatis и oracle с аннотацией

#java #oracle #annotations #mybatis

#java #Oracle #аннотации #mybatis

Вопрос:

Я пытаюсь выполнить следующее в Java

 @Insert("INSERT INTO USERS (ID,NAME,AGE) VALUES(USER_SEQ.NEXTVAL,#{name},#{age})")
@Options(useGeneratedKeys=true, keyProperty="ID", keyColumn="ID")
public int insertUsers(User userBean);
  

Он должен возвращать новый обобщенный идентификатор, но он всегда возвращает «1», даже если он делает вставку в таблицу надлежащим образом.

Может ли кто-нибудь попробовать это «Получение идентификаторов взамен или вставка в MyBatis (аннотация) с помощью oracle»

Комментарии:

1. Вы пробовали ВОЗВРАЩАЕМОЕ предложение, предлагаемое Oracle? oracle-base.com/articles/misc/dml_returning_into_clause.php

2. Спасибо за ваш ответ, но …. ВОЗВРАЩАЕМОЕ предложение всегда возвращает значение, которое необходимо сохранить в некоторой переменной, но я использую вставку в одну строку вместо того, чтобы использовать процедуру для того же

3. Справедливо, удачи в решении проблемы. 🙂

4. он возвращает 1, поскольку он изменил 1 строку. Проверка — executeUpdate на PreparedStatement возвращает количество измененных ros. Я не думаю, что есть хорошее решение вашей проблемы. Я использую отдельный метод для создания нового идентификатора, присваиваю ему значение domain и сохраняю его.

5. Звучит хорошо, но, дорогой, я не могу этого сделать, потому что я работаю над существующей системой и фреймворком, и я могу вносить такие изменения.

Ответ №1:

Прочитайте документацию MyBatis.

KeyProperty — это поле, в которое MyBatis установит ключ с помощью getGeneratedKeys или дочернего элемента selectKey инструкции insert .

Итак, дано Pojo с полем «id» с методами get и set. После выполнения инструкции insert с классом Mapper поле id в pojo будет задано с сгенерированным значением ключа.

Комментарии:

1. Чтобы показать явный пример: допустим, у вас есть Student pojo с id атрибутом. Создайте свой новый student и вызов studentMapper.addNewStudent(student); Now student.getId() содержит номер auto, а не возвращаемое значение from addNewStudent() — это всегда будет количество затронутых строк.

Ответ №2:

Спасибо всем за ваши ответы, но у меня есть решение, вот оно…..

 @Insert("INSERT INTO USERS (NAME,AGE) VALUES(#{name},#{age})") 
@SelectKey(statement="select STANDARDS_ID_SEQ.CURRVAL from dual", resultType = int.class, before = false, keyProperty = ID)
@Options(useGeneratedKeys=true, keyProperty="ID", keyColumn="ID")
  

теперь он вернет новый созданный идентификатор