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>
Что не так? Как я могу получить сгенерированный ключ этой вставки?
Спасибо!
Ответы
Ответ 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);
-
Измените keyProperty = "ID_ERROR" на keyProperty = "error.id"
-
Удалите
<selectKey resultType="long" order="AFTER" keyProperty="returnedId">
SELECT LAST_INSERT_ID() as returnedId
</selectKey>
Вы вставите id
в error.id