【问题标题】:MyBatis Complex InsertMyBatis 复杂插入
【发布时间】:2017-08-07 19:42:13
【问题描述】:

我正在尝试创建一个插入语句,允许我在一个块中插入多个表,但没有任何成功。这是一个例子:

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 文件,并且在我的父数据访问对象中我会有三个插入调用,每个调用使用不同的映射器插入到不同的表中。

感谢您的帮助。

【问题讨论】:

标签: java mybatis


【解决方案1】:

每个查询都必须有一个元素。也许你可以创建一个“insertParent”java 方法,在父插入之后,为他的孩子调用“insertChildren”方法,递归调用“insertToys”方法。

【讨论】:

    【解决方案2】:

    我通过将大插入分成三个单独的插入并在我的 DAO 中调用它们解决了这个问题。

    【讨论】:

    • @George,你能在这里分享完整的答案吗
    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2016-01-28
    相关资源
    最近更新 更多