Mybatis多条件查询设置参数的三种方法

发布于:2025-07-01 ⋅ 阅读:(21) ⋅ 点赞:(0)

1. 散装参数(@Param注解)

定义:

当Mapper接口方法有多个参数时,每个参数单独列出,需要用@Param("参数名")注解来指定参数在SQL中的占位符名称。

List<Brand> selectByConditon(@Param("status") int status,
                             @Param("companyName") String companyName,
                             @Param("brandName") String brandName);

详细解释

  • 这种方式是每个参数单独列出,每个参数前都加上@Param("参数名")注解。
  • @Param("参数名")的作用是:告诉MyBatis,SQL语句中用到的#{参数名},要和方法参数绑定。
  • 这样写的好处是,参数名和SQL语句中的占位符可以完全自定义,不受Java变量名限制。

SQL映射文件写法

   <resultMap id="brandResultMap" type="com.itheima.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>
    


    <select id="selectByCondition" resultMap="brandResultMap">
        select * from tb_brand
        where status=#{status}
          and company_name like #{companyName}
          and brand_name like #{brandName}
    </select>
  • 这里的#{status}、#{companyName}、#{brandName},会自动用方法参数的值替换。

适用场景

  • 参数个数较少,参数名明确。
  • 你希望SQL参数名和Java变量名不一致时。

代码调用示例

//接收参数
        int status=1;
        String companyName="华为";
        String brandName="华为";
List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName);

2. 实体类参数

方法签名

List<Brand> selectByCondition(Brand brand);

详细解释

  • 这种方式是把所有参数封装到一个Java对象(实体类)里,方法只接收一个对象参数。
  • SQL语句中用#{属性名},MyBatis会自动从brand对象中取对应属性的值。
  • 这种方式代码更简洁,参数多时更方便,也便于扩展。

SQL映射文件写法

   <resultMap id="brandResultMap" type="com.itheima.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>
    


    <select id="selectByCondition" resultMap="brandResultMap">
        select * from tb_brand
        where status=#{status}
          and company_name like #{companyName}
          and brand_name like #{brandName}
    </select>
  • 这里的#{status}等,MyBatis会自动理解为brand.status、brand.companyName、brand.brandName。

适用场景

  • 参数较多,且参数之间有逻辑关系。
  • 直接用实体类对象传递更方便,代码更整洁。

代码调用示例

Brand brand = new Brand();
brand.setStatus(1);
brand.setCompanyName("华为");
brand.setBrandName("荣耀");
List<Brand> list = mapper.selectByCondition(brand);

3. Map参数

方法签名

List<Brand> selectByCondition(Map map);

 

详细解释

  • 这种方式是把所有参数放到一个Map集合里,key为参数名,value为参数值。
  • SQL语句中用#{key},MyBatis会自动从map中取key对应的值。
  • 这种方式参数个数可以动态变化,适合参数不确定或运行时动态决定的场景。

SQL映射文件写法

   <resultMap id="brandResultMap" type="com.itheima.pojo.Brand">
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>
    


    <select id="selectByCondition" resultMap="brandResultMap">
        select * from tb_brand
        where status=#{status}
          and company_name like #{companyName}
          and brand_name like #{brandName}
    </select>
  • 这里的#{status}等,MyBatis会自动从map中取key为status、companyName、brandName的值。

适用场景

  • 参数个数不确定,或者参数名在运行时动态决定。
  • 适合通用查询、批量操作等场景

代码调用示例

Map map=new HashMap();
        map.put("status",status);
        map.put("companyName",companyName);
        map.put("brandName",brandName);

List<Brand> brands = brandMapper.selectByCondition(map);
System.out.println(brands);

重点记忆

  • 散装参数:每个参数单独列出,@Param注解绑定SQL参数名,适合参数少且明确。
  • 实体类参数:所有参数封装到一个对象,SQL用属性名,适合参数多且有逻辑关系。
  • Map参数:所有参数放到Map集合,SQL用key名,适合参数不定或动态场景。

网站公告

今日签到

点亮在社区的每一天
去签到