Mybatis 快速入门(三)🚀

500 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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();
}
  • 测试结果如下👇image-20220419234347329

4️⃣映射文件中特殊字符处理

image-20220419231222127

  • 报错的原因是<> 等这些字符在xml中有特殊含义,所以此时我们需要将这些符号进行转义
  • 转义方式: 如下图所示👇image-20220419231452189

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标签

  1. bind元素属性👇
  • value:对应传入实体类的某个字段,可以进行字符串拼接等特殊处理。
  • name:给对应参数取的别名。
  1. 使用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️⃣演示结果

image-20220419235507550

写在后面🍻

感谢观看啦✨
有什么不足,欢迎指出哦💖
掘金的运营同学审核辛苦了💗