Lombok

编程利器LomBok

在这里插入图片描述

一、LomBok入门

1 LomBok概述

LomBok是一个能自动插入IDE并进行构建的Java库工具,通过注解的方式来简化我们的编程,提高效率。它是通过修改底层AST语法树的方式来实现的,相对于反射技术在运行期进行修改,LomBok是在编译期进行修改源码,性能损耗较小。
官网:https://projectlombok.org/
官网介绍:
在这里插入图片描述
LomBok是一种JAVA实用工具,可用来帮助开发人员消除JAVA中的冗长代码,尤其是对于简单的JAVA对
象(POJO),通过注解实现目的。
在写Java程序的时候经常会遇到如下情形:
新建JavaBean,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法
lombok项目的产生就是为了省去我们手动创建getter和setter方法的麻烦,它能够在我们编译源码的时
候自动帮我们生成getter和setter方法。即它最终能够达到的效果是:在源码中没有getter和setter方
法,但是在编译生成的字节码文件中有getter和setter方法。
使用LomBok之前
在这里插入图片描述
使用LomBok之后
在这里插入图片描述

2 LomBok安装

2.1 Idea安装插件

注: IDEA 2020.3以上版本已经默认集成LomBok不需要安装插件

例:2018.2.8版本

  1. Flie->Setting->Plugins
  2. 搜索安装
    在这里插入图片描述
    点击Browse repositories搜索lombok进行安装
  3. 手动安装
    在这里插入图片描述
    点击Install plugin from disk,找到lombok插件安装包进行安装
    注:需要到https://plugins.jetbrains.com/搜索跟自己IDEA对应版本的lombok插件
    在这里插入图片描述

2.2 引入lombok依赖

  • 导入lombok-1.18.20.jar
  • Settings->BUild,Excution,Deployment->Annotation Processors中的Enable annotation processing勾选

二、LomBok常用注解

1 @Setter与@Getter

@Setter:注解在属性上,为属性提供 setter 方法

@Setter//给id属性添加set方法 
	private Integer id; 
	private String username; 
	private String userpassword;

@Getter:注解在属性上,为属性提供 getter 方法

@Setter//给id属性添加set方法 
	private Integer id; 
	@Getter//给username属性添加get方法 
	private String username; 
	private String userpassword;
@Setter//给id属性添加set get方法 
	@Getter// 
	private Integer id; 
	@Getter//给username属性添加get方法 
	private String username; 
	private String userpassword;

可以通过参数,设置setter和getter访问权限

@Setter(AccessLevel.PRIVATE)//给id的set方法设置私有属性 
	@Getter(AccessLevel.PROTECTED)//给id的get方法设置受保护属性 
	private Integer id; 
	@Getter(AccessLevel.PUBLIC)//给username的get方法设置公开属性 
	private String username; 
	private String userpassword;

@Setter与@Getter可以注解在类上,表示给该类下的所有属性提供setter和getter

@Getter 
@Setter 
//对整个类添加set和get
public class User1 { 
	private Integer id; 
	private String username; 
	private String userpassword; 
	static String str; 
	//只提供get 
	final String sex = ""; 
}

注:

  • 不会给static修饰的变量设置getter和setter
  • final修饰的变量只会提供getter

如果不想给某一个成员变量设置getter或setter,可以通过AccessLevel.NONE来取消

@Getter 
@Setter 
//对整个类添加set和get 
public class User1 { 
	private Integer id; 
	private String username; 
	//取消userpassword的set 
	@Setter(AccessLevel.NONE) 
	private String userpassword; 
	static String str; 
	//只提供get 
	final String sex = ""; 
}

2 @ToString

注解在类上,生成toString()方法,默认情况下,它会按顺序(以逗号分隔)打印类名称以及每个字段。

@Setter 
@Getter 
@ToString//会给User2设置一个toString方法 
public class User2 { 
	private Integer id; 
	private String username; 
	private String userpassword; 
}

编译后的文件:

public String toString() { 
	return "User2(id=" + this.getId() + ", username=" + this.getUsername() + ", 
	userpassword=" + this.getUserpassword() + ")"; 
}

可以通过exclude参数,来取消某一个(多个)变量进行toString显示

@Setter 
@Getter 
@ToString(exclude = {"userpassword"})//会给User2设置一个toString方法 
public class User2 { 
	private Integer id; 
	private String username; 
	private String userpassword; 
}

3 @EqualsAndHashCode

  1. 此注解会生成equals(Object other) 和 hashCode()、canEqual()方法。
  2. 它默认使用非静态的属性
  3. 可通过参数exclude排除一些属性
  4. 可通过参数of指定仅使用哪些属性
  5. 它默认仅使用该类中定义的属性且不调用父类的方法
@Setter 
@Getter 
@ToString 
@EqualsAndHashCode//给user类提供equals,hashcode,canequal方法 
public class User3 { 
	private Integer id; 
	private String username; 
	private String userpassword; 
}

通过exclude排除一些属性

@Setter 
@Getter 
@ToString 
@EqualsAndHashCode(exclude = {"userpassword"}) 
//排除userpassword 只使用id,username对比及计算hash 
public class User3 { 
	private Integer id; 
	private String username; 
	private String userpassword; 
}

通过of指定仅使用哪些属性

@Setter 
@Getter 
@ToString 
@EqualsAndHashCode(of = {"username"}) 
//只使用username对比及计算hash 
public class User3 { 
	private Integer id; 
	private String username; 
	private String userpassword; 
}

4 @NonNull与Constructor

4.1 @NonNull

@NonNull注解用来判断项目中的字段是否为空,为空抛出异常
@NonNull即可以修饰方法中的参数,也可以修饰成员变量

@Setter
@Getter
public class User4 {
    @NonNull
    //属性添加@NonNull  则主动判空
    private Integer id;
    private String username;
    private String userpassword;
    //参数添加@NonNull  则主动判空
    public void say(@NonNull String str)
    {
          System.out.println(str);
    }
}

4.2 Constructor

  1. @NoArgsConstructor:注解在类上,给该类生成一个无参构造方法
@Setter 
@Getter 
@NoArgsConstructor//给类提供无参构造方法 
public class User5 { 
	@NonNull 
	//属性添加@NonNull 则主动判空 
	private Integer id; 
	private String username; 
	private String userpassword; 
}
  1. @RequiredArgsConstructor
    注解在类上,给该类生成一个无参/有参构造方法。
    如果带参数,仅仅会给被final修饰的成员变量和被 @NonNull修饰的成员变量初始化值
@Setter 
@Getter 
@RequiredArgsConstructor 
public class User6 { 
	@NonNull 
	//属性添加@NonNull 则主动判空 
	private Integer id; 
	private String username; 
	private String userpassword; 
	private final String sex; 
}

以上代码会生成一个两个参数的构造方法,即第一个参数给username赋值,第二个参数给sex赋值

  1. @AllArgsConstructor:注解在类上,给该类生成一个全参的构造方法。
@Setter 
@Getter 
@AllArgsConstructor//提供全参构造方法 
public class User7 { 
	@NonNull 
	//属性添加@NonNull 则主动判空 
	private Integer id; 
	private String username; 
	private String userpassword; 
	private final String sex; 
}

5 @Data与@Builder

  1. @Data:注解在类上,提供类的get、set、equals、hashCode、canEqual、toString以及构造方

    @Data相当于同时添加@Setter、@Getter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor等五个注解
@Data 
//同时提供@Setter @Getter tostring EqualsAndHashcode Reqirured 
public class User8 { 
	@NonNull 
	//属性添加@NonNull 则主动判空 
	private Integer id; 
	private String username; 
	private String userpassword; 
}
  1. @Builder:实际是建造者模式的一个变种,所以在创建复杂对象时常使用
    使用了@Bulider和@Data注解后,就可以使用链式风格优雅地创建对象
@Data 
@Builder//提供链式风格 
public class User9 { 
	@NonNull 
	//属性添加@NonNull 则主动判空 
	private Integer id; 
	private String username; 
	private String userpassword; 
}
//通过链式风格构造对象 
User9 u = User9.builder()
				. id(1)
				. username("baizhan")
				. userpassword("baizhan")
				. build();

6 @Log与val与@Cleanup

  1. @Log:该注解就是帮助我们在日志中进行初始化操作的。
@Data 
@Log 
//@Log创建log对象 
public class User10 { 
	private Integer id; 
	private String username; 
	private String userpassword; 
	public void say(String str) 
	{ 
		log.info(str); 
	} 
}

相当于在类中添加如下代码

private static final Logger log = Logger.getLogger(User10.class.getName());

可以直接使用log对象输出日志:log.info();

  1. val
  • 可以使用 val 声明本地变量的类型而不用写出它的实际类型,它实际的类型将由初始化的表达
    式推断。
  • 局部变量将被声明为 final 。
  • 这个功能只在局部变量和foreach循环中奏效,在字段中不奏效。
  • 并且初始化表达式是必须的。
//JVM根据对象实际类型确认map类型 
val map = new HashMap<>();
  1. @Cleanup:用于关闭并释放资源,可以用在 IO 流上
    通过@Cleanup优雅关闭资源
@Cleanup OutputStream os1 = new FileOutputStream(new File(""));

三、LomBok实战

  1. 创建Lombok_mybatis工程及导入user.sql数据
  2. 引入相关jar包lombok-1.18.20.jar、mybatis-3.5.6.jar、mysql-connector-java-5.1.47.jar
  3. 创建Mybatis-config.xml文件,并引入配置
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-config.dtd"> 
<configuration> 
	<environments default="development"> 
		<environment id="development"> 
			<transactionManager type="JDBC"></transactionManager> 
			<dataSource type="POOLED"> 
				<property name="driver" value="com.mysql.jdbc.Driver" /> 
				<property name="url" value="jdbc:mysql://127.0.0.1:3306/baizhan?useSSL=false" /> 
				<property name="username" value="root" /> 
				<property name="password" value="root" /> 
			</dataSource> 
		</environment> 
	</environments> 
	<mappers> 
		<package name="com.bzcxy.mapper"/> 
	</mappers> 
</configuration>
  1. 创建com.bzcxy.mapper包,并在该包下创建UserMapper接口及UserMapper.xml
public interface UserMapper { 
	List<User> selectAll(); 
}
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
<mapper namespace="com.bzcxy.mapper.UserMapper"> 
	<select id="selectAll" resultType="com.bzcxy.pojo.User"> 
		select * from user; 
	</select> 
</mapper>
  1. 创建com.bzcxy.pojo包,并创建User类
public class User { 
	private Integer id; 
	private String username; 
	private String userpassword; 


	public Integer getId() { 
		return id; 
	}
	public void setId(Integer id) { 
		this.id = id; 
	}
	public String getUsername() { 
		return username; 
	}
	public void setUsername(String username) { 
		this.username = username; 
	}
	public String getUserpassword() { 
		return userpassword; 
	}
	public void setUserpassword(String userpassword) { 
		this.userpassword = userpassword; 
	} 
}
  1. 编写测试代码运行
public class Main {
    public static void main(String[] args)throws Exception {
        InputStream is = Resources.getResourceAsStream("Mybatis-config.xml");
        //获取sqlSession
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取mapper代理
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //查询数据
        List<User> users = userMapper.selectAll();
        System.out.println(users);
    }
}

在这里插入图片描述
7. 修改User类为lombok方式,再次运行

package com.bzcxy.pojo;

import lombok.Data;

@Data
public class User {
    private Integer id;
    private String username;
    private String userpassword;
}

在这里插入图片描述
执行
在这里插入图片描述
下一篇:【RBAC】

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值