@Data 注解使用 lombok插件学习总结

介绍和理解

@Data注解来源于lombom,引入后可以简化一般实体类的get, set, toString,construct(构造函数)等的书写,简洁化代码。

在编译阶段改变了class文件的生成方式,使得相关方法加入到编译后的文件中可以正常使用。但这样影响源码的可阅读性,若别人不清楚这一块的内容对一些问题的排查不仅没有帮助,反而会增加难度。

但具体使用场景随着不同的项目合适度是不同的,这个具体根据场景决定是否适用。在一些场景下反而会显得更简单。

一般的get,set,toString,构造函数,hash等大部分开发工具都可以通过快捷键生成,个别场景可能也会在基本的get,set方法中做一些微小的改动。

引入方式

Mave

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.4</version>
    <scope>provided</scope><!-- 可以没有 -->
</dependency>

开发工具中若代码报错但可以编译成功,则需要给开发工具引入插件 lombok,在plugins中,若为IDEA则在Settings中,找到plugins 然后下载安装 lombok插件,重启开发工具即可。

示例

一般实体写法

public class Man {

    private String name;

    private int age;

    private float height;

    private float weight;

    public Man() {
    }

    public Man(String name, int age, float height, float weight) {
        this.name = name;
        this.age = age;
        this.height = height;
        this.weight = weight;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public float getHeight() {
        return height;
    }

    public void setHeight(float height) {
        this.height = height;
    }

    public float getWeight() {
        return weight;
    }

    public void setWeight(float weight) {
        this.weight = weight;
    }

    @Override
    public String toString() {
        return "Man{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                ", weight=" + weight +
                '}';
    }
}

使用lombok后

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Man {

    private String name;

    private int age;

    private float height;

    private float weight;
}

lombok常见注解

@Data : 注解在类上,提供类的get、set、equals、hashCode、canEqual、toString方法
@AllArgsConstructor : 注解在类上,提供全参构造
@NoArgsConstructor : 注解在类上,提供无参构造
@Setter : 注解在属性上,提供 set 方法
@Getter : 注解在属性上,提供 get 方法
@EqualsAndHashCode : 注解在类上,提供 equals 和 hashCode 方法
@Log4j/@Slf4j : 注解在类上,提供Logger 对象,变量名为 log

参考学习简书链接

@Builder

直译过来就是构建

使用构造者模式,提供构建一个对象的方法即

类 对象 = 类名.builder().属性1(值1).属性2(值2).属性3(值3).build()

注意:
@Data 和 @Builder 一起使用时会编译报错
解决方式如下:

方式一:同时添加 @AllArgsConstructor @NoArgsConstructor
例如:

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class HumanBeing {

    private long UID;

    private String name;
    
    private String code;

    private byte sex;

}

方式二: 手动添加无参构造方法,然后添加 注解 @Tolerate (容许)
例如:

import lombok.Builder;
import lombok.Data;
import lombok.experimental.Tolerate;

@Data
@Builder
public class Clothes {

    private String name;

    private String type;

    private double price;

    private double weight;

    private String size;

    @Tolerate
    public Clothes(){

    }
}

具体使用时则如下使用

    public static void main(String[] args) {

        HumanBeing nnname = HumanBeing.builder().UID(1151264826104L).name("nnname").build();

        long uid = nnname.getUID();
        System.out.println(uid);

        nnname.setUID(548645L);
        System.out.println(nnname.getUID());
    }

运行结果如下:

1151264826104
548645

总结:
到这里我理解该注解相当于在使用一个更灵活的构造函数去构造一个对象。

@Accessors

直译为:访问器

说实话,看讲解的时候没太看明白,这里就说两种使用方法的对比,起码看得懂什么意思。
看起来相当于简化了方法前缀,使得像是在访问JSON 对象一样。
实际使用时属性的get set 方法名将一致,但做了重载,存在入参时为赋值语句,没有参数时为获取语句。
Accessors 有三个属性 fluent chain prefix

fluent = true 时例子如下:(fluent 直译为 流利)
实体定义如下:

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(fluent = true)
public class Shoes {

    private String name;

    private String size;

    private String color;

}

使用时

    public static void main(String[] args) {
        Shoes shoes = new Shoes().name("8848").size("43").color("#FF0000");
        System.out.println(shoes.name());
        System.out.println(shoes.color());

    }

使用 chain 时 实体如下定义:
chain 直译为 链条

@Data
@Accessors(chain = true)
public class Shoes {

    private String name;

    private String size;

    private String color;

}

使用结果如下:

        Shoes shoes = new Shoes().setName("4848486").setSize("XXL");

        Shoes shoes1 = shoes.setColor("rr");
        
        String name = shoes.getName();

可以看的出,依旧使用了get set 方法,但是set 的返回值依旧为对象自己,所以可以连续调用,get 返回依旧为本身。

### Lombok 注解与 MyBatis `@Insert` 注解同时使用失效解决方案 当Lombok注解与MyBatis的`@Insert`注解一起使用时可能出现一些问题,主要是由于编译器或框架未能正确识别由Lombok生成的方法。为了确保两者能够协同工作并有效运行,可以采取以下措施: #### 1. 确认依赖版本兼容性 确认项目中的Lombok库以及MyBatis相关库(如mybatis-spring-boot-starter)处于相互支持的版本范围内[^1]。 #### 2. 配置IDE插件 对于开发环境而言,在IntelliJ IDEA或其他IDE中安装最新版的Lombok插件是非常重要的一步。这有助于确保编译期间能正确解析Lombok所生成的getter/setter等辅助方法[^3]。 #### 3. 调整实体类定义方式 如果遇到具体场景下的冲突问题,则考虑调整实体类的设计模式。例如,移除可能导致混淆的特定Lombok注解组合,转而采用更传统的方式实现相同功能;或者尝试不同的构建策略来规避潜在的问题点。 ```java // 原始写法可能存在某些情况下无法正常工作的风险 @Data @NoArgsConstructor @AllArgsConstructor public class ExampleEntity { private Long id; } // 替代方案之一:手动编写必要的构造函数和访问器方法 public class AlternativeExampleEntity { private Long id; public AlternativeExampleEntity() {} public AlternativeExampleEntity(Long id) { this.id = id; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } } ``` #### 4. 检查Mapper接口设计合理性 确保Mapper接口内的SQL映射语句清晰明了,并且遵循最佳实践原则。特别是针对带有自动生成字段的情况,应当仔细核对表结构定义与Java Bean属性之间的对应关系是否准确无误。 ```xml <!-- Mapper XML 文件片段 --> <insert id="saveOrUpdate"> INSERT INTO example_table (id, ...) VALUES (#{entity.id}, ... ) </insert> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值