Mybatis多条件查询设置参数的三种方法
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_brandwhere 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_brandwhere 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_brandwhere 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名,适合参数不定或动态场景。