首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MyBatis 多参数传递实战:Map 封装与注解映射双方案

     編輯:程式設計綜合問答

场景描述

SpringMVC + MyBatis 架构下,ServiceImpl 层需将多个业务参数(如 id、name、age)传递给 Mapper XML 的 SQL 语句。

方案一:Map 封装(通用、灵活)

Mapper XML

<select id="selectUsers" parameterType="map" resultType="User">
    SELECT * FROM user 
    WHERE id = #{id} AND name = #{name} AND age = #{age}
</select>

ServiceImpl 实现

public List<User> queryUsers(Long id, String name, Integer age) {
    Map<String, Object> params = new HashMap<>();
    params.put("id", id);
    params.put("name", name);
    params.put("age", age);
    
    SqlSession session = sqlSessionFactory.openSession();
    try {
        return session.selectList("namespace.selectUsers", params);
    } finally {
        session.close();
    }
}

方案二:@Param 注解(参数少、语义清晰)

Mapper 接口

List<User> selectUsers(@Param("id") Long id, 
                       @Param("name") String name, 
                       @Param("age") Integer age);

XML 保持不变

MyBatis 自动将注解值映射为参数名,#{id} 直接可用。

方案对比与选型建议

维度Map 方案@Param 方案
参数数量任意多建议 ≤ 5 个
类型安全运行时检查编译时检查
重构友好键名字符串易错IDE 支持重命名
动态参数原生支持需额外封装
推荐场景通用查询、动态条件固定业务方法

最佳实践补充

  • 实体类直接传参:若参数对应实体字段,直接传实体对象,XML 中用 #{id}、#{name} 访问
  • 分页插件配合:PageHelper 等分页插件兼容两种方式
  • 复杂查询:建议定义专用 DTO/VO 类,替代 Map 提升可维护性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved