MyBatis 插入一对多关系

MyBatis inserts one to many relationship

我有一个非常简单的 (Question) 对多 (Options) 关系,Option 有 FK (questionId) 到 Question,现在我要插入一个带有列表的 Question 对象一个 XML 配置中的选项。

问题:

public Class Question{
    ...
    private Integer questionId;
    private List<Option> options;
    ....
}

选项:

public Class Option{
   ...
   private Integer optionId;
   private String context;

   private Integer questionId; //FK

   ....
}

配置:

...

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

...

如您所见,我想使用刚刚自动生成的 questionId 作为选项的 FK 信息,但是它不起作用,我怎样才能让它起作用?或者我不能把它们放在一个范围内?

在 java 8 中,您可以使用 default 接口方法。 首先你需要用这样的东西来分离操作:

  • 主要table:

    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>
    

然后在您的界面中您将至少拥有三种方法:insertQuestioninsertQuestionOptions 和使用这两种方法的默认方法(例如,您可以将其称为 insertQuestionWithOptions)插入它。

public interface QuestionDao {

    int insertQuestion(Question question);

    int insertOptions(List<Option> options);

    default int insertQuestionsWithOptions(Question question) {
        insertQuestion(question);
        insertOptions(question.getOptions());
   }
}

所以,现在您可以使用方法 insertQuestionsWithOptions(Question question) 插入一对多关系的问题和选项。