springboot整合mybatis-plus和swagger2,实现简单的增删改查和mybatis-plus的代码生成器的使用教程

前言

今天,看到mybatis-plus有代码生成器的功能,可以生成controller,server,entity等各层增删改查的代码,于是实践一下,发现真的好用!用代码生成器可以极大提高写代码的效率,简直是一个神器。废话不多说,开干!

使用的工具和技术栈

开发工具:idea
技术栈:springboot,mybatis-plus,mysql,swagger2
环境:jdk1.8

新建一个springboot工程

新建一个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的依赖在上面已经一起引入了,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();
    }
}

controller

接下来,打开生成的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下载地址

demo下载地址

发布了14 篇原创文章 · 获赞 6 · 访问量 6325

猜你喜欢

转载自blog.csdn.net/weixin_43817709/article/details/103604070