T系列项目讲解笔记5/6:后端条件查询

2024-07-19 08:38:57 浏览数 (2)

博主介绍:全网粉丝10W ,CSDN博客专家、全栈领域优质创作者,3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型。 研究方向:SpringBoot、Vue.JS、MyBatisPlus、Redis、SpringSecurity、MySQL、小程序、Android、Uniapp等。

一、条件查询

条件查询(Condition Query)是一种在数据库查询中根据特定条件筛选数据的方法。在编程中,我们经常需要根据一些特定的条件来查询数据库中的记录。MyBatis-Plus 是一个 MyBatis 的增强工具,它提供了许多便捷的功能,包括条件查询。

在 MyBatis-Plus 中,条件查询可以通过以下几种方式实现。

1.1 使用 QueryWrapper

QueryWrapper 是 MyBatis-Plus 提供的一个查询条件封装类,可以方便地构建查询条件。通过链式调用方法,可以轻松地添加各种查询条件,如等于、不等于、大于、小于等。

代码语言:javascript复制
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", "张三").lt("age", 30);
List<User> users = userMapper.selectList(queryWrapper);

1.2 使用 LambdaQueryWrapper

LambdaQueryWrapper 是 QueryWrapper 的一个子类,它支持 Lambda 表达式,使得条件查询更加简洁。LambdaQueryWrapper 允许你直接使用实体类的字段名作为条件,而不需要使用字符串。

代码语言:javascript复制
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getUsername, "张三").lt(User::getAge, 30);
List<User> users = userMapper.selectList(lambdaQueryWrapper);

1.3 使用 XML 映射文件

在 MyBatis 中,我们可以通过 XML 映射文件定义查询语句,并在 Mapper 接口中调用。MyBatis-Plus 也支持这种方式,你可以在 XML 文件中定义条件查询的 SQL 语句,然后在 Mapper 接口中使用。

代码语言:javascript复制
<select id="selectByCondition" resultType="User">
  SELECT * FROM user WHERE username = #{username} AND age &lt; #{age}
</select>
代码语言:javascript复制
public interface UserMapper extends BaseMapper<User> {
  List<User> selectByCondition(@Param("username") String username, @Param("age") Integer age);
}

1.4 使用 MyBatis 提供的动态 SQL

MyBatis 支持动态 SQL,可以根据条件动态地生成 SQL 语句。这种方式在 MyBatis-Plus 中同样适用。

代码语言:javascript复制
<select id="selectByDynamicCondition" resultType="User">
  SELECT * FROM user
  <where>
    <if test="username != null and username.trim() != ''">
      AND username = #{username}
    </if>
    <if test="age != null">
      AND age &lt; #{age}
    </if>
  </where>
</select>

二、EntityWrapper和QueryWrapper

EntityWrapper和QueryWrapper是MyBatis-Plus框架中的两个核心组件,它们分别用于封装实体类和查询条件。

2.1 功能

  • EntityWrapper:用于封装实体类,它是一个通用的封装器,可以用于任何实体类。EntityWrapper提供了一些方法来设置实体类的属性值,例如:set、eq、ne等。
  • QueryWrapper:用于封装查询条件,它是一个查询条件的封装器。QueryWrapper提供了一些方法来设置查询条件,例如:eq、ne、gt、lt、like等。

2.2 使用场景

  • EntityWrapper:通常用于更新操作,例如:update、saveOrUpdate等。在这些操作中,EntityWrapper可以指定要更新的实体类属性和条件。
  • QueryWrapper:通常用于查询操作,例如:select、selectOne、selectList等。在这些操作中,QueryWrapper可以指定查询条件,如字段、排序、分组等。

2.3 条件表达式

  • EntityWrapper:主要关注实体类属性的设置,条件表达式较少。
  • QueryWrapper:提供了丰富的条件表达式,如:等于(eq)、不等于(ne)、大于(gt)、小于(lt)、模糊查询(like)等。

2.4 链式调用

EntityWrapper和QueryWrapper都支持链式调用,这使得代码更加简洁和易于阅读。

2.5 扩展性

EntityWrapper和QueryWrapper都可以通过自定义方法来扩展,以满足特定的需求。

2.6 总结

EntityWrapper和QueryWrapper在MyBatis-Plus框架中扮演着不同的角色。EntityWrapper主要用于封装实体类,而QueryWrapper主要用于封装查询条件。在实际开发中,根据操作类型(如查询或更新)选择合适的封装器。


三、常用方法

3.1 eq、ne (等于/不等于)

查询学号字段等于 学生3 的数据。

代码语言:javascript复制
EntityWrapper<XueshengEntity> ew = new EntityWrapper<>();
ew.eq("xuehao","学生3");
List<XueshengView> studentList = xueshengService.selectListView(ew);

查询学号字段不等于 学生3 的数据。

代码语言:javascript复制
EntityWrapper<XueshengEntity> ew = new EntityWrapper<>();
ew.ne("xuehao","学生3");
List<XueshengView> studentList = xueshengService.selectListView(ew);

3.2 le、lt、ge、gt(大于/小于)

代码语言:javascript复制
EntityWrapper<XueshengEntity> ew = new EntityWrapper<>();
ew.ge("xuehao","学生3");
List<XueshengView> studentList = xueshengService.selectListView(ew);

3.3 like、notLike、likeLeft、likeRight(模拟匹配)

代码语言:javascript复制
EntityWrapper<XueshengEntity> ew = new EntityWrapper<>();
ew.like("xuehao","学生3");
List<XueshengView> studentList = xueshengService.selectListView(ew);

3.4 in、notIn(联表查询)

代码语言:javascript复制
EntityWrapper<TokenEntity> tokenEw = new EntityWrapper<>();
tokenEw.setSqlSelect("username");
List<TokenEntity> tokenEntities = tokenService.selectList(tokenEw);
String[] tokenArray = tokenEntities.stream().map(TokenEntity::getUsername).toArray(String[]::new);
String r = String.join(",", tokenArray);


EntityWrapper<XueshengEntity> ew = new EntityWrapper<>();
ew.in("xuehao",r);
List<XueshengEntity> studentList = xueshengService.selectList(ew);

3.5 between、notBetween(区间查询)

代码语言:javascript复制
EntityWrapper<XueshengEntity> ew = new EntityWrapper<>();
ew.between("xuehao","a","b");
List<XueshengEntity> studentList = xueshengService.selectList(ew);

3.6 last(限制条数)

代码语言:javascript复制
EntityWrapper<XueshengEntity> ew = new EntityWrapper<>();
ew.last("limit 1");
XueshengEntity student = xueshengService.selectOne(ew);

3.7 orderAsc / orderDesc(排序)

代码语言:javascript复制
EntityWrapper<XueshengEntity> ew = new EntityWrapper<>();
ew.orderDesc(Arrays.asList("xuehao"));
List<XueshengEntity> studentList = xueshengService.selectList(ew);

3.8 and / or (多条件查询)

查询 id 大于 11 且学号为 456 结尾的学生。

代码语言:javascript复制
SELECT * FROM xuesheng WHERE id > 11 AND (xuehao LIKE '%4' OR xuehao LIKE '%5' OR xuehao LIKE '%6');
代码语言:javascript复制
EntityWrapper<XueshengEntity> ew = new EntityWrapper<>();
ew.gt("id",11).andNew()
        .like("xuehao","4").or().like("xuehao","5").or().like("xuehao","6");
List<XueshengEntity> studentList = xueshengService.selectList(ew);

0 人点赞