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>
然后在您的界面中您将至少拥有三种方法: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());
}
}
所以,现在您可以使用方法 insertQuestionsWithOptions(Question question)
插入一对多关系的问题和选项。
我有一个非常简单的 (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>
然后在您的界面中您将至少拥有三种方法: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());
}
}
所以,现在您可以使用方法 insertQuestionsWithOptions(Question question)
插入一对多关系的问题和选项。