我正在尝试创建一条插入语句,该语句允许我在一个 block 中插入多个表,但没有取得任何成功。这是一个例子:
Java 对象:
public class Parent {
String parentId;
List<Child> children;
...getters and setters...
}
public class Child {
String childId;
List<Toy> toys;
...getters and setters...
}
public class Toy {
String toyId;
String color;
...getters and setters...
}
MySQL 表
create table TOY (TOY_ID varchar(10), COLOR varchar(10), CHILD_ID varchar(10),
primary key(TOY_ID), foreign key (CHILD_ID) references CHILD(CHILD_ID));
create table CHILD (CHILD_ID varchar(10), PARENT_ID varchar(10),
primary key(CHILD_ID), foreign key (PARENT_ID) references PARENT(PARENT_ID));
create table PARENT (PARENT_ID varchar(10), primary key(PARENT_ID));
mapper.xml
<resultMap id="ToyResult" type="Toy">
<id property="toyId" column="TOY_ID"/>
<result property="color" column="COLOR"/>
</resultMap>
<resultMap id="ChildResult" type="Child">
<id property="childId" column="CHILD_ID"/>
<collection property="toys" ofType="Toy" resultMap="ToyResult"/>
</resultMap>
<resultMap id="ParentResult" type="Parent">
<id property="parentId" column="PARENT_ID"/>
<collection property="children" ofType="Child" resultMap="childResult"/>
</resultMap>
我想知道是否可以执行如下插入映射:
<insert id="insertParentData" parameterType="Parent">
insert into PARENT(PARENT_ID) values(#{parentId});
insert into CHILD(CHILD_ID, PARENT_ID) values
<foreach collection="children" item="childItem" index="index0" separator=",">
(#{childItem.childId}, #{parentId})
</foreach>;
insert into TOY(TOY_ID, COLOR, CHILD_ID) values
<foreach collection="children" item="childItem" index="index0" separator=",">
<foreach collection="childItem.toys" item="toyItem" index="index1" separator=",">
(#{toyItem.toyId}, #{toyItem.color}, #{childItem.childId})
</foreach>
</foreach>
</insert>
我收到一条错误消息,指出我的 SQL 语法存在错误。它指出了 insert into CHILD
行。
如果这种插入方法不可行,您建议我如何映射插入语句?我可以创建 ParentMapper、ChildMapper 和 ToyMapper xml 文件,并在我的父数据访问对象中进行三个插入调用,每个调用使用不同的映射器插入到不同的表中。
感谢您的帮助。
最佳答案
每个查询都必须有一个元素。也许您可以创建一个“insertParent”java 方法,在父级插入之后,为其子级调用“insertChildren”方法,该方法递归地调用“insertToys”方法。
关于java - MyBatis 复杂插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45554564/