Mybatis中的批量查询

649 阅读1分钟

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标签,在代码中进行是否为空的判断