Featured image of post RuoYi 系统升级 Mybatis-Plus 代码生成

RuoYi 系统升级 Mybatis-Plus 代码生成

若依框架升级 Mybatis-Plus 后,调整代码生成的功能,以适应其代码规范

RuoYi 系统升级 Mybatis-Plus 代码生成

续上 RuoYi 系统升级使用 Mybatis-Plus ,目前项目已经能够支持原本的 mybatis 代码,同时也能够支持新的 mybatis-plus 代码,接下来就继续调整 代码生成 功能的部分,这样就能够更加快速的实现业务需求功能。

ruoyi_mp_50.png

如上图所示的样例,要生成的 student 表,这里面的信息其实是保存在两张数据表里面, gen_tablegen_table_column


为了使代码模板更简洁,项目中引入了 lombok,需要在 ruoyi-common 项目中引入相关的依赖

ruoyi_mp_55.png

如果不想使用它的话,自己就需要加入每个字段的 get/set 方法,例如下图所示,具体可以参看原项目中的 domain.java.vm 模板

ruoyi_mp_56.png


调整 vm 模板

代码生成的功能,主要依靠 vm 模板来实现的,我们需要调整对应的代码模板。主要调整的是 ruoyi-generator 项目下的 vm 目录,这里区分了不同模块的代码。

ruoyi_mp_51.png

Velocity 模板工具

这里先提一下 VelocityUtils ,这个工具类为模板引擎提供了很多上下文,而这些内容是提供给稍后介绍的代码模板用的,大概就是具体的数据表中的字段信息的封装,具体的内容可以去查看源码。

ruoyi_mp_52.png

这里介绍几个重点的参数:

  • ClassName:类的名字,例如 Student
  • tableName:数据表的名字,例如 student
  • columns:数据表的字段列表,通过查询 gen_table_column
  • pkColumn:表主键字段名,例如 id

domain 模板

为了不影响原本的模板,这里就新建了一个 domain_plus.vm 文件,后面的模板也是如此操作。

ruoyi_mp_53.png

这里有个处理,就是对数据表中 datatime 类型的字段,都统一处理为 LocalDateTime,因为项目中已经使用 Springboot3,就不再使用 Date 类型了

ruoyi_mp_54.png

从系统获取到的 java 类型为 Date ,所以这里对应的做一下适配就行了。

mapper 模板

新建一个 mapper_plus.java.vm 文件,这里继承 mybatis-plusBaseMapper,就这么简单

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package ${packageName}.mapper;

import ${packageName}.domain.${ClassName};
#if($table.sub)
import ${packageName}.domain.${subClassName};
#end
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
 * ${functionName}Mapper接口
 * 
 * @author ${author}
 * @date ${datetime}
 */
public interface ${ClassName}Mapper extends BaseMapper<${ClassName}>
{

}

service 模板

新建一个 service_plus.java.vm 文件,这里继承 mybatis-plusIService,就这么简单

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package ${packageName}.service;

import ${packageName}.domain.${ClassName};
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * ${functionName}Service接口
 * 
 * @author ${author}
 * @date ${datetime}
 */
public interface ${ClassName}Service extends IService<${ClassName}>
{

}

后端代码的部分, domainmapperservice 基本就完成了,后面控制层部分的代码,则是按照我个人的喜好来实现的,大家可以根据自己的情况进行修改即可


vo 模板

这里添加了一个 vo_plus.java.vm 文件,它的主要作用是 传递参数页面展示,另外还有附带一些分页的信息和其他额外的公共字段。

ruoyi_mp_57.png

代码跟 domain 基本是一致的,多的是继承一个 BasePageDtoRequest 类,其中 PageDtoRequest 为分页类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
@Data
public class BasePageDtoRequest {

    /**
     * 查询开始时间
     * 格式:yyyy-MM-dd
     */
    private String startDate;

    /**
     * 查询结束时间
     * 格式:yyyy-MM-dd
     */
    private String endDate;

    /**
     * 分页
     */
    private PageDtoRequest pageDto;
}

就是一个页码和条数

1
2
3
4
5
6
7
@Data
public class PageDtoRequest {

    private Long current;

    private Long size;
}

business 模板

创建新的 business_plus.java.vm 文件。

我个人喜欢多抽离一个业务层,不将业务代码写在 service 中,一般有两个原因,第一避免循环依赖,第二 mybatis-plus 的自动代码生成一般都会包括 service代码,避免覆盖或者其他情况。

这里重点说一下分页的方法,其他的可以去看源码。一般单表的分页,直接调用 servicepage 方法即可,其他的就是组装前端传过来的查询字段。最终的效果,可能是下图这样的。

ruoyi_mp_58.png

这里的难点在于,我们需要知道到底要查询哪些字段,但是这个是可以通过后台去配置,而且还记录在 gen_table_column 表中。

ruoyi_mp_59.png

ruoyi_mp_60.png

这些参数可以通过上下文 columns 获取到,所以我们就可以通过遍历判断 isQuery 即可实现。

ruoyi_mp_61.png

controller 模板

创建新的 controller_plus.java.vm 文件。

在响应返回的结构体这边,我自己添加了一些类,而且方法名也做了调整,区别于原本项目中的,具体的就不再这边一一介绍了,大家可以看源码。

ruoyi_mp_62.png


以下是前端项目的模板调整


js api 模板

新建一个 api_plus.js.vm 文件,这里只要编写的是后端的接口,注意这里要的路径,不同于原项目

ruoyi_mp_70.png

vue 模板

新建一个 index_plus.vue.vm 文件,这里就是列表页面的代码。

ruoyi_mp_71.png

这里主要注意的是,因为调整过了响应的结构体,所以我们要对应的调整到页面中,例如这里的分页返回

ruoyi_mp_72.png

对应的页面的调整,一个是列表数据,一个是分页数据

ruoyi_mp_73.png

其他的接口也是类似的,这里就不一一介绍了。

模板加载调整

由于我们加入了新的模板文件,所以需要调整启用这些新的模板。

VelocityUtils.java 文件中,调整以下两个位置的代码:

1)调整 getTemplateList 方法内的,注意不要保留旧的 vm 模板

ruoyi_mp_74.png

2)调整 getFileName 方法内的,注意不要保留旧的 vm 模板

ruoyi_mp_75.png

测试

我们以下图为测试例子,生成完整的代码

ruoyi_mp_76.png

下载后解压,main 目录里面的是后端代码,vue 目录里面的是前端代码

ruoyi_mp_80.png

将后端的相关代码,放到对应的项目内即可

ruoyi_mp_81.png

我这边是放在 ruoyi-system 项目内

ruoyi_mp_82.png

这里需要注意 businesscontroller 的代码,需要放在 ruoyi-admin 项目内

ruoyi_mp_83.png

接下来,启动项目,没报错的话,就代表生成的代码没问题了,然后添加对应的菜单配置,这里只添加了列表展示

ruoyi_mp_84.png

点开列表,数据和分页都没问题

ruoyi_mp_85.png

查询也没问题

ruoyi_mp_86.png

本博客所有内容无特殊标注均为大卷学长原创内容,复制请保留原文出处。
Built with Hugo
Theme Stack designed by Jimmy