EasyCode和Lombok插件的使用,一键生成所需代码(两大代码神器)

简介: 📒 程序员小王的博客:程序员小王的博客🎉 欢迎点赞 👍 收藏 ⭐留言 📝😊 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕🍅java自学的学习路线:java自学的学习路线

一、EasyCode和Lombok插件的安装

1、在idea中下载EasyCode插件

Easycode是idea的一个插件,可以直接对数据的表生成 entity(实体类层)、controller(控制层)、service(业务层)、dao(dao层)、mapper(mapper文件) 无需任何编码,简单而强大 。懒人必备呀!


0.png


安装成功后设置作者名

1.png


2、LomBok插件的安装

Lombok能通过注解的方式,在编译时自动为实体类中的属性生成构造器、getter/setter、equals、hashcode、toString方法 。效果是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。


2.png


二、EasyCode的使用

1、使用easyCode需要idea链接数据库

选择mysql数据库

3.png


设置账户的用户密码和数据库

4.png


测试链接下载驱动

5.png


测试成功可以链接

6.png


链接成功后

7.png


2、使用easyCode自动生成代码

右击数据库表=》选EasyCode=》选择GenerateCode

8.png


选择entity(实体类层)、controller(控制层)、service(业务层)、dao(dao层)、mapper(mapper文件)

9.png


自动生成结构,并且控制层满足restFul风格

10.png


3、自动生成的Controller层

/**
 * (TAdmin)表控制层
 *
 * @author 程序员小王
 * @since 2021-12-26 21:07:13
 */
@RestController
@RequestMapping("tAdmin")
public class TAdminController {
    /**
     * 服务对象
     */
    @Resource
    private TAdminService tAdminService;
    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public ResponseEntity<TAdmin> queryById(@PathVariable("id") Integer id) {
        return ResponseEntity.ok(this.tAdminService.queryById(id));
    }
    /**
     * 新增数据
     *
     * @param tAdmin 实体
     * @return 新增结果
     */
    @PostMapping
    public ResponseEntity<TAdmin> add(TAdmin tAdmin) {
        return ResponseEntity.ok(this.tAdminService.insert(tAdmin));
    }
    /**
     * 编辑数据
     *
     * @param tAdmin 实体
     * @return 编辑结果
     */
    @PutMapping
    public ResponseEntity<TAdmin> edit(TAdmin tAdmin) {
        return ResponseEntity.ok(this.tAdminService.update(tAdmin));
    }
    /**
     * 删除数据
     *
     * @param id 主键
     * @return 删除是否成功
     */
    @DeleteMapping
    public ResponseEntity<Boolean> deleteById(Integer id) {
        return ResponseEntity.ok(this.tAdminService.deleteById(id));
    }
}


4、自动生成的mapper文件

<mapper namespace="com.tjcu.dao.TAdminDao">
    <resultMap type="com.tjcu.entity.TAdmin" id="TAdminMap">
        <result property="id" column="id" jdbcType="INTEGER"/>
        <result property="username" column="username" jdbcType="VARCHAR"/>
        <result property="password" column="password" jdbcType="VARCHAR"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="sex" column="sex" jdbcType="VARCHAR"/>
    </resultMap>
    <!--查询单个-->
    <select id="queryById" resultMap="TAdminMap">
        select
          id, username, password, name, sex
        from t_admin
        where id = #{id}
    </select>
    <!--查询指定行数据-->
    <select id="queryAllByLimit" resultMap="TAdminMap">
        select
          id, username, password, name, sex
        from t_admin
        <where>
            <if test="id != null">
                and id = #{id}
            </if>
            <if test="username != null and username != ''">
                and username = #{username}
            </if>
            <if test="password != null and password != ''">
                and password = #{password}
            </if>
            <if test="name != null and name != ''">
                and name = #{name}
            </if>
            <if test="sex != null and sex != ''">
                and sex = #{sex}
            </if>
        </where>
        limit #{pageable.offset}, #{pageable.pageSize}
    </select>
    <!--统计总行数-->
    <select id="count" resultType="java.lang.Long">
        select count(1)
        from t_admin
        <where>
            <if test="id != null">
                and id = #{id}
            </if>
            <if test="username != null and username != ''">
                and username = #{username}
            </if>
            <if test="password != null and password != ''">
                and password = #{password}
            </if>
            <if test="name != null and name != ''">
                and name = #{name}
            </if>
            <if test="sex != null and sex != ''">
                and sex = #{sex}
            </if>
        </where>
    </select>
    <!--新增所有列-->
    <insert id="insert" keyProperty="id" useGeneratedKeys="true">
        insert into t_admin(username, password, name, sex)
        values (#{username}, #{password}, #{name}, #{sex})
    </insert>
    <insert id="insertBatch" keyProperty="id" useGeneratedKeys="true">
        insert into t_admin(username, password, name, sex)
        values
        <foreach collection="entities" item="entity" separator=",">
        (#{entity.username}, #{entity.password}, #{entity.name}, #{entity.sex})
        </foreach>
    </insert>
    <insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true">
        insert into t_admin(username, password, name, sex)
        values
        <foreach collection="entities" item="entity" separator=",">
            (#{entity.username}, #{entity.password}, #{entity.name}, #{entity.sex})
        </foreach>
        on duplicate key update
        username = values(username),
        password = values(password),
        name = values(name),
        sex = values(sex)
    </insert>
    <!--通过主键修改数据-->
    <update id="update">
        update t_admin
        <set>
            <if test="username != null and username != ''">
                username = #{username},
            </if>
            <if test="password != null and password != ''">
                password = #{password},
            </if>
            <if test="name != null and name != ''">
                name = #{name},
            </if>
            <if test="sex != null and sex != ''">
                sex = #{sex},
            </if>
        </set>
        where id = #{id}
    </update>
    <!--通过主键删除-->
    <delete id="deleteById">
        delete from t_admin where id = #{id}
    </delete>
</mapper>

 

5、自动生成的dao层

**
 * (TAdmin)表数据库访问层
 *
 * @author 程序员小王
 * @since 2021-12-26 21:07:15
 */
public interface TAdminDao {
    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    TAdmin queryById(Integer id);
    /**
     * 统计总行数
     *
     * @param tAdmin 查询条件
     * @return 总行数
     */
    long count(TAdmin tAdmin);
    /**
     * 新增数据
     *
     * @param tAdmin 实例对象
     * @return 影响行数
     */
    int insert(TAdmin tAdmin);
    /**
     * 批量新增数据(MyBatis原生foreach方法)
     *
     * @param entities List<TAdmin> 实例对象列表
     * @return 影响行数
     */
    int insertBatch(@Param("entities") List<TAdmin> entities);
    /**
     * 批量新增或按主键更新数据(MyBatis原生foreach方法)
     *
     * @param entities List<TAdmin> 实例对象列表
     * @return 影响行数
     * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参
     */
    int insertOrUpdateBatch(@Param("entities") List<TAdmin> entities);
    /**
     * 修改数据
     *
     * @param tAdmin 实例对象
     * @return 影响行数
     */
    int update(TAdmin tAdmin);
    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 影响行数
     */
    int deleteById(Integer id);
}

6、自动生成的业务层

/**
 * (TAdmin)表服务实现类
 *
 * @author 程序员小王
 * @since 2021-12-26 21:07:18
 */
@Service("tAdminService")
public class TAdminServiceImpl implements TAdminService {
    @Resource
    private TAdminDao tAdminDao;
    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public TAdmin queryById(Integer id) {
        return this.tAdminDao.queryById(id);
    }
    /**
     * 新增数据
     *
     * @param tAdmin 实例对象
     * @return 实例对象
     */
    @Override
    public TAdmin insert(TAdmin tAdmin) {
        this.tAdminDao.insert(tAdmin);
        return tAdmin;
    }
    /**
     * 修改数据
     *
     * @param tAdmin 实例对象
     * @return 实例对象
     */
    @Override
    public TAdmin update(TAdmin tAdmin) {
        this.tAdminDao.update(tAdmin);
        return this.queryById(tAdmin.getId());
    }
    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer id) {
        return this.tAdminDao.deleteById(id) > 0;
    }
}


7、访问数据库

数据库数据

11.png


前端访问数据库

12.png


三、LomBok插件使用

1、LomBok解决的问题及缺点

(1)优点

lombok主要解决实体类层的get,set方法,构造器,异常处理;I/O流的关闭操作等等,这些代码没有什么技术含量,又影响着代码的美观,Lombok插件接收解决这些问题的


(2)缺点

但是企业开发中有些公司不使用lomBok,因为只要有一个人使用了lombok,整个项目组都需要使用lombok


2、Lombok的使用

(1)SpringBoot和IDEA官方有推荐使用

Idea已经内置了LomBok插件

SpringBoot2.1x之后的版本已经内置了LomBok的相关依赖

(2)引入相关的依赖

 

  <!--lombok的相关依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
            <scope>provided</scope>
        </dependency>


注意:Lombok的scope=provided,说明它只在编译阶段生效,不需要打入包中。事实正是如此,Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件。


(3)IDEA对LomBok的支持

点击File-- Settings设置界面,开启 AnnocationProcessors:

13.png


开启该项是为了让Lombok注解在编译阶段起到作用


(4)LomBok相关注解的使用

没使用Lombok之前

public class TAdmin implements Serializable {
    private static final long serialVersionUID = -81568151678905514L;
    private Integer id;
    private String username;
    private String password;
    private String name;
    private String sex;
    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 getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
}

使用Lombok之后@Setter

@Setter
@Getter               //生成所有成员变量的getter/setter方法;作用于成员变量上
@ToString             //覆盖默认的toString()方法
@NoArgsConstructor   //生成无参构造器
@AllArgsConstructor  //生成全参构造器
public class TAdmin implements Serializable {
    private static final long serialVersionUID = -81568151678905514L;
    private Integer id;
    private String username;
    private String password;
    private String name;
    private String sex;
}

14.png


3、Lombok实现原理

javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该API,就能在javac运行的时候得到调用。


  • javac对源码进行分析,生成一棵抽象语法树(AST


javac编译过程中调用实现了JSR 269的Lombok程序


此时Lombok就对第一步骤得到的AST进行处理,找到Lombok注解所在类对应的语法树 (AST),然后修改该语法树(AST),增加Lombok注解定义的相应树节点


javac使用修改后的抽象语法树(AST)生成字节码文件


4、Lombok里面的相关注解

(1)@Getter/@Setter:

作用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员变量的getter/setter方法。可以设定访问权限及是否懒加载等。

@Getter
@Setter
public class Emp implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String name;
    private Double salary;
    private Integer age;
}


(2)@ToString:

作用于类,覆盖默认的toString()方法,可以通过of属性 限定显示某些字段,通过exclude属性 排除某些字段。

@Getter
@Setter
@ToString(of={"name","salary"},exclude = {"age"})
@AllArgsConstructor
public class Emp implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String name;
    private Double salary;
    private Integer age;
}


15.png


(3)生成构造函数相关的注解

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor:作用于类上,用于生成构造函数。有staticName、access等属性。

staticName属性一旦设定,将采用静态方法的方式生成实例,access属性可以限定访问权限。

@NoArgsConstructor:生成无参构造器;

@RequiredArgsConstructor:生成包含final和@NonNull注解的成员变量的构造器;

@AllArgsConstructor:生成全参构造器

@Getter
@Setter
@ToString(of={"name","salary"},exclude = {"age"})
@AllArgsConstructor    //全参构造器
@NoArgsConstructor     //无参构造器
public class Emp implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String name;
    private Double salary;
    private Integer age;
}

(4)@EqualsAndHashCode

作用于类,覆盖默认的equals和hashCode

16.png


(5)@NonNull:

主要作用于成员变量和参数中,标识不能为空,否则抛出空指针异常。

@Getter
@Setter
@ToString(of={"name","salary"},exclude = {"age"})
@AllArgsConstructor    //全参构造器
@NoArgsConstructor     //无参构造器
@EqualsAndHashCode     //作用于类,覆盖默认的equals和hashCode
public class Emp implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer id;
    /**
     * @NonNull代码name不能为空,否则报错
     */
    @NonNull private String name;
    private Double salary;
    private Integer age;
}


(6)@Data

作用于类上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor

//@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor集合
@Data   
@AllArgsConstructor  //一定注意不包含全构造器
public class Emp implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String name;
    private Double salary;
    private Integer age;
}


17.png

相关文章
|
4天前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
21天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
45 3
|
29天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
62 2
|
1月前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
87 5
|
1月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
64 5
|
2月前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
1月前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
jenkins Java 持续交付
5❤️Jenkins从零到壹❤️ :集成DingTalk 插件实现构建推送消息到钉钉(JAVA 小虚竹)
5❤️Jenkins从零到壹❤️ :集成DingTalk 插件实现构建推送消息到钉钉(JAVA 小虚竹)
283 0
5❤️Jenkins从零到壹❤️ :集成DingTalk 插件实现构建推送消息到钉钉(JAVA 小虚竹)
|
8天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
48 17
|
19天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者