我对Mybatis很新,遇到了一些我有问题的情况
完整的场景是我需要读取和excel文件并将excel数据插入到具有主键和外键关系的两个不同表中的数据库中。 我能够读取excel数据并且能够在主表中插入但是没有得到如何在第二个表中插入数据实际问题是我有两个不同的pojo类,每个表有两个不同的映射器的单独数据。
我通过在父类的pojo中定义子表的pojo来实现关联 有没有办法在两个不同的表中插入数据。 可以在单个标记中运行2个插入查询
任何帮助都会很明显
答案 0 :(得分:1)
有很多方法可以做到这一点。
这里演示了一种最直接的方法 - 使用单独的插入。确切的解决方案可能变化不大,主要取决于主键是从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)中,您可以在一个语句中插入两个表。但是查询会更复杂。
另一种可能性是在一个mapper方法中使用多个insert语句。我在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);
答案 1 :(得分:0)
我知道这有点旧,但最适合我的解决方案是在我的映射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>
然后将它们链接起来。 (如果父母呼叫失败,则不继续呼叫孩子)
作为旁注,在我的情况下,我使用camel-mybatis所以我的camel-config有
<from uri="stream:in"/>
<to uri="mybatis:createParent?statementType=Insert"/>
<to uri="mybatis:createChild?statementType=Insert"/>