springboot+mybatis plus+swagger-ui 整合

前言

该文主要讲述springboot整合mybatis plus(后面简称MP)的使用,mp意在简化开发,使得开发人员更注重于项目上业务逻辑、细节。在开发过程中,你会发现你的CRUD操作都会变得非常简单,还有代码生成器、分页插件等都极大成度地简化了我们的开发,事半功倍!
MP官网:https://mp.baomidou.com/
GIT地址:https://github.com/litaijie/mybatisplus.git

YML配置文件

spring:
  jpa:
    database: oracle
    show-sql: true
  datasource:
    driver-class-name: oracle.jdbc.driver.OracleDriver
    url: jdbc:oracle:thin:@127.0.0.1:1521:ORCLCDB
    username: root
    password: 123456
mybatis-plus:
  mapper-locations: classpath*:/resources/mapper/common/**Mapper.xml   #你放mapper文件的路径
  global-config:
    db-config:
      id-type: input  #全局设置使用uuid主键策略-->assign_uuid
  type-aliases-package: com.mps.mybatisplus.user.entity
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql
    jdbc-type-for-null: null  #oracle数据库必须加这个
logging:
  level:
    com.haocheng.study.springboot.mybatisplus: debug

pom文件

引入以下相关依赖(MP核心依赖、代码生成、swagger-ui等)
–>oracle驱动包:https://pan.baidu.com/s/1qI7BW_Lee8JlKgpvNYqvfA 提取码: 7ngk

<!--MP依赖-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.3.0</version>
</dependency>
<dependency>
	<groupId>com.oracle</groupId>
	<artifactId>ojdbc8</artifactId>
	<version>8.0.0</version>
</dependency>

<!--代码生成器依赖-->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-generator</artifactId>
	<version>3.3.0</version>
</dependency>
<dependency>
	<groupId>org.apache.commons</groupId>
  	<artifactId>commons-lang3</artifactId>
	<version>3.9</version>
</dependency>
 <dependency>
 	<groupId>org.springframework.boot</groupId>
  	<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

<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>
<dependency>
 	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.62</version>
</dependency>

开始配置

在主程序入口添加注解 @MapperScan

package com.mps.mybatisplus;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@SpringBootApplication
@MapperScan("com.mps.mybatisplus.*.mapper")//在主程序入口添加该依赖,value为你mapper接口所在路径
public class MybatisplusApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisplusApplication.class, args);
    }

}

好了,到了这里可以启动我们的项目试一下了。启动没问题。。
我们接下来进行代码生成,并且简单地验证一下CRUD操作。

代码生成

代码生成逻辑主要代码:

package com.mps.mybatisplus.generator;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * mp代码生成实践
 *
 * @author jackcooperz
 * @version v1.0
 * @since 2019
 */
public class Generator {

    /**
     * 读取控制台内容
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator auto = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("ken");
        gc.setOpen(false);
        // gc.setSwagger2(true); 实体属性 Swagger2 注解
        auto.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:ORCLCDB");
        // dsc.setSchemaName("public");
        dsc.setDriverName("oracle.jdbc.driver.OracleDriver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        auto.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(scanner("模块名"));
        pc.setParent("com.mps.mybatisplus");//填自己的包路径
        auto.setPackageInfo(pc);

        // 自定义配置
        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) {
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        auto.setCfg(cfg);

        // 模板配置
        TemplateConfig tmpConfig = new TemplateConfig();
        tmpConfig.setXml(null);
        auto.setTemplate(tmpConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//        strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");
//        strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        // 写于父类中的公共字段
//        strategy.setSuperEntityColumns("id");
        strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");
        auto.setStrategy(strategy);
        auto.setTemplateEngine(new FreemarkerTemplateEngine());
        auto.execute();
    }
}

现在,我们就可以开始测试生成代码—>
在这里插入图片描述
回车,生成如下代码:
在这里插入图片描述
在这里插入图片描述
是不是你熟悉的dao、service、controller代码!并且生成的代码默认继承MP的类BaseMapper、ServiceImpl<M extends BaseMapper, T> 类,这些类提供了丰富的接口,基本可以解决我们平常时遇到的CRUD操作。
到此,我们可以写几个接口试一下我们的配置是否可用了。
进入到MpsUserController类,主要代码:

package com.mps.mybatisplus.common.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mps.mybatisplus.common.entity.MpsUser;
import com.mps.mybatisplus.common.service.IMpsUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 * 员工信息 前端控制器
 * </p>
 *
 * @author ken
 * @since 2020-03-31
 */
@RestController
@RequestMapping("/common/mps-user")
@Api("员工信息")
public class MpsUserController {
    @Autowired
    private IMpsUserService iMpsUserService;

    /**
     * 保存员工信息
     * @param mpsUser
     * @return
     */
    @ApiOperation(value = "保存员工信息",notes = "--")
    @PutMapping("/save")
    public boolean save(@RequestBody MpsUser mpsUser){
        if (mpsUser==null){
            return false;
        }

        MpsUser user = null;
        if (StringUtils.isEmpty(mpsUser.getId())){
            user = MpsUser.builder()
                    .name("ltj")
                    .build();
        }else {
            user = mpsUser;
        }
        return iMpsUserService.saveOrUpdate(user);
    }

    /**
     * 删除
     * @param id
     * @return
     */
    @ApiOperation(value = "删除员工信息",notes = "--")
    @DeleteMapping("/delete")
    public boolean deleteUser(@RequestParam String id){
        return iMpsUserService.removeById(id);
    }

    /**
     * 查询列表
     * @return
     */
    @ApiOperation(value = "员工信息列表查询",notes = "--")
    @PostMapping("listUser")
    public Page<MpsUser> listUser(){
        Page<MpsUser> mpsUserPage =new Page<>(1,2);

        LambdaQueryWrapper<MpsUser> ltj = new QueryWrapper<MpsUser>().lambda()
                .eq(MpsUser::getName, "ltj");
        ltj.select(MpsUser::getName,MpsUser::getId);

        return iMpsUserService.page(mpsUserPage, ltj);
    }
}

新建分页插件的配置类,代码如下:

package com.mps.mybatisplus.config;

import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.concurrent.atomic.AtomicLong;

@Component
public class MpConfig {
   
    /**
     * 序列生成器
     */
    @Bean
    public OracleKeyGenerator oracleKeyGenerator(){
        return new OracleKeyGenerator();
    }

    /**
     * 分页插件
     * @return
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

注意!!!
我这里使用的是oracle数据库序列的主键策略,如果同学们的项目中有不一样需求的自行修改。主要是yml配置文件中修改全局主键策略(id-type属性),这样就不用每个实体去针对性的处理id字段的配置。

到此,就可以请求我们的接口,测试效果了!

后续(饭后点心)

我们上面就是描述了springboot整合MP的整个过程,讲述了MP安装、配置,代码生成以及简单的CRUD过程。这些都是我们这片文章的主食,那么30分钟过去了,消化得也差不多了吧?我们来一点小东西,是我们的饭后甜点——springboot整合swagger-ui。

新建配置类,代码如下:

package com.mps.mybatisplus.config;

import springfox.documentation.service.Contact;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class Swagger2Config {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                //为当前包路径
                .apis(RequestHandlerSelectors.basePackage("com.mps.mybatisplus"))
				.paths(PathSelectors.any())
                .build();
    }

    //构建 api文档的详细信息函数,注意这里的注解引用的是哪个
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                //页面标题
                .title("Spring Boot 使用 Swagger2 构建RESTful API")
                //创建人
                .contact(new Contact("litaijie", "--", ""))
                //版本号
                .version("1.0")
                //描述
                .description("API 描述")
                .build();
    }
}

接下来就可以访问我们的swagger-ui页面进行接口服务调用:http://localhost:8080/swagger-ui.html

测试结果

新加员工:
在这里插入图片描述
结果:
在这里插入图片描述
查询员工列表:
在这里插入图片描述

这篇文章总结到这里,后续会详细介绍MP的使用细节,如:条件构造器。
感谢大家阅读!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值