一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情。
写在前面👀
承接上文,Mybatis 快速入门(二)☁
今天主要讲讲MyBatis使用xml映射文件进行多条件查询和模糊查询的操作
一、多条件查询
多条件查询的传递参数有三种方式:使用
JavaBean传递参数、使用Map传递参数、使用注解@param传递参数
A.使用JavaBean传递参数
将多个参数封装成一个 实体对象 ,将该实体对象作为接口的方法参数。
该方式要求在映射配置文件的SQL中使用
#{参数名称}时,里面的参数名称必须和实体类属性名保持一致。
1️⃣编写接口方法
/**
* 3.a 使用JavaBean传递参数,根据id和赏金查询记录
* @param op
* @return Op集合
*/
List<Op> searchByIdAndReward(Op op);
2️⃣编写映射文件
<!-- 根据id和赏金查询记录-->
<select id="searchByIdAndReward" resultMap="OpResultMap">
select *
from tb_op
where id <![CDATA[>]]> #{id}
and reward <![CDATA[>]]> #{reward};
</select>
3️⃣编写测试方法
@Test
/**
* 3.根据id和赏金查询记录
*/
public void testSearchByIdAndReward(){
//查询id大于5且赏金大于50000000贝利的数据
Integer id=5;
Long reward=500000000L;
//3.1创建Op对象
Op op = new Op();
//3.2调用方法封装对象
op.setId(id);
op.setReward(reward);
System.out.println(op);
//3.3执行方法
List<Op> opList= opMapper.searchByIdAndReward(op);
for (Op opValue : opList
) {System.out.println(opValue);}
//3.4释放资源
sqlSession.close();
}
- 测试结果如下👇
4️⃣映射文件中特殊字符处理
- 报错的原因是
<、>等这些字符在xml中有特殊含义,所以此时我们需要将这些符号进行转义 - 转义方式: 如下图所示👇
B.使用Map传递参数
将多个参数封装到map集合中,将map集合作为接口的方法参数。
该方式要求在映射配置文件的SQL中使用
#{参数名称}时,里面的参数名称必须和map集合中键的名称一致。
1️⃣编写接口方法
/**
* 3.b 使用map传递参数,根据id和赏金查询记录
* @param map
* @return Op集合
*/
List<Op> searchByIdAndReward(Map map);
2️⃣编写映射文件
- 略,映射文件与A方法相同
3️⃣编写测试方法
@Test
/**
* 3.根据id和赏金查询记录
*/
public void testSearchByIdAndReward(){
//查询id大于5且赏金大于50000000贝利的数据
Integer id=5;
Long reward=500000000L;
//3.1创建map集合对象
Map map = new HashMap();
//3.2调用方法封装对象
map.put("id",id);
map.put("reward",reward);
System.out.println(map);
//3.3执行方法
List<Op> opList= opMapper.searchByIdAndReward(map);
for (Op opValue : opList
) {System.out.println(opValue);}
//3.4释放资源
sqlSession.close();
}
C.使用注解传递参数
使用
@Param("参数名称")标记每一个参数,在映射配置文件中就需要使用#{参数名称}进行占位
1️⃣编写接口方法
/**
* 3.c 使用注解传递参数,根据id和赏金查询记录
* @param id
* @param reward
* @return Op集合
*/
List<Op> searchByIdAndReward(@Param("id") Integer id, @Param("reward") Long reward);
2️⃣编写映射文件
- 略,映射文件与A方法相同
3️⃣编写测试方法
@Test
/**
* 3.根据id和赏金查询记录
*/
public void testSearchByIdAndReward(){
//查询id大于5且赏金大于50000000贝利的数据
Integer id=5;
Long reward=500000000L;
//3.1直接传递参数,执行方法
List<Op> opList= opMapper.searchByIdAndReward(id,reward);
for (Op opValue : opList
) {System.out.println(opValue);}
//3.2释放资源
sqlSession.close();
}
D.总结
不管使用哪一种参数传递方式,都要使方法中的参数名和xml映射文件中的参数名匹配,这样不容易出错。
- 使用 Map 传递参数虽然简单易用,但是由于这样设置参数需要键值对应,业务关联性不强,造成可读性下降。
- 使用 @Param 注解传递参数会受到参数个数的影响,参数大于五个以上,就会造成可读性下降,增强了代码复杂性
- 使用JavaBean传递参数,通过简单的 setter 和 getter 方法设置参数,提高可读性,适合参数多的情况
二、模糊查询
1️⃣编写接口方法
/**
* 4.根据姓名模糊查询
* @param name
* @return
*/
List<Op> searchAllByName(String name);
2️⃣编写映射文件
a. 使用CONCAT( )函数
- 使用CONCAT( )函数可以连接字符串
<!-- 根据姓名模糊查询-->
<select id="searchAllByName" resultMap="OpResultMap">
select *
from tb_op
where name like CONCAT('%',#{name},'%');
</select>
b. 使用bind标签
- bind元素属性👇
- value:对应传入实体类的某个字段,可以进行字符串拼接等特殊处理。
- name:给对应参数取的别名。
- 使用bind标签的好处
-
不同数据库连接字符串的方式不同,如MySQL 的 concat 函数、Oracle 的连接符号“||”等。
使用bind标签则提高了
可移植性
<!-- 根据姓名模糊查询-->
<select id="searchAllByName" resultMap="OpResultMap">
<bind name="op_name" value="'%'+name+'%'" />
select *
from tb_op
where name like #{op_name};
</select>
3️⃣编写测试方法
@Test
/**
* 4.根据姓名模糊查询
*/
public void testSearchAllByName(){
//查询名字带“萨”的人物信息
String name ="萨";
//4.1执行方法
List<Op> opList= opMapper.searchAllByName(name);
for (Op opValue : opList
) {System.out.println(opValue);}
//4.2释放资源
sqlSession.close();
}
4️⃣演示结果
写在后面🍻
感谢观看啦✨
有什么不足,欢迎指出哦💖
掘金的运营同学审核辛苦了💗