我如何在 mybatis 中重用 <insert> 标签?

How can i reuse an <insert> tag in mybatis?

我正在使用参数 (A a) 在数据库中插入对象 A。那样的对象

A {
   List<B> b;
   List<C> c;
}

在映射器文件中我使用了这个函数:

void register(@Param("a")A a);

在mapper.xml中,我写了如下代码:

<insert id="registerB" parameterType="java.util.List">
    <foreach>...</foreach>
</insert>

<insert id="registerC" parameterType="java.util.List">
    <foreach>...</foreach>
</insert>

<insert id="register">
//TODO include insert registerB and registerC
</insert>

如何将 B 和 C 的列表插入到 A 的插入查询中?

您无法在 mapper.xml 中轻松重复使用插入 sql 片段。问题不在于 sql 字符串本身,这是可以做到的(例如 here 所描述的)。

问题出在引用参数上。例如,在 registerB 的插入中,参数是 B 的列表。而且您不能重新定义它以便从 register.

轻松使用它们

但是,您可以使用 java8 默认方法重用 java 代码中的 registerBregisterC,如下所示:

interface MyMapper {
   void registerB(@Param("b")B b);

   void registerC(@Param("c")C c);

   default void register(@Param("a")A a) {
       registerB(a.getB());
       registerC(a.getC());
   }
}