1 业务场景
项目中存在项目、合同两种数据实体,且项目与合同的关系为一对多
我们在数据库中创建项目合同关系表,表中只有项目id与合同id两个字段
所以,在新建项目时,只需要批量插入项目与合同的关联关系即可
2 实现方式
2.1 repository多参数传入
public interface ProjectRepository {
/** * 批量新增项目与合同关系
*
* @param projectId 项目id
* @param contractIds 临时项目id数组
*/
void addProjectContractRelation(@Param("projectId") String projectId, @Param("contractIds") List<String> contractIds);
}
2.2 Mybatis循环插入
<insert id="addProjectContractRelation">
insert into t_project_contract (project_id, contract_id) values
# collection的名字要和repository传入的参数名称(注解@Param中的)一致
<foreach collection="contractIds" item="id" index="index" separator=",">
(#{projectId}, #{id})
</foreach>
</insert>
3 遇到的坑及解决办法
3.1 传入的数组参数为null
在测试中,发现实际传入的合同id数组可能为null,这种情况下Mybatis会直接报错,经过初步愚蠢考虑,我决定增加if标签,然后触发了第二个坑
<insert id="addProjectContractRelation">
<if test="contractIds!=null and contractIds.length>0">
insert into t_project_contract (project_id, contract_id) values
# collection的名字要和repository传入的参数名称(注解@Param中的)一致
<foreach collection="contractIds" item="id" index="index" separator=",">
(#{projectId}, #{id})
</foreach>
</if>
</insert>
3.2 在MySQL下, Mybatis执行SQL不能为空
在完成3.1中的愚蠢修改后,继续进行测试,发现直接报错:
MySQL 1065:Query was empty
虽然报的是MySQL的错误,但发生错误是在Mybatis
因为我传入的contractIds为空,所以这次查询其实并没有SQL语句,从而导致MySQL报错
所以最终解决方案是去掉if标签,在代码中进行是否为空的判断