巧用Lambda表达式获取对象属性名告别魔法值

news2024/11/29 2:43:56

在我们日常开发中,使用 MyBatis-Plus 写 SQL 执行的时候,难免会用到表字段,虽然 MyBatis-Plus 提供了 LambdaQueryWrapper 帮助我们使用 Lambda 方式调用对象属性名,但有的时候还是不免用到魔法值,当对象的属性名更改了之后,我们难免会漏掉,引发生产事故

1、定义支持序列化的 Function

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 {
}

这是 MyBatis-Plus 提供的函数,调用方式也非常简单,例如我们有一个实体对象 UserDO

public class UserDO {

	private Long id;

	private String name;

	private Integer age;

	private String phone;
}

调用方式为:

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

2、获取属性名

例如上面我们的调用方式 UserDO::getId 希望能够获得 “id” 字符串,下面我们使用 MyBatis-Plus 提供的工具类获得该属性名

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);
    }
}

调用方式:

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

输出:
在这里插入图片描述

3、获取数据库字段名

上面我们已经获取到了属性名,那么字段名也就是驼峰转下划线的操作

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

这里的 StrUtil.toUnderlineCase() 是使用的 hutool 工具包中的工具类来实现的

调用方式:

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

输出:
在这里插入图片描述

4、底层调用

上面我们是借助 MyBatis-Plus 的 LambdaUtils 工具类获取的对象属性名,那么我们没有引入 MyBatis-Plus 该如何获取呢?

/**
 * 获取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);
    }
}

MyBatis-Plus 的 LambdaUtils 同样是这样做的底层调用,这样我们就能使用 Lambda 表达式的方式获取对象属性名,不用写入魔法值,当属性名更改了之后,idea 开发工具会提醒我们,也能及时发现修改

如您在阅读中发现不足,欢迎留言!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008254.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

检索技术核心学习总结

一、学习检索技术的必要性分析 &#xff08;一&#xff09;关键原因分析 学习检索技术&#xff08;Information Retrieval&#xff0c;IR&#xff09;具有多种重要的原因&#xff0c;特别是在今天信息爆炸的数字化时代。 总的来说&#xff0c;学习检索技术有助于提高信息处理…

基于Python和mysql开发的商城购物管理系统分为前后端(源码+数据库+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python和mysql开发的商城购物管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过…

Elasticsearch:什么是生成式人工智能?

生成式人工智能定义 给学生的解释&#xff08;基本&#xff09;&#xff1a; 生成式人工智能是一种可以创造新的原创内容的技术&#xff0c;例如艺术、音乐、软件代码和写作。 当用户输入提示时&#xff0c;人工智能会根据从互联网上现有示例中学到的知识生成响应&#xff0c;…

记一次线上BUG排查过程

1. 线上遇到一个非常奇怪的bug&#xff0c;为一个用户分配业务线类型后&#xff0c;该用户登录时&#xff0c;提示502&#xff0c;但其它的用户登录完全是正常的 2. 问题现象 3. 排查思路 先去看线上日志&#xff0c;看是否有error&#xff0c;但日志里边这个接口200正常返回…

业务中如何拓展微前端架构

站在整体架构的角度&#xff0c;微前端可以分为以下几类拓展迭代方向。 注册更多微应用 随着业务的扩展,我们可以在主应用中注册更多的微应用。每个微应用是一个独立的子系统,只需要在主应用的注册列表中添加新的项,配置微应用的名称、入口、活动规则等信息即可。 集成微应用…

【element-ui】el-date-picker 之picker-options时间选择区间禁用效果的实现

element-ui 时间选择器的时间区间禁用dom层引入:picker-option <el-date-pickerv-model"searchFormObj.workTime"clearablevalue-formate"yyyy-MM-dd":picker-options"pickerOptions"placeholder"请选择时间" ></el-date-pi…

应用在儿童平板防蓝光中的LED防蓝光灯珠

现在电子产品多&#xff0c;手机、平板电脑、电子书等等&#xff0c;由于蓝光有害眼睛健康&#xff0c;于是市场上有很多防蓝光的眼镜、防蓝光的手机膜、防蓝光的平板&#xff0c;这些材料和设备到底有没有用&#xff1f;如何正确预防蓝光危害呢&#xff1f; 我们现在所用的灯…

借助工业PoE交换机实现智慧停车场管理

停车场是现代城市的重要基础设施&#xff0c;而且随着汽车保有量的持续增长&#xff0c;城市中也出现了数百甚至上千停车位的大型、超大型停车场&#xff0c;而这些大型停车场的管理和服务也是一个难题。 针对大型停车场的管理&#xff0c;可以借助工业PoE交换机&#xff0c;快…

postman和node.js的使用、YApi 新版如何查看 http 请求数据

一 nodejs下载 下载链接&#xff1a; nodejs官网&#xff1a; https://nodejs.org/zh-cn/download 我使用的windows .msi安装方式&#xff0c;双击一直下一步就行 当前安装完成后的版本&#xff1a;1.下载 2.安装步骤 下载完成后&#xff0c;双击安装包&#xff0c;开始安装&…

LoGoNet:基于局部到全局跨模态融合的精确 3D 目标检测

论文地址&#xff1a;https://arxiv.org/abs/2303.03595 论文代码&#xff1a;https://github.com/sankin97/LoGoNet 论文背景 激光雷达传感器点云通常是稀疏的&#xff0c;无法提供足够的上下文来区分远处的区域&#xff0c;从而造成性能次优。 激光雷达-摄像机融合方法在三…

html网页制作期末大作业-网上花店商城html+css+javascript

一、简介 html网页制作期末大作业-网上花店商城htmlcssjavascript 8个页面适用学生作业 课程设计花店、期末作业花店、毕业设计花店 ​ 二、部分网页截图 三、部分网页源码 1. 首页代码 <!DOCTYPE html> <html lang"en"> <head><meta charse…

耐蚀合金连续油管制造工艺 学习记录

声明 本文是学习GB-T 42858-2023 耐蚀合金连续油管. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 5 制造工艺 5.1 通则 本文件所包含的合金应采用吹氧转炉冶炼或电炉冶炼或高炉冶炼(仅对马氏体或马氏体/铁素体不 锈钢)或真空感应熔化工艺&#xf…

LVS负载均衡集群--nat模式

一、集群含义&#xff1a; 由多台主机构成&#xff0c;但对外只表现为一一个整体&#xff0c;只提供一个访问入口(域名或IP地址)&#xff0c;相当于一台大型计算机。 二、群集的类型&#xff1a; 1&#xff09;负载均衡群集 LB&#xff1a; 提高系统响应效率&#xff0c;处理…

通过bid爬取b站视频内容

1.B站的视频&#xff1a;音频内容和视频内容是分开的&#xff0c;爬完之后需要进行视频合成。 2.每个b站视频的bid号都是唯一的。 3.合成视频使用ffmpeg&#xff0c;通过官网下载&#xff0c;并且pip安装对应的python包&#xff0c;pip install ffmpeg-python。 win10系统下…

导出excel单元格时实现换行

上一篇&#xff1a;laravel中安装Maatwebsite/excel扩展 承接上一篇哈&#xff0c;laravel成功安装了excel的扩展&#xff0c;但是有个小的问题&#xff0c;就是每个题目有至少两个选项&#xff0c;导出到excel的时候&#xff0c;希望每个选项之间能换行展示&#xff0c;也就是…

stu04-快速生成HTML5文档结构

1.直接输入一个英文的感叹号“!”&#xff0c;然后按Tab键&#xff0c;自动生成 2.输入“html:5”&#xff0c;然后按Tab键自动生成 3.直接复制粘贴以下代码&#xff1a; <!doctype html> <html lang"en"> <head><meta charset"UTF-8&q…

5G定位技术原理与应用场景

5G高精度定位服务不仅适用于应急&#xff0c;还可以支持大量的个人业务&#xff0c;包括室外和室内场景&#xff0c;可以在交通道路、隧道、地下停车场或室内环境中支持高精度定位服务。在这些区域中&#xff0c;由于卫星信号的覆盖范围较小&#xff0c;基于5G网络的高精度定位…

继续上一个爬虫,所以说selenium加browsermobproxy

继续&#xff0c;书接上回&#xff0c;这次我通过jsrpc&#xff0c;也学会了不少逆向的知识&#xff0c;感觉对于一般的网站应该都能应付了。当然我说的是简单的网站&#xff0c;遇到那些混淆的&#xff0c;还有那种猿人学里面的题目&#xff0c;还是免谈了。那种需要的水平太高…

智慧园区:AI边缘计算技术与视频监控汇聚平台打造智慧园区解决方案

一、行业趋势与背景 智慧园区是现代城市发展的重要组成部分&#xff0c;通过智能化技术提高园区的运营效率、降低成本、增强环境可持续性等具有重要作用。在智慧园区中&#xff0c;人工智能和视频汇聚技术是重要的前置技术。人工智能技术可以实现对数据的智能化处理和分析&…

SpringMVC的拦截器和JSR303的使用

目录 一、JSR303 二、拦截器&#xff08;interceptor&#xff09; 一、JSR303 1.1.什么是JSR303 JSR 303&#xff0c;它是Java EE&#xff08;现在称为Jakarta EE&#xff09;规范中的一部分。JSR 303定义了一种用于验证Java对象的标准规范&#xff0c;也称为Bean验证。 Bean验…