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;


Картограф.java:



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


Картограф.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>


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

730   7  

7 ответов:

Если вы хотите получить сгенерированный первичный ключ, вы должны передать аргументы по 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");

Для меня это работает так (mybatis 3.икс) .. Идентификатор должен быть установлен auto increment в таблице 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 id), я использую:

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

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

  1. С помощью useGeneratedKeys="true", keyProperty="id", keyColumn="id"

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

  2. Используя тег <selectKey/> inside insert

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

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

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

Если вы взгляните на MyBatis документации, useGeneratedKeys и Этот - это то, что вам нужно как минимум получить автоинкремент данных (для базы данных, вы должны добавить keyColumn).

Как вы можете видеть, useGeneratedKeys зависит от того, если / как реализуется метод getGeneretadKeys JDBC базы данных.

Например, с mysql или H2, getGeneretadKeys поддерживают только один столбец. Последним сгенерированным ключом будет тот самый возврат по getGeneretadKeys.

В заключение, в вашем случае нужно добавить только useGeneratedKeys и этот (с ID_ERROR типа AUTO_INCREMENT):

Картограф.xml

<resultMap type='pathToJavaClass/Error' id='error'>
    <id property='id' column='ID_ERROR' />
    <result property='timestamp' column='DATE' />
    <result property='type' column='TYPE'/>
    <result property='message' column='MESSAGE'/>
    <result property='source' column='SOURCE'/>
</resultMap>
<insert id="insertRecord" parameterType="error" useGeneratedKeys="true" keyProperty="id">
INSERT INTO errors (
    DATE,
    TYPE,
    MESSAGE,
    SOURCE
)
VALUES (
    #{timestamp},
    #{type},
    #{message},
    #{source}
)
</insert>

Интерфейс.java

public void insertRecord(@Param("error") Error error);

Если вы все еще получаете некоторую проблему для получения сгенерированных ключей, проверьте также документацию JDBC mysql (более старая версия может не реализовывать getGeneretadKeys).

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

    <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>

Случае

@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;
}

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

  1. Создайте ошибку POJO с идентификатором в качестве атрибута

  2. Замените returnId на error, как показано ниже,

Public void insertRecord (@Param ("error") Error ошибка, @Парам("метка")метки метки,@парам("тип") строку типа,@парам("сообщение") строку сообщения,@парам("источник") исходной строки);

  1. Изменить этот="ID_ERROR" на этот="ошибка.идентификатор"

  2. Удалить

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

Вы получите вставку id в error.id

Comments

    Ничего не найдено.