序言
之前使用的spring-boot架构,采用了MyBatis-Generator的代码生成工具,现在的公司使用spring架构,采用了Swagger-Codegen的代码生成工具,下面就来对比一下这两个代码自动生成工具。
MyBatis-Generator
介绍
MyBatis Generator 是 MyBatis 的代码生成器。它可以为任何版本的 MyBatis 生成代码。它将内省一个数据库表(或多个表)并生成可用于访问数据库表。这减少了设置对象和配置文件以与数据库表交互的初始化工作量。它试图对大量简单的 CRUD(创建、检索、更新、删除)的数据库操作产生重大影响。
根据它的配置方式,MyBatis Generator 可能会生成
与表结构匹配的 Java 或 Kotlin 类:
- 匹配表主键的类(如果有主键)
- 匹配表的非主键字段的类(BLOB 字段除外)
- 一个包含表的 BLOB 字段的类(如果表有 BLOB 字段)
- 启用动态选择、更新和删除的类
这些类之间有适当的继承关系。请注意,生成器可以配置为
生成不同类型的 POJO 层次结构 - 例如,如果您愿意,您可以选择为每个表生成单个域对象。在某些情况下,MBG 会生成 MyBatis3 Compatible SQL Map XML Files。MBG 为配置中的每个表上的简单 CRUD 函数生成 SQL。生成的 SQL 语句包括:
- insert
- update by primary key
- update by example (using a dynamic where clause)
- delete by primary key
- delete by example (using a dynamic where clause)
- select by primary key
- select by example (using a dynamic where clause)
- count by example
适当使用上述对象的 Java 或 Kotlin 客户端类、接口和 Kotlin 扩展方法。客户端类的生成是可选的。MBG 将生成一个与 MyBatis 3.x 映射器基础设施配合使用的映射器接口。
依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
IDEA生成代码过程
写一个代码生成类,建立数据库连接,com.baomidou.mybatisplus.generator.AutoGenerator对象获取全局配置、数据库配置等信息,执行execute方法自动生成代码,如下,
- model文件夹中包含数据库表对应的实体类(数据库字段与实体类成员一一对应),或者称之为域模型。
- mapper文件夹中包含mapper接口和mapper.xml映射文件,mybatis通过JDK动态代理生成实现类完成SqlSession对象SQL语句执行。
- service文件夹中有实体类对应的服务类接口和服务实现类,具体提供的服务类接口由我们自己实现。
- web文件夹中的类提供可以访问的http接口。
上面的四个文件夹是在给AutoGenerator对象注入PackageConfig信息时写的输出文件夹包路径,model中的java文件放在Model层(数据访问层),mapper中的java文件放在DAO层(数据持久层),servcie中的java文件放在service层(业务逻辑层),web中的java文件放在controller层(控制层)。
MyBatis的mapper参数传递#{}和${}区别:
- #{} 实现的是sql语句的预处理参数,之后执行sql中用?号代替,使用时不需要关注数据类型,Mybatis自动实现数据类型的转换。并且可以防止SQL注入。
- ${} 实现是sql语句的直接拼接,不做数据类型转换,需要自行判断数据类型。不能防止SQL注入。
另外,对实体类/域模型我们还可以做一些操作:
- 添加@Data在实体类上,编译时自动生成各个成员变量的get、set方法。
- 添加@NoArgsConstructor、@AllArgsConstructor在实体类上,编译时自动生成无参和全部参数的构造方法。
- 添加@Builder在实体类上,通过建造者设计模式简化对象实例化时添加属性值。
- 添加@Pattern(regexp="")在成员变量上,通过正则表达式限制成员变量属性值。
前几个注解是lombok包下的注解,最后一个validation包下的注解。
如下图,springboot编译生成的文件都在target目录下,lombok的注解直接帮忙生成了上面那些方法。
Swagger-CodeGen
介绍
swagger-codegen 包含一个模板驱动的引擎,通过解析 OpenAPI / Swagger 定义来生成不同语言的文档、API 客户端和服务器存根。
代码生成过程
swagger-codegen可以很简单的生成服务端的代码。举个例子,
1、首先我们在下面的网页下载swagger-codegen客户端:
https://oss.sonatype.org/content/repositories/releases/io/swagger/swagger-codegen-cli/2.2.1/swagger-codegen-cli-2.2.1.jar
2、任何服务器对外开放使用swagger-ui的页面:https://petstore.swagger.io/,它开放的接口的json文件是https://petstore.swagger.io/v2/swagger.json,记录下服务器端的json文件url。
3、在下好的jar包目录下输入命令 java -jar swagger-codegen-cli-2.2.1.jar generate -i https://petstore.swagger.io/v2/swagger.json -l java -o samples/client/pestore/java
则会把该json文件进行解析编译再写到-o后指定的文件路径。
4、最后输出的文件如下,里面包含API、Model等,这里是由于没有把一些依赖引入,
总结
MyBatis-Generator和Swagger-Codegen各有优点,个人还是比较习惯使用前者,后者可以从服务端通过json文件解析并生成域模型、接口等。对于后者目前还不太了解,只是知道怎么用,不好评判谁好谁坏。
参考链接:
1、http://mybatis.org/generator/
2、https://swagger.io/docs/open-source-tools/swagger-codegen/