一、EasyCode和Lombok插件的安装
1、在idea中下载EasyCode插件
Easycode是idea的一个插件,可以直接对数据的表生成 entity(实体类层)、controller(控制层)、service(业务层)、dao(dao层)、mapper(mapper文件) 无需任何编码,简单而强大 。懒人必备呀!
安装成功后设置作者名
2、LomBok插件的安装
Lombok能通过注解的方式,在编译时自动为实体类中的属性生成构造器、getter/setter、equals、hashcode、toString方法 。效果是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。
二、EasyCode的使用
1、使用easyCode需要idea链接数据库
选择mysql数据库
设置账户的用户密码和数据库
测试链接下载驱动
测试成功可以链接
链接成功后
2、使用easyCode自动生成代码
右击数据库表=》选EasyCode=》选择GenerateCode
选择entity(实体类层)、controller(控制层)、service(业务层)、dao(dao层)、mapper(mapper文件)
自动生成结构,并且控制层满足restFul风格
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、访问数据库
数据库数据
前端访问数据库
三、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:
开启该项是为了让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 @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; }
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; }
(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
(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; }