以list为输入条件,查询数据库表,java中的mapper层和mybatis层应该怎么写?

根据一个 List 中的两个字段 rangeCode 和 unitcd,查询数据库表 model_engineering_spatial_unit。这个需求在 Java + MyBatis 项目中非常常见,下面我将为你详细写出 Mapper 接口(Java) 和 MyBatis XML 映射文件 的写法。

✅ 前提说明实体类:PlanSchemeProductionGongkuangStatus

java 复制代码
public class PlanSchemeProductionGongkuangStatus {
    private String rangeCode;
    private String unitcd;

    // getter and setter...
}

查询目标表:model_engineering_spatial_unit

假设你要查询的是:

java 复制代码
SELECT *
FROM model_engineering_spatial_unit
WHERE range_code = ? AND unitcd = ?

对于多个对象的情况,是多个 (range_code, unitcd) 对组合。

✅ Mapper 层接口定义(Java)

java 复制代码
import java.util.List;

public interface SpatialUnitMapper {

    /**
     * 根据 rangeCode 和 unitcd 列表查询数据
     */
    List<ModelEngineeringSpatialUnit> queryByRangeAndUnit(List<PlanSchemeProductionGongkuangStatus> conditions);
}

✅ MyBatis XML 映射文件(XML)(重点)

java 复制代码
<!-- Mapper Namespace: com.example.mapper.SpatialUnitMapper -->
<mapper namespace="com.example.mapper.SpatialUnitMapper">

    <select id="queryByRangeAndUnit" resultType="com.example.model.ModelEngineeringSpatialUnit">
        SELECT *
        FROM model_engineering_spatial_unit
        <where>
            <foreach collection="conditions" item="item" separator=" OR ">
                (range_code = #{item.rangeCode} AND unitcd = #{item.unitcd})
            </foreach>
        </where>
    </select>

</mapper>

✅ 使用说明

• 遍历传入的 List。

•每个元素取出 rangeCode 和 unitcd,作为一组条件拼接成 (range_code = ? AND unitcd = ?)。

•多组条件用 OR 连接,最终实现批量查询。

• 标签会自动处理 AND / OR 开头的问题,避免 SQL 错误。

✅ 示例调用代码(Service 层)

java 复制代码
@Service
public class SpatialUnitService {

    @Autowired
    private SpatialUnitMapper spatialUnitMapper;

    public void testQuery() {
        List<PlanSchemeProductionGongkuangStatus> conditions = new ArrayList<>();
        conditions.add(new PlanSchemeProductionGongkuangStatus("R001", "U001"));
        conditions.add(new PlanSchemeProductionGongkuangStatus("R002", "U002"));

        List<ModelEngineeringSpatialUnit> result = spatialUnitMapper.queryByRangeAndUnit(conditions);

        // 输出结果
        result.forEach(System.out::println);
    }
}

✅ 如果你使用的是 MyBatis Plus如果你使用的是 MyBatis Plus,可以结合 QueryWrapper 或 LambdaQueryWrapper 实现动态构建查询条件,但上面这种方式更适合直接传递 List 对象进行多条件匹配。

✅ 小贴士

场景 推荐方式

单条记录查询 selectOne()

多个 (rangeCode, unitcd) 组合查询 使用 动态生成多个 OR 条件

查询性能优化 确保 range_code 和 unitcd 字段上有索引

相关推荐
endswel24 分钟前
Spring bean 注册多种方式
java·后端·spring
鬼手点金38 分钟前
opencode-性能优化建议
java·人工智能·git·自动化·nanogpt
聪明蛋子哟39 分钟前
Python与Java双栈实战:手撸一个支持RAG与Tool Calling的高性能Agent框架
java·开发语言·python
by2099941 分钟前
list:迭代器与资源管理实现的综合叙述(下)
数据结构·c++·笔记·list
xuxigifxfh44 分钟前
HJ4 字符串分隔
java·开发语言·华为机考
写后端的胖头鱼1 小时前
Java 反射详解 + 场景示例
java·反射
零基础1231 小时前
PDF 处理工具全攻略:pdf24、PDFgear、Adobe Acrobat DC 与 Stirling-PDF 深度对比
java·开发语言·pdf
SL_staff1 小时前
制造业数字化协同:为什么甘特图只是起点,不是终点
java·开源·全栈
anew___2 小时前
《从零手写操作系统 (29):管道与重定向进阶——命名管道、Here Document与Shell语法扩展》
java·开发语言·前端·javascript·网络
Mikko72 小时前
JVM 线上排查实战(六):JFR 怎么用?JDK 8 要不要加 UnlockCommercialFeatures、jfr 命令在哪、录的文件为什么读不了
java·运维·jvm·后端