今天,看到mybatis-plus有代码生成器的功能,可以生成controller,server,entity等各层增删改查的代码,于是实践一下,发现真的好用!用代码生成器可以极大提高写代码的效率,简直是一个神器。废话不多说,开干!
开发工具:idea
技术栈:springboot,mybatis-plus,mysql,swagger2
环境:jdk1.8
新建一个springboot工程的过程,我就不做过多描述了。建好之后,引入以下依赖
<dependencies>
<!--spring-boot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--mybatis-plus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--mybatis-plus生成器依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.0</version>
</dependency>
<!-- swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<!-- freemarker-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
代码生成器是根据数据库来生成各层文件,所以必须先创建好数据库文件,并且把表和字段的注释写上,才能在生成代码的时候生成注释,我准备下面的数据脚本
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`name` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名',
`telephone` varchar(13) NOT NULL DEFAULT '' COMMENT '手机号',
`mail` varchar(20) NOT NULL DEFAULT '' COMMENT '邮箱',
`password` varchar(40) NOT NULL DEFAULT '' COMMENT '密码',
`dept_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户所在部门的id',
`status` int(11) NOT NULL DEFAULT '1' COMMENT '状态,1:正常,0:冻结状态,2:删除',
`remark` varchar(200) DEFAULT '' COMMENT '备注',
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者',
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间',
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新者的ip地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COMMENT = '用户';
INSERT INTO `user` VALUES ('6', 'superadmin', '136698959895', '[email protected]', '123456', '2', '1', '123', 'superadmin', '2019-08-07 15:24:38', '0:0:0:0:0:0:0:1');
INSERT INTO `user` VALUES ('7', '123', '13666666', '[email protected]', '123456', '1', '1', '123', 'superadmin', '2019-08-07 15:24:56', '0:0:0:0:0:0:0:1');
创建表之后,就可以开始配置代码生成器了,具体配置如下,需要注意的是父包路径需要改成你自己的
public class CodeGenerator {
public static void main(String[] args) {
generate(null,"user");
}
private static void generate(String moduleName,String... tableNames) {
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");//获取项目根目录
gc.setOutputDir(projectPath + "/src/main/java");//设置生成文件输出路径
// gc.setOutputDir("d:/codeGen"); //自定义输出路径
gc.setActiveRecord(false);// 是否支持 AR
gc.setAuthor("yang"); //设置作者名字
gc.setFileOverride(false); //默认不覆盖,如果文件存在,将不会再生成,配置true就是覆盖
gc.setIdType(IdType.AUTO);//主键策略 自增
gc.setBaseResultMap(true); //SQL 映射文件 生成通用查询映射结果
gc.setBaseColumnList(true);//SQL 片段 生成通用查询结果列
gc.setOpen(false);//是否打开生成文件的目录
gc.setSwagger2(true); //是否加入Swagger2
//gc.setEntityName("%sEntity"); //实体命名方式 默认值:null 例如:%sEntity 生成 UserEntity
gc.setMapperName("%sMapper"); //mapper 命名方式 默认值:null 例如:%sDao 生成 UserDao
gc.setXmlName("%sMapper"); //Mapper xml 命名方式 默认值:null 例如:%sDao 生成 UserDao.xml
gc.setServiceName("%sService"); //service 命名方式 默认值:null 例如:%sBusiness 生成 UserBusiness
gc.setServiceImplName("%sServiceImpl"); //service impl 命名方式 默认值:null 例如:%sBusinessImpl 生成 UserBusinessImpl
gc.setControllerName("%sController"); //controller 命名方式 默认值:null 例如:%sAction 生成 UserAction
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/mp?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8");
// dsc.setSchemaName("public");
dsc.setDbType(DbType.MYSQL);//设置数据库类型是mysql
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.example.api");//配置父包路径
//pc.setModuleName(moduleName);//配置模块名
//设置各层的包名
pc.setMapper("mapper");
pc.setEntity("entity");
pc.setService("service");
pc.setController("controller");
//.setServiceImpl("service.impl"); 会自动生成 impl,可以不设定
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 如果模板引擎是 velocity
// String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
return projectPath + "/src/main/resources/mapper/"
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
// 配置自定义输出模板
//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
// templateConfig.setEntity("templates/entity2.java");
// templateConfig.setService();
//templateConfig.setController("templates/controller.java");这是自定义Controller模板
templateConfig.setXml(null);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);//设置命名规则 underline_to_camel 底线变驼峰
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//设置设置列命名 underline_to_camel 底线变驼峰
//strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");//设置继承类
strategy.setEntityLombokModel(true);//是否加入lombok
strategy.setRestControllerStyle(true);//是否是RestController风格
//strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");//设置继承类
strategy.setInclude(tableNames);//设置表名
//strategy.setSuperEntityColumns("id");//设置超级列
strategy.setControllerMappingHyphenStyle(true);//设置controller映射联字符
//strategy.setTablePrefix(pc.getModuleName() + "_");//表的前缀
// 生成配置
AutoGenerator mpg = new AutoGenerator();//代码生成器
mpg.setCfg(cfg);//加入自定义配置
mpg.setTemplate(templateConfig);//加入配置模板
mpg.setGlobalConfig(gc);//加入全局配置
mpg.setDataSource(dsc);//加入数据源配置
mpg.setPackageInfo(pc);//加入包配置
mpg.setStrategy(strategy);//加入策略配置
// 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();//提交生成代码
}
}
然后,直接运行上面的mian方法,就可以在项目的根路径生成各层的文件了!下面集成Swagger2,看生成的代码是不是好使的!
Swagger2的依赖在上面已经一起引入了,Swagger2的具体配置如下:
@Configuration //springboot 配置类注解
@EnableSwagger2//启用Swagger2注解
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.api.controller"))//这里写的是controller类所在包名
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("springboot利用swagger构建api文档")//标题内容
.description("简单优雅的restful风格")//描述信息
.termsOfServiceUrl("https://blog.csdn.net/weixin_43817709/article/details/103604070")
.version("1.0")//版本信息
.build();
}
}
接下来,打开生成的UserController,写controller类增删改查的代码,具体代码如下:
@Api(tags = "用户管理相关接口")
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;
@ApiOperation("根据url的id来获取用户的详细信息")
@ApiImplicitParam(name = "id", value = "用户ID", dataType = "Integer", paramType = "path")
@GetMapping("/{id}")
public AjaxResult getOneById(@PathVariable Integer id){
return AjaxResult.success(userService.getById(id));
}
@ApiOperation("添加用户")
@ApiImplicitParam(name = "user", value = "用户实体", dataType="User",required = true)
@PostMapping
public AjaxResult add(@RequestBody User user){
if(userService.save(user)){
return AjaxResult.success();
}
return AjaxResult.error();
}
@ApiOperation("修改用户")
@ApiImplicitParam(name = "user", value = "用户实体", dataType="User",required = true)
@PutMapping
public AjaxResult update(@RequestBody User user){
if(userService.saveOrUpdate(user)){
return AjaxResult.success();
}
return AjaxResult.error();
}
@ApiOperation("查询用户列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "page",defaultValue = "1",value = "页码",dataType = "Integer"),
@ApiImplicitParam(name = "pageSize",defaultValue = "10",value = "每页数量",dataType = "Integer"),
@ApiImplicitParam(name = "name", required = false,value = "用户名",dataType = "String")
})
@GetMapping
public AjaxResult list(@RequestParam(value = "page",defaultValue = "1") int page,
@RequestParam(value = "pageSize",defaultValue = "10") int pageSize,
@RequestParam(value = "name",required = false)String name){
Page<User> pages = new Page<>(page, pageSize);
QueryWrapper<User> wrapper=new QueryWrapper<>();
if(!StringUtils.isEmpty(name)){
wrapper.like("name", name);
}
return AjaxResult.success(userService.page(pages, wrapper));
}
@ApiOperation("根据url的id来删除用户")
@ApiImplicitParam(name = "id", value = "用户ID", dataType = "Integer",paramType = "path")
@DeleteMapping("/{id}")
public AjaxResult delete(@PathVariable Integer id){
if(userService.removeById(id)){
return AjaxResult.success();
}
return AjaxResult.error();
}
}
controller常用注解:
@Api:注解controller,tags 描述controller
@AiOperation:注解方法,value为简要描述,notes为全面描述,hidden=true Swagger将不显示该方法,默认为false
@ApiImplicitParams 里可以写多个ApiImplicitParam
@ApiImplicitParam:注解参数,hidden=true Swagger参数列表将不显示该参数,name对应参数名,value为注释,defaultValue设置默认值,allowableValues设置范围值,required设置参数是否必须,默认为false
@ApiIgnore:注解类、参数、方法,注解后将不在Swagger 页面中显示出来
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="User对象", description="用户")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "用户id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "用户名")
private String name;
@ApiModelProperty(value = "手机号")
private String telephone;
@ApiModelProperty(value = "邮箱")
private String mail;
@ApiModelProperty(value = "加密后的密码")
private String password;
@ApiModelProperty(value = "用户所在部门的id")
private Integer deptId;
@ApiModelProperty(value = "状态,1:正常,0:冻结状态,2:删除")
private Integer status;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "操作者")
private String operator;
@ApiModelProperty(value = "最后一次更新时间")
private LocalDateTime operateTime;
@ApiModelProperty(value = "最后一次更新者的ip地址")
private String operateIp;
}
Model常用注解:
@ApiModel:注解Model
@ApiModelProperty:注解Model下的属性,当前端传过来的是一个对象时swagger中该对象的属性注解就是ApiModelProperty中的value
启动项目,在浏览器输入http://localhost:9000/swagger-ui.html#,就可以访问swagger页面,如下
这里只演示查询方法,点击try it out,输入id,然后excute,可以下放把查结果查询出来,说明生成的代码可以用
最后,以上就springboot整合mybatis-plus和swagger2,实现简单的增删改查,并配置了代码生成器的教程。更多具体的增删改查方法,可以去mybatis-plus官网查看。
demo下载地址