博主介绍:全网粉丝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 < #{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 < #{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
的数据。
EntityWrapper<XueshengEntity> ew = new EntityWrapper<>();
ew.eq("xuehao","学生3");
List<XueshengView> studentList = xueshengService.selectListView(ew);
查询学号字段不等于 学生3
的数据。
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
且学号为 4
或 5
或 6
结尾的学生。
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);