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>
Что случилось? Как я могу получить сгенерированный ключ этой вставки?
Спасибо!
7 ответов:
Если вы хотите получить сгенерированный первичный ключ, вы должны передать аргументы по
MapилиPOJO Objectpublic 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");
Вы можете достичь этого двумя способами,
С помощью
useGeneratedKeys="true", keyProperty="id", keyColumn="id"
keyPropertyссылается на имя переменной POJO иkeyColumnссылается на созданное имя столбца в базе данныхИспользуя тег
<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; }
Пожалуйста, выполните следующие действия:
Создайте ошибку POJO с идентификатором в качестве атрибута
Замените returnId на error, как показано ниже,
Public void insertRecord (@Param ("error") Error ошибка, @Парам("метка")метки метки,@парам("тип") строку типа,@парам("сообщение") строку сообщения,@парам("источник") исходной строки);
Изменить этот="ID_ERROR" на этот="ошибка.идентификатор"
Удалить
<selectKey resultType="long" order="AFTER" keyProperty="returnedId"> SELECT LAST_INSERT_ID() as returnedId </selectKey>Вы получите вставку
idвerror.id
Comments