Nee*_*n.Z 4 insert one-to-many mybatis
我有一个非常简单的(Question)一对多(Options)关系,Option 有 FK (questionId)to Question,现在我要在一个 XML 配置中插入一个带有选项列表的 Question 对象。
题:
public Class Question{
...
private Integer questionId;
private List<Option> options;
....
}
Run Code Online (Sandbox Code Playgroud)
选项:
public Class Option{
...
private Integer optionId;
private String context;
private Integer questionId; //FK
....
}
Run Code Online (Sandbox Code Playgroud)
配置:
...
<insert id="insertQuestion" parameterType="com.pojos.Question" useGeneratedKeys="true">
INSERT into question (...) VALUES (...);
<selectKey keyColumn="questionId" keyProperty="questionId" resultType="int">
SELECT MAX(questionId) FROM question;
</selectKey>
INSERT INTO option (context, questionId)
VALUES
<foreach collection="options" item="option" open="(" separator="),(" close=")">
#{option.context}, #{questionId}
</foreach>
</insert>
...
Run Code Online (Sandbox Code Playgroud)
如您所见,我想使用刚刚自动生成的questionId作为选项的 FK 信息,但是它不起作用,我该如何使它起作用?或者我不能把它们放在一个范围内?
在 java 8 中,您可以使用default接口方法。首先,您需要将操作与以下内容分开:
主表:
INSERT into question (...) VALUES (...);
<selectKey keyColumn="questionId" keyProperty="questionId" resultType="int">
SELECT MAX(questionId) FROM question;
</selectKey>
Run Code Online (Sandbox Code Playgroud)一对多关系
INSERT INTO option (context, questionId)
VALUES
<foreach collection="options" item="option" open="(" separator="),(" close=")">
#{option.context}, #{questionId}
</foreach>
Run Code Online (Sandbox Code Playgroud)
然后在您的界面中,您将至少拥有三个方法:insertQuestion,insertQuestionOptions以及insertQuestionWithOptions使用这两种方法插入它的默认方法(例如,您可以调用它)。
public interface QuestionDao {
int insertQuestion(Question question);
int insertOptions(List<Option> options);
default int insertQuestionsWithOptions(Question question) {
insertQuestion(question);
insertOptions(question.getOptions());
}
}
Run Code Online (Sandbox Code Playgroud)
因此,现在您可以使用insertQuestionsWithOptions(Question question)将插入问题和选项一对多关系的方法。