Dayu Toolkit之代码自动生成插件

简介: 在2B场景下,相当数量中小项目的领域模型是多字段的单表(实体)增删改查。对后端研发同学,实现这样的业务逻辑,粗略地看,无非下面几个基本操作。• 创建数据库表,并添加业务字段。• 撰写Java实体类DO,添加对应的字段。• 撰写Java数据操作类,DAO,撰写相关方法。• 撰写Service类,增加对相关实体的CRUD操作。• 如果是Web应用,撰写Controller类,暴露相关的REST API。也就是说,在定义了数据库表结构以后,上述都是一些机械化和模板化的重复操作。因此我们开发了基于Intellij的CRUD代码自动生成插件。

背景

2B场景下,相当数量中小项目的领域模型是多字段的单表(实体)增删改查。对后端研发同学,实现这样的业务逻辑,粗略地看,无非下面几个基本操作。

  • 创建数据库表,并添加业务字段。
  • 撰写Java实体类DO,添加对应的字段。
  • 撰写Java数据操作类,DAO,撰写相关方法。
  • 撰写Service类,增加对相关实体的CRUD操作。
  • 如果是Web应用,撰写Controller类,暴露相关的REST      API

也就是说,在定义了数据库表结构以后,上述都是一些机械化和模板化的重复操作。因此我们开发了基于IntellijCRUD代码自动生成插件。

主要功能

主要功能非常简单,就是在IDE中连接数据库后,选择数据库表后,根据表结构生成:

  • Java实体类
  • Mybatis或者Mybatis plus风格的Mapper
  • 我们推荐使用Mybatis       plus,因为它极大地降低了代码的复杂度。当然联表查询情况下,用户依然可以使用Mybatis撰写SQL语句。
  • 对应的mapper      xml文件,如果有的话
  • 对应的ServiceController
  • 各个模块的单元测试文件
  • 根据选择的表在resources/schema.sql中目录生成建表语句

对应文件生成的风格根据当前目录结构自动判别,支持两种风格:

  1. dayu-boot六边形脚手架(dayu-boot脚手架是阿里云GTS开发的面向交付场景设计的后端Java脚手架)
  2. 分层结构(controller/service/dao)脚手架

快速开始

添加插件库地址

该地址暂时不对外透出,请联系李晨(ruli.lc@alibaba-inc.com)获取

image.png

安装“code-generation”插件

image.png我们下面用一个例子来说明在大禹脚手架的场景下,如何使用插件来生成代码。
假设现在我们有一张名为employee(员工)的表,字段如下:

字段名

意义

类型

id

bigint

主键

name

varchar

姓名

age

int

年龄

同时我们通过大禹交付平台,使用大禹脚手架初始化完成一份基础代码。

生成代码

生成代码的方式非常简单。在项目目录右击或在代码空白处右击,选中code-generation -> MySQL生成后,插件会根据当前项目的代码结构识别脚手架类型。image.png点击“Next”,选择当前保存的数据库连接,或者新建一个连接,测试其连通性。如果本地可以连接数据库,那么选择连接以后,会展现当前数据库实例中的所有库。

image.png选择想展示的库以后,点击“Next”,展示所有表信息。这里我们既可以选择一个表,生成该表对应的Java实体及其相关的代码,也可以选择多个表,生成多套代码。这里我们选择刚刚创建的employee表。

image.png

注意在六边形脚手架中,我们按照规范,只会生产MybatisPlus风格的mapper类。这样我们的employee相关的代码就生成完毕了。我们来看看插件都帮我们生产了什么。下面列举主要的几个核心文件。

模型实体类

一个和表结构相关的Java实体类。如果建表的时候提供了comment信息,相应的注释上会填充相关信息。

@Data
public class Employee {

         
/**
*
*/
private Long id;

         
/**
*
*/
private String name;

         
/**
*
*/
private Integer age;

         
}

数据库实体类

也就是我们通常说的“DO”

@Data
@TableName("employee")
public class EmployeeEntity {

         
/**
*
*/
@TableId
@TableField("id")
private Long id;

         
/**
*
*/
@TableField("name")
private String name;

         
/**
*
*/
@TableField("age")
private Integer age;

         
}

DAO相关的类

dayu-boot脚手架的场景下,一个Repository实现类和一个MybatisPlus风格的Mapper接口类。

@AllArgsConstructor
public class EmployeeMyBatisRepository implements EmployeeRepository  {

         
private EmployeeEntityMapper  employeeEntityMapper;

         
@Override
public Employee findById(Long id) {
EmployeeEntity employeeEntity = employeeEntityMapper.selectById(id);
if (employeeEntity != null) {
Employee employee = new Employee();
BeanUtils.copyProperties(employeeEntity, employee);
return employee;
}
return null;
}
//省略其他方法
}

Service层的操作类

@AllArgsConstructor
public class EmployeeDomainService {

         
private EmployeeRepository employeeRepository;

         
public Employee createEmployee(Employee employee) {
Employee newEmployee = employeeRepository.save(employee);
return newEmployee;
}

         
public Employee findEmployeeById(Long id) {
return employeeRepository.findById(id);
}

         
public Employee updateEmployee(Employee employee) {
return employeeRepository.update(employee);
}

         
public Boolean deleteEmployeeById(Long id) {
return employeeRepository.delete(id);
}

         
public PageResult searchByPage(EmployeeSearchByPage employeeSearchByPage) {
return employeeRepository.findByPage(employeeSearchByPage);
}

         
}

Controller

生成的Controller中相关的REST API

@RestController
@RequestMapping("/employee")
public class EmployeeController implements EmployeeAPIHttp {

         
@Autowired
private EmployeeAppService employeeAppService;

         
@Override
public ResultResponse<EmployeeDTO> createEmployee(EmployeeDTO employeeDTO) {
return employeeAppService.createEmployee(employeeDTO);
}

         
@Override
public ResultResponse<EmployeeDTO> findEmployeeById(Long id) {
return employeeAppService.findEmployeeById(id);
}

         
@Override
public ResultResponse<EmployeeDTO> updateEmployee(EmployeeDTO employeeDTO) {
return employeeAppService.updateEmployee(employeeDTO);
}

         
@Override
public ResultResponse<Boolean> deleteEmployeeById(Long id) {
return employeeAppService.deleteEmployeeById(id);
}

         

         
@Override
public ResultResponse<ApiPageResult> searchByPage(EmployeeSearch employeeSearch) {
return employeeAppService.searchByPage(employeeSearch);
}

         
}

最后插件也在每一个module中生成了相关的单测方法,我们现在举一个在domain层的单测类为例。

单元测试

@Test
public void testEmployee() {
Employee employee = new Employee ();
Employee newEmployee  = employeeDomainService.createEmployee(employee);
assertNotNull(newEmployee .getId());

         
Employee  searchEmployee  = employeeDomainService.findEmployeeById(newEmployee.getId());
assertEquals(newEmployee.getId(),searchEmployee .getId());

         
Employee  updateEmployee  = employeeDomainService.updateEmployee (searchEmployee );
assertEquals(searchEmployee .getId(),updateEmployee .getId());

         
EmployeeSearchByPage employeeSearchByPage = new EmployeeSearchByPage();
employeeSearchByPage.setPageSize(5);
employeeSearchByPage.setPageNum(1);
PageResult<Employee > pageResult = employeeDomainService.searchByPage(employeeSearchByPage);
assertEquals(pageResult.getSize(),Long.valueOf(employeeSearchByPage.getPageSize()));
assertNotNull(pageResult.getList());

         
Boolean aBoolean = employeeDomainService.deleteEmployeeById(searchEmployee.getId());
assertTrue(aBoolean);

         
Employee  searchNewEmployee  = employeeDomainService.findEmployeeById(searchEmployee.getId());
assertNull(searchNewEmployee );

         
}

基本设置是:

  • 创建实体
  • 通过id查询实体,验证创建成功
  • 更新实体,验证更新成功
  • 按条件查询实体

非大禹脚手架的分层结构也非常类似,不再赘述。

未来规划

我们希望推出一系列面向交付的研发插件套件,能涵盖从表结构设计,业务代码生成,单元测试,前端代码生成,前后端联调等场景,从而提高交付场景下的研发效能。它们是我们交付场景下的“Dayu Toolkit”

目录
相关文章
|
2月前
|
API
IDEA使用apifox插件生成接口
IDEA使用apifox插件生成接口
28 1
|
6月前
IDEA 自动生成set方法(GenerateAllSetter插件)
IDEA 自动生成set方法(GenerateAllSetter插件)
558 0
|
6月前
|
Web App开发 JavaScript 前端开发
Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】
Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】
206 0
|
XML Java API
小伙伴想写个 IDEA 插件么?这些 API 了解一下!
在看完 IDEA 插件开发简易教程后,小伙伴们是否迫不及待的想自己上手整一个插件了?心里规划好了一二三,但是却不知道从哪里开始下手。下面我分享下自己整理的一些常用的 API。
372 0
|
安全 开发工具 C++
x64dbg 插件开发SDK环境配置
x64dbg 是一款开源的应用层反汇编调试器,旨在对没有源代码的可执行文件进行恶意软件分析和逆向工程,同时 x64dbg 还允许用户开发插件来扩展功能,插件开发环境的配置非常简单,如下将简单介绍x64dbg是如何配置开发环境以及如何开发插件的。
198 0
x64dbg 插件开发SDK环境配置
|
测试技术
插件调试
插件调试
81 0
|
开发工具 vr&ar 图形学
Pico SDK导入Unity工程
2022VR国赛即将开始,对于Pico与Unity的使用已经很熟练了,想为下一届参赛选手及Unity 3D引擎爱好者或者是Pico开发者 聊一下自己的理解,目前Unity引擎的主流打包平台设备就是Pico和Steam VR,我参加的国赛采用的是Pico设备,所以今天就先讲一下Pico
550 0
Pico SDK导入Unity工程
|
架构师 IDE 开发工具
Visual Studio Package 插件开发之自动生成实体工具(Visual Studio SDK)(三)
Visual Studio Package 插件开发之自动生成实体工具(Visual Studio SDK)(三)
215 0
Visual Studio Package 插件开发之自动生成实体工具(Visual Studio SDK)(三)
|
XML 数据库连接 开发工具
Visual Studio Package 插件开发之自动生成实体工具(Visual Studio SDK)(二)
Visual Studio Package 插件开发之自动生成实体工具(Visual Studio SDK)(二)
127 0
Visual Studio Package 插件开发之自动生成实体工具(Visual Studio SDK)(二)
|
开发工具 C++
Visual Studio Package 插件开发之自动生成实体工具(Visual Studio SDK)(一)
Visual Studio Package 插件开发之自动生成实体工具(Visual Studio SDK)(一)
409 0
Visual Studio Package 插件开发之自动生成实体工具(Visual Studio SDK)(一)