MybatisPlus的Wrappers使用常用与注意点

在使用 MyBatis-Plus 的 Wrappers 进行查询时,常见的错误通常与语法、字段匹配、条件使用不当等因素相关。以下是一些常见的错误及其解决方法:

1. 查询字段与数据库字段不匹配

错误描述: 你使用 Wrappers.lambdaQuery()Wrappers.query() 时,如果字段名称或类型与数据库中的不匹配,会导致查询错误。

错误示例

List<User> users = userMapper.selectList(Wrappers.lambdaQuery(User.class)
    .eq(User::getUsername, "john_doe"));

假设数据库表的字段是 user_name 而不是 username,这个查询将不会找到数据。

解决方法: 确保字段名称匹配,且使用的字段名称和数据库表字段完全一致。如果字段名称不同,可以使用 @TableField 注解来映射字段名称。

public class User { @TableField("user_name") private String username; }

或者,确保字段名称完全一致。

2. 字段类型不匹配

错误描述: 字段类型不匹配是一个常见的错误,例如,尝试将一个 String 类型的值与 Integer 类型的字段进行比较。

错误示例

List<User> users = userMapper.selectList(Wrappers.lambdaQuery(User.class) .eq(User::getAge, "25")); // 错误,age 是 Integer 类型

解决方法: 确保查询条件的字段类型与数据库中的字段类型一致。如果类型不匹配,需要进行类型转换。

List<User> users = userMapper.selectList(Wrappers.lambdaQuery(User.class) .eq(User::getAge, 25)); // 正确,age 是 Integer 类型

3. 使用了 null 值进行查询

错误描述null 值作为查询条件时,如果不正确处理,可能会导致查询结果为空或语法错误。

错误示例

String username = null; List<User> users = userMapper.selectList(Wrappers.lambdaQuery(User.class) .eq(User::getUsername, username)); // 可能查询不到数据

解决方法: 对于 null 值,需要根据业务需求选择合适的处理方式:

  • 使用 isNull 进行查询:

    List<User> users = userMapper.selectList(Wrappers.lambdaQuery(User.class) .isNull(User::getUsername)); // 查询 username 为 null 的记录
  • 或者根据条件动态构建查询:

    LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(User.class); if (username != null) { queryWrapper.eq(User::getUsername, username); } List<User> users = userMapper.selectList(queryWrapper);

4. BETWEEN 查询包含边界问题

错误描述BETWEEN 是闭区间,包括查询的边界。如果查询时间没有精确到微秒部分,而数据库中的时间包含微秒,BETWEEN 查询可能会查不到数据。

错误示例

String startDate = "2024-12-16 00:00:00"; String endDate = "2024-12-31 00:00:00"; List<User> users = userMapper.selectList(Wrappers.lambdaQuery(User.class) .between(User::getCreationTime, startDate, endDate)); // 可能无法查询到数据

解决方法: 确保时间的精度一致,或者使用 gtlt 代替 BETWEEN 以避免边界值精度问题:

List<User> users = userMapper.selectList(Wrappers.lambdaQuery(User.class) .gt(User::getCreationTime, startDate) .lt(User::getCreationTime, endDate));

5. 查询条件错误地使用了 INNOT IN

错误描述INNOT IN 查询条件需要传递一个集合类型的参数,如果传递了错误的类型,可能会导致 SQL 错误或查询结果不正确。

错误示例

List<Integer> ids = Arrays.asList(1, 2, 3); List<User> users = userMapper.selectList(Wrappers.lambdaQuery(User.class) .in(User::getId, 1, 2, 3)); // 错误的用法,应该传递 List

解决方法: 正确使用 in 方法传递一个集合对象:

List<Integer> ids = Arrays.asList(1, 2, 3); List<User> users = userMapper.selectList(Wrappers.lambdaQuery(User.class) .in(User::getId, ids)); // 正确的用法

6. eq 使用时需要注意对空值的处理

错误描述: 使用 eq 条件查询时,如果传入的值是 null,默认的行为是查询所有记录,可能不符合预期。

错误示例

String username = null; List<User> users = userMapper.selectList(Wrappers.lambdaQuery(User.class) .eq(User::getUsername, username)); // 查询所有记录,而非用户名为空的记录

解决方法

  • 使用 isNull 代替 eq,专门查询 null 值:

    List<User> users = userMapper.selectList(Wrappers.lambdaQuery(User.class) .isNull(User::getUsername)); // 查询 username 为 null 的记录

  • 如果需要动态构建查询条件:

    LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(User.class); if (username != null) { queryWrapper.eq(User::getUsername, username); } List<User> users = userMapper.selectList(queryWrapper);

7. LIKE 查询时要避免 null 和空字符串的误用

错误描述LIKE 查询如果传入 null 或空字符串,可能导致查询结果不正确或查询条件失效。

错误示例

String name = ""; // 空字符串 List<User> users = userMapper.selectList(Wrappers.lambdaQuery(User.class) .like(User::getUsername, name)); // 查询不符合预期

解决方法: 确保查询时的值不为空字符串或 null,并考虑使用动态条件:

LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(User.class); if (StringUtils.isNotEmpty(name)) { queryWrapper.like(User::getUsername, name); } List<User> users = userMapper.selectList(queryWrapper);

8. 条件构造器没有适当清空

错误描述: 在多次使用 Wrappers 构造查询时,没有正确清空之前的条件,可能导致意外的条件被重复添加。

错误示例

LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(User.class); queryWrapper.eq(User::getStatus, 1); queryWrapper.eq(User::getStatus, 2); // 状态值为 2 会覆盖 1,导致查询条件不正确

解决方法: 确保每次查询条件的构造器是新的,或者在构建条件时不产生不必要的重复。

LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(User.class); queryWrapper.eq(User::getStatus, 1); // 只会使用状态为 1 的条件 List<User> users = userMapper.selectList(queryWrapper);

总结

在使用 Wrappers 构建查询条件时,最常见的错误是:

  1. 字段名和类型不匹配。
  2. null 值的处理不当。
  3. 查询条件精度不一致,尤其是时间类型字段。
  4. 使用 INNOT IN 时传递错误的参数类型。
  5. 动态构建查询条件时没有正确处理空值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值