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:
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:
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! ! !