我如何在 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 代码中的 registerB
和 registerC
,如下所示:
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());
}
}
我正在使用参数 (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 代码中的 registerB
和 registerC
,如下所示:
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());
}
}