Привет, теперь я использую mybatis для создания динамического c sql в Spring boot framework. и база данных mysql. Я запускаю его локально, сервер sql это MYSQL 8.0.21 . Для mybatis я использую (build.gradle)
compile('org.mybatis:mybatis:3.4.6')
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
compile('mysql:mysql-connector-java:8.0.13')
Когда я пытался сделать это в. xml file:
<update id="update" parameterType="java.util.List" keyProperty="id">
<foreach collection="list" item="answer" index="index" separator=";">
UPDATE Answer
SET RequestId=#{answer.requestId}, QuestionId=#{answer.questionId}, QuestionnaireId = #{answer.questionnaireId},
AnswerText = #{answer.content}, AnswerChoiceId = #{answer.choiceId}, CreatedTime = #{answer.createdTime},
LastUpdatedTime = #{answer.lastUpdatedTime}
WHERE AnswerId = #{answer.id}
</foreach>
</update>
, он отлично работает, если я просто передайте один элемент, подобный этому (Json, примеры ниже просто показывают вам поля, это не означает, что я передаю значения в этом формате. На самом деле, я конвертирую следующие примеры как список в java) :
[
{
"id": 2,
"requestId": 2,
"questionnaireId": 3,
"questionId": 5,
"content": "PROD",
"choiceId": 8,
"createdTime": "2020-08-04 20:50:41"
}
]
, но когда я добавляю два элемента, возникает ошибка:
[
{
"id": 2,
"requestId": 2,
"questionnaireId": 3,
"questionId": 5,
"content": "PROD",
"choiceId": 8,
"createdTime": "2020-08-04 20:50:41"
},
{
"id": 3,
"requestId": 2,
"questionnaireId": 3,
"questionId": 5,
"content": "LAB",
"choiceId": 7,
"createdTime": "2020-08-04 20:50:41"
}
]
Сообщение об ошибке:
"\n### Error updating database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE Answer\n SET RequestId=2, QuestionId=5, QuestionnaireId = 3,\n ' at line 7\n### The error may involve com.sample.demo.example.repository.mapper.AnswerMapper.update-Inline\n### The error occurred while setting parameters\n### SQL: UPDATE Answer SET RequestId=?, QuestionId=?, QuestionnaireId = ?, AnswerText = ?, AnswerChoiceId = ?, CreatedTime = ?, LastUpdatedTime = ? WHERE AnswerId = ? ; UPDATE Answer SET RequestId=?, QuestionId=?, QuestionnaireId = ?, AnswerText = ?, AnswerChoiceId = ?, CreatedTime = ?, LastUpdatedTime = ? WHERE AnswerId = ?\n### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE Answer\n SET RequestId=2, QuestionId=5, QuestionnaireId = 3,\n ' at line 7\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE Answer\n SET RequestId=2, QuestionId=5, QuestionnaireId = 3,\n ' at line 7",
Кажется ошибка при итерации по списку? Также я не вижу ошибок в моем коде, может ли кто-нибудь помочь?
Обновление Я также пытался добавить ";" в конце, а также «НАЧАЛО» и «КОНЕЦ». По-прежнему не повезло
BEGIN
<foreach collection="list" item="answer" index="index" separator=";">
UPDATE Answer
SET RequestId=#{answer.requestId}, QuestionId=#{answer.questionId}, QuestionnaireId = #{answer.questionnaireId},
AnswerText = #{answer.content}, AnswerChoiceId = #{answer.choiceId}, CreatedTime = #{answer.createdTime},
LastUpdatedTime = #{answer.lastUpdatedTime}
WHERE AnswerId = #{answer.id}
</foreach>
;
END;
Последний вопрос: я знаю, что это не пакетная операция. Так сделайте l oop в java или используйте этот foreach в mybatis. что лучше? Я думал, что с помощью foreach может быть немного быстрее?