PropertyNamer解析

本文详细探讨了PropertyNamer的工作原理,从属性命名规则到其在数据绑定和序列化过程中的关键作用,揭示了PropertyNamer如何影响对象属性的处理方式。通过对源码的分析,读者将能够更好地理解和利用这一机制。

package org.apache.ibatis.reflection.property;

import java.util.Locale;

import org.apache.ibatis.reflection.ReflectionException;

/**
 * @author Clinton Begin
 */
public final class PropertyNamer {

  private PropertyNamer() {
    // Prevent Instantiation of Static Class
  }
    //methodToProperty方法会将方法名转换成属性名
  public static String methodToProperty(String name) {
    if (name.startsWith("is")) {
      name = name.substring(2);
    } else if (name.startsWith("get") || name.startsWith("set")) {
      name = name.substring(3);
    } else {
      throw new ReflectionException("Error parsing property name '" + name + "'.  Didn't start with 'is', 'get' or 'set'.");
    }

    if (name.length() == 1 || (name.length() > 1 && !Character.isUpperCase(name.charAt(1)))) {
      name = name.substring(0, 1).toLowerCase(Locale.ENGLISH) + name.substring(1);
    }

    return name;
  }
  //isProperty方法负责检测方法名是否对应属性名
  public static boolean isProperty(String name) {
    return name.startsWith("get") || name.startsWith("set") || name.startsWith("is");
  }

  public static boolean isGetter(String name) {
    return name.startsWith("get") || name.startsWith("is");
  }

  public static boolean isSetter(String name) {
    return name.startsWith("set");
  }

}

<think>我们正在使用MyBatis-Plus的LambdaQueryWrapper,用户希望知道如何指定某个字段进行查询。 根据引用[2],LambdaQueryWrapper可以通过Lambda表达式来指定字段。具体来说,我们可以使用类似`User::getName`这样的方法引用来指定字段。 引用[1]展示了使用LambdaQueryWrapper进行JSON_CONTAINS查询的例子,但用户的问题是如何指定字段。 在MyBatis-Plus中,我们可以使用`select`方法来指定查询的字段,也可以直接在条件中使用Lambda表达式指定字段。 例如,如果我们有一个User实体类(引用[4]),我们想查询name字段等于"John"的用户,可以这样写: LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(User::getName, "John"); 如果只想查询特定的几个字段,可以使用select方法: queryWrapper.select(User::getId, User::getName); 所以,用户的问题“如何在lambdaQuery中指定某个字段”可以理解为两种需求: 1. 在条件中使用Lambda表达式指定字段(如eq, like等条件) 2. 指定查询结果返回的字段(即投影) 我们将分别给出示例。 注意:引用[2]中的代码展示了Lambda表达式如何被解析为字段名的内部机制,但用户不需要关心内部实现,只需要知道如何使用Lambda表达式即可。 因此,回答如下: </think> 在 MyBatis-Plus 的 `LambdaQueryWrapper` 中指定字段主要通过两种方式实现,核心是利用 Lambda 表达式引用实体类属性: ### 方式一:在查询条件中指定字段(条件构造) 通过 Lambda 表达式直接指定 WHERE 条件中的字段: ```java LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); // 指定 name 字段进行条件过滤 wrapper.eq(User::getName, "John"); // 指定 age 字段进行范围查询 wrapper.between(User::getAge, 20, 30); ``` - **说明**:`User::getName` 通过方法引用指向实体类的 `name` 字段(原理见引用[^2]的 Lambda 元数据解析) - **效果**:生成 SQL `WHERE name = 'John' AND age BETWEEN 20 AND 30` ### 方式二:指定 SELECT 返回字段(投影查询) 使用 `select()` 方法限定返回的列: ```java LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); // 只查询 id 和 email 字段 wrapper.select(User::getId, User::getEmail); ``` - **效果**:生成 SQL `SELECT id, email FROM user` - **优势**:减少数据传输量,提升查询效率(尤其适合大表查询,引用[^5]) ### 结合 JSON 字段查询 若字段是 JSON 类型(如引用[^1]的 `info` 字段): ```java // 查询 info 字段包含 "reading" 的用户 wrapper.apply("JSON_CONTAINS(info, {0})", "\"reading\""); ``` ### 技术原理 Lambda 表达式通过方法名解析字段名(如 `getEmail()` 解析为 `email`),并映射到数据库列(引用[^2]): ```java String fieldName = PropertyNamer.methodToProperty(meta.getImplMethodName()); // 方法名转字段名 ``` ### 注意事项 1. 实体类需正确定义字段(如引用[^4]的 `User` 类) 2. 复杂查询(如 JSON 操作)需数据库支持对应函数(如 MySQL 的 `JSON_CONTAINS`) 3. 版本兼容性:MyBatis-Plus 3.0+ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值