5分钟极速生成RuoYi风格代码:EasyCode+MyBatisPlus黄金组合实战

每次新建实体类时还在重复编写相似的Controller增删改查代码?RuoYi框架的标准结构虽然规范,但手动实现分页查询、统一返回格式等重复劳动会消耗开发者大量时间。本文将揭示如何通过EasyCode插件与MyBatisPlus模板的深度整合,实现符合RuoYi编码规范的代码全自动生成。

1. 环境准备与插件配置

在IntelliJ IDEA中安装EasyCode插件只需三步:

  1. 打开 File -> Settings -> Plugins
  2. 搜索栏输入"EasyCode"
  3. 点击安装并重启IDE

配置数据库连接时有个实用技巧:对于MySQL连接,建议在URL后添加 &nullCatalogMeansCurrent=true 参数,这样可以避免生成代码时出现不必要的schema前缀。连接成功后,在数据库视图右键表名时会出现"EasyCode"菜单项。

提示:建议创建专门的模板配置目录,方便团队共享。将模板文件保存在版本控制系统中,新成员加入时直接导入即可保持团队代码风格统一。

2. RuoYi框架代码结构深度解析

RuoYi的Controller层有三大核心特征需要我们在模板中复现:

  1. 继承体系 :所有Controller必须继承 BaseController ,才能使用 startPage() getDataTable() 等分页方法
  2. 返回值规范
    • 列表数据返回 TableDataInfo
    • 单条数据返回 AjaxResult.success()
    • 操作结果返回 toAjax()
  3. 方法命名
    • 查询列表: find[Xxx]SelectList
    • 单条查询: select[Xxx]ById
    • 增删改: add[Xxx] / update[Xxx] / delete[Xxx]

Service层的典型结构如下表所示:

组件类型 必须实现的接口 典型方法签名示例
Service接口 IService List findXxxSelectList(XxxDto dto)
Service实现类 ServiceImpl<M,T> 使用LambdaQueryWrapper构建条件查询
Mapper接口 BaseMapper 带@Mapper注解,包含XML对应的查询方法

3. Velocity模板定制实战

3.1 Controller模板关键配置

## controller.java.vm
@RestController
@RequestMapping("/${tool.firstLowerCase($tableInfo.name)}")
@RequiredArgsConstructor
public class ${tableName} extends BaseController {
    private final ${tableInfo.name}Service ${tool.firstLowerCase($tableInfo.name)}Service;

    @PostMapping("/list")
    public TableDataInfo list(@RequestBody ${tableInfo.name}Dto dto) {
        startPage();
        return getDataTable(service.find${tableInfo.name}SelectList(dto));
    }
    
    @PostMapping("/{id}")
    public AjaxResult getById(@PathVariable Long id) {
        return AjaxResult.success(service.select${tableInfo.name}ById(id));
    }
}

3.2 分页查询DTO模板优化

RuoYi风格的分页查询DTO需要包含以下固定字段:

## dto.java.vm
@Data
public class ${tableInfo.name}Dto {
    #foreach($column in $tableInfo.fullColumn)
    private ${tool.getClsNameByFullName($column.type)} ${column.name};
    #end
    
    private Integer pageNum;
    private Integer pageSize;
    
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime beginTime;
    
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 
    private LocalDateTime endTime;
}

3.3 MyBatisPlus增强配置

在mapper.xml模板中,我们需要实现动态条件查询:

## mapper.xml.vm
<select id="select${tableInfo.name}List" resultMap="${tableInfo.name}Map">
    SELECT #allSqlColumn() FROM ${tableInfo.obj.name}
    <where>
        #foreach($column in $tableInfo.fullColumn)
        <if test="${column.name} != null">
            AND ${column.obj.name} = #{${column.name}}
        </if>
        #end
        <if test="beginTime != null">
            AND create_time >= #{beginTime}
        </if>
        <if test="endTime != null">
            AND create_time <= #{endTime}
        </if>
    </where>
</select>

4. 高级技巧与异常处理

4.1 枚举类型特殊处理

对于字段类型为枚举的情况,模板需要特殊处理:

## pojo.java.vm
#if($column.type.contains("Enum"))
@Enumerated(EnumType.STRING)
#end
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};

4.2 逻辑删除集成

在MyBatisPlus配置类中添加:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
    interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
    return interceptor;
}

实体类中添加注解:

## pojo.java.vm
@TableLogic
private Integer delFlag;

4.3 生成代码后的二次开发

虽然模板可以生成90%的标准代码,但仍需手动处理:

  1. 复杂业务逻辑实现
  2. 特殊校验规则添加
  3. 权限控制注解补充
  4. 业务异常处理

例如添加权限控制:

@PreAuthorize("@ss.hasPermi('system:user:query')")
public TableDataInfo list(...) {
    // ...
}

5. 团队协作最佳实践

建议建立团队级的模板仓库,包含以下内容:

/templates
  ├── ruoyi
  │   ├── controller.java.vm
  │   ├── service.java.vm
  │   └── ...
  ├── common
  │   ├── pagination.dto.vm
  │   └── response.java.vm
  └── README.md

新项目初始化时,执行以下命令即可获取最新模板:

git clone <template-repo-url>
cp -r templates/ruoyi/* .idea/easyCode/

对于微服务项目,可以扩展模板支持Feign客户端生成:

## feign.java.vm
@FeignClient(name = "${serviceName}", path = "/${entityPath}")
public interface ${tableName}Feign {
    @PostMapping("/list")
    Result<PageInfo<${tableInfo.name}VO>> list(@RequestBody ${tableInfo.name}Query query);
}
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐