使用Mybatis将数据插入到两个表中

我对Mybatis很陌生,遇到了一些问题

完整的场景是我需要读取和excel文件,并将excel数据插入到两个不同的主表和外键关系的表中。 我能够读取Excel数据,并能够插入到主表中,但没有得到如何在第二个表中插入数据实际上问题是我有两个不同的pojo类具有单独的数据为每个表两个不同的映射器。

我通过在父类的pojo内定义子表的pojo来build立关联有没有办法在两个不同的表中插入数据。 可以在单个标签中运行2个插入查询

任何帮助将是可观的

有很多方法可以做到这一点。

这是演示最直接的方法之一 – 使用单独的插入。 确切的解决scheme可能会有所不同,主要取决于主键是从Excel中取出还是在插入数据库期间生成。 这里我假设在插入过程中生成了键(因为这是一个稍微复杂的情况)

假设你有这些POJO:

class Parent { private Integer id; private Child child; // other fields, getters, setters etc } class Child { private Integer id; private Parent parent; // other fields, getters, setters etc } 

然后你在mapper中定义两个方法:

 public interface MyMapper { @Insert("Insert into parent (id, field1, ...) values (#{id}, #{field1}, ...)") @Options(useGeneratedKeys = true, keyProperty = "id") void createParent(Parent parent); @Insert("Insert into child(id, parent_id, field1, ...) values (#{id}, #{parent.id}, #{field1}, ...)") @Options(useGeneratedKeys = true, keyProperty = "id") void createChild(Child child); } 

并使用它们

 MyMapper myMapper = createMapper(); Parent parent = getParent(); myMapper.createParent(parent); myMapper.createChild(parent.getChild()); 

而不是单独的孩子可以有一个集合。 在这种情况下, createChild在循环中为每个孩子执行。

在一些数据库( posgresql , sql server )中,你可以用一个语句插入到两个表中。 然而查询会更复杂。

另一种可能是在一个映射器方法中使用多个插入语句。 我在postgresql中用xml中的映射使用类似于这个的代码:

 <insert id="createParentWithChild"> insert into parent(id, field1, ...) values (#{id}, #{field1}, ...); insert into child(id, parent_id, field1, ...) values (#{child.id}, #{id}, #{child.field1},...) </insert> 

和mapper界面中的方法定义:

 void createParentWIthChild(Parent parent); 

我知道这是有点旧,但是对我来说最好的解决scheme是在我的映射xml中实现2插入节。

 <insert id="createParent"> insert into parent(id, field1, ...) values (#{id}, #{field1}, ...); </insert> <insert id="createChild"> insert into child(id, parent_id, field1, ...) values (#{child.id}, #{id}, #{child.field1},...); </insert> 

然后链接他们。 (如果家长电话失败,不要继续打电话给孩子)

作为一个便笺,在我的情况下,我正在使用骆驼mybatis,所以我的骆驼configuration了

  <from uri="stream:in"/> <to uri="mybatis:createParent?statementType=Insert"/> <to uri="mybatis:createChild?statementType=Insert"/>