Verwenden Sie Lambda-Ausdrücke geschickt, um Objektattributnamen zu erhalten und sich von magischen Werten zu verabschieden

Wenn wir in unserer täglichen Entwicklung MyBatis-Plus zum Schreiben und Ausführen von SQL verwenden, werden zwangsläufig Tabellenfelder verwendet. Obwohl MyBatis-Plus LambdaQueryWrapper bereitstellt, um uns bei der Verwendung der Lambda-Methode zum Aufrufen von Objekteigenschaftsnamen zu helfen, werden manchmal immer noch magische Werte verwendet. Wenn der Attributname des Objekts geändert wird, wird er unweigerlich übersehen und einen Produktionsunfall verursachen.

1. Definieren Sie eine Funktion, die die Serialisierung unterstützt

import java.io.Serializable;
import java.util.function.Function;

/**
 * 支持序列化的 Function
 *
 * @author miemie
 * @since 2018-05-12
 */
@FunctionalInterface
public interface SFunction<T, R> extends Function<T, R>, Serializable {
    
    
}

Dies ist eine von MyBatis-Plus bereitgestellte Funktion, und die aufrufende Methode ist ebenfalls sehr einfach. Beispielsweise haben wir ein Entitätsobjekt UserDO

public class UserDO {
    
    

	private Long id;

	private String name;

	private Integer age;

	private String phone;
}

Die aufrufende Methode ist:

SFunction<UserDO, Long> func = UserDO::getId;

2. Rufen Sie den Attributnamen ab

Beispielsweise hofft unsere Aufrufmethode UserDO::getId oben, die Zeichenfolge „id“ zu erhalten. Als Nächstes verwenden wir die von MyBatis-Plus bereitgestellte Toolklasse, um den Attributnamen abzurufen.

import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import org.apache.ibatis.reflection.property.PropertyNamer;

import java.beans.Introspector;

/**
 * 获取属性名工具类
 *
 * @author asurplus
 */
public class FieldUtils {
    
    

    /**
     * 获取Java属性名
     *
     * @return userName
     */
    public static <T, R> String getFieldName(SFunction<T, R> func) {
    
    
        // 获取 lambda 表达式实现方法的名称
        String fieldName = LambdaUtils.extract(func).getImplMethodName();
        // 去掉前缀:get,is
        fieldName = PropertyNamer.methodToProperty(fieldName);
        // 首字母小写
        return Introspector.decapitalize(fieldName);
    }
}

Aufrufmethode:

public static void main(String[] args) {
    
    
    String fieldName = FieldUtils.getFieldName(UserDO::getId);
    System.out.println(fieldName);
}

Ausgabe:
Fügen Sie hier eine Bildbeschreibung ein

3. Rufen Sie den Datenbankfeldnamen ab

Wir haben den Attributnamen oben erhalten, daher ist der Feldname zur Unterstreichung der Operation die Kamel-Schreibweise.

/**
 * 获取数据库字段名
 *
 * @return user_name
 */
public static <T, R> String getColumnName(SFunction<T, R> func) {
    
    
    String fieldName = getFieldName(func);
    // 转下划线
    return StrUtil.toUnderlineCase(fieldName);
}

StrUtil.toUnderlineCase() wird hier mithilfe der Tool-Klasse im Hutool-Toolpaket implementiert

Aufrufmethode:

public static void main(String[] args) {
    
    
    String fieldName = FieldUtils.getColumnName(UserDO::getUserName);
    System.out.println(fieldName);
}

Ausgabe:
Fügen Sie hier eine Bildbeschreibung ein

4. Bottom-Call

Oben haben wir den Objektattributnamen mit Hilfe der LambdaUtils-Toolklasse von MyBatis-Plus erhalten. Wie erhalten wir ihn also, ohne MyBatis-Plus einzuführen?

/**
 * 获取Java属性名
 *
 * @return userName
 */
public static <T, R> String getFieldName(SFunction<T, R> func) {
    
    
    try {
    
    
        Method method = func.getClass().getDeclaredMethod("writeReplace");
        method.setAccessible(true);
        SerializedLambda serializedLambda = (SerializedLambda) method.invoke(func);
        String fieldName = serializedLambda.getImplMethodName();
        if (fieldName.startsWith("get")) {
    
    
            fieldName = fieldName.substring(3);
        }
        if (fieldName.startsWith("is")) {
    
    
            fieldName = fieldName.substring(2);
        }
        // 首字母小写
        return fieldName.substring(0, 1).toLowerCase() + fieldName.substring(1);
    } catch (ReflectiveOperationException e) {
    
    
        throw new RuntimeException(e);
    }
}

Die LambdaUtils von MyBatis-Plus verwenden ebenfalls denselben zugrunde liegenden Aufruf, sodass wir Lambda-Ausdrücke verwenden können, um die Objektattributnamen zu erhalten, ohne magische Werte zu schreiben. Wenn die Attributnamen geändert werden, erinnert uns das Ideenentwicklungstool daran und wir können es erkennen ändert sich zeitnah

Sollten Sie beim Lesen Mängel feststellen, hinterlassen Sie bitte eine Nachricht! ! !

Supongo que te gusta

Origin blog.csdn.net/qq_40065776/article/details/132853851
Recomendado
Clasificación