Подтвердить что ты не робот

MyBatis, как получить автоматически сгенерированный ключ вставки? [MySql]

как я могу получить сгенерированный ключ вставки с MyBatis? Я прочитал много страниц об этом вопросе, но я все еще заблокирован, может ли кто-нибудь мне помочь, пожалуйста? Это мой код:

Таблица:

ID_ERROR long primary key
DATE timestamp
TYPE varchar
MESSAGE varchar
SOURCE varchar

Дао:

Long returnedId = 0L;
MyMapper myMapper = this.sqlSession.getMapper(MyMapper.class);
myMapper.insertRecord(returnedId, Utils.now(), t.getClass().getName(), t.getMessage(), c.getName());
return returnedId;

Файл mapper.java:

public void insertRecord(@Param("returnedId") Long returnedId, @Param("timestamp")Timestamp timestamp,@Param("type") String type,@Param("message") String message,@Param("source") String source);

Файл mapper.xml

 <insert id="insertRecord" parameterType="map" useGeneratedKeys="true"  keyProperty="ID_ERROR">
    INSERT INTO errors (
        DATE,
        TYPE,
        MESSAGE,
        SOURCE
    )
    VALUES (
        #{timestamp},
        #{type},
        #{message},
        #{source}
    )
    <selectKey resultType="long" order="AFTER" keyProperty="returnedId">
        SELECT LAST_INSERT_ID() as returnedId
    </selectKey>
</insert>

Что не так? Как я могу получить сгенерированный ключ этой вставки? Спасибо!

4b9b3361

Ответ 1

Если вы хотите получить сгенерированный первичный ключ, вы должны передать аргументы Map или POJO Object

public void insertRecord(Map<String, Object> map);

При вызове метода сопоставления поместите значения для отображения.

Map<String, Object> map = new HashMap<String, Object>();
map.put("returnedId", 0);
map.put("message", message);
// other paramters
mapper.insertRecord(map);
return map.get("returnedId");

Ответ 2

Для меня это работает так (mybatis 3.x).. Идентификатор должен быть установлен автоматически приращение в таблице mysql

<insert id="createEmpty" parameterType="Project" useGeneratedKeys="true" keyProperty="project.projectId" keyColumn="PROJECT_ID">
    INSERT INTO PROJECT (TITLE,DESCRIPTION)
    VALUES
    (#{title},#{description})
</insert>

ПРИМЕЧАНИЕ keyProperty="project.projectId" и useGeneratedKeys="true"

мой интерфейс:

public int createEmpty(@Param("project") Project project, @Param("title") String title,
    @Param("description") String description);

наконец, чтобы получить значение (которое будет автоматически присвоено свойству идентификатора pojo), я использую:

projectRepository.createEmpty(p, "one", "two");
System.err.print(p.getProjectId() + "\n");

Ответ 3

Вы можете достичь этого двумя способами:

  • Используя useGeneratedKeys="true", keyProperty="id", keyColumn="id"

    keyProperty относится к имени переменной POJO и keyColumn относится к сгенерированному имени столбца в базе данных

  • Используя <selectKey/> внутри тега insert

Ответ 4

Простое решение:

Используйте атрибут KeyProperty как objectName.AutoincrementId Как ниже...

useGeneratedKeys="true", KeyProperty="person.id", KeyColumn="id"

Ответ 5

В Mapper Xml используйте запрос:

    <insert id="saveDemo" parameterType="com.abc.demo"
       useGeneratedKeys="true" keyProperty="demoId" keyColumn="DEMOID">
       INSERT INTO TBL_DEMO (DEMONAME,DEMODESCRIPTION)
       VALUE (#{demoName},#{demoDescription})
       <selectKey keyProperty="demoId" resultType="int" order="AFTER">
        SELECT LAST_INSERT_ID();
       </selectKey>
    </insert>

Сторона Java

@Override
public boolean saveDemo(Demo demo) {
    boolean status = false;
    SqlSession session = this.sqlSessionFactory.openSession();
    try {
        DemoMapper mapper = session.getMapper(DemoMapper.class);
        mapper.saveDemo(demo);
        session.commit();
        status = true;
    } catch(PersistenceException e) {
        System.out.println(e);
    } finally {
        session.close();
    }
    return status;
}

Ответ 6

Пожалуйста, выполните следующие шаги:

  • Создать ошибку POJO с идентификатором как атрибутом

  • Замените returnId на ошибку, как показано ниже,

public void insertRecord (@Param ( "error" ) Ошибка, @Param ( "timestamp" ) Временная метка метки, @Param ( "type" ) String type, @Param ( "message" ) Строковое сообщение, @Param ( "source" ) String source);

  1. Измените keyProperty = "ID_ERROR" на keyProperty = "error.id"

  2. Удалите

    <selectKey resultType="long" order="AFTER" keyProperty="returnedId">
        SELECT LAST_INSERT_ID() as returnedId
    </selectKey>
    

Вы вставите id в error.id