MyBatis 插入一对多关系

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 信息,但是它不起作用,我该如何使它起作用?或者我不能把它们放在一个范围内?

Pau*_*Pau 5

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

然后在您的界面中,您将至少拥有三个方法:insertQuestioninsertQuestionOptions以及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)将插入问题和选项一对多关系的方法。