MyBatis插入一对多关系

时间:2015-10-09 02:27:45

标签: insert one-to-many mybatis

我有一个非常简单的(Question)到很多(Options)关系,Option有FK (questionId)来问,现在我要插入一个带有列表的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信息,但是它没有通过,我怎样才能使它工作?或者我不能把它们放在一个范围内?

1 个答案:

答案 0 :(得分:2)

在java 8中,您可以使用default接口方法。 首先,您需要将操作与以下内容分开:

  • 主表:

    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),它会在一对多的关系中插入问题和选项。