【记录一下springboot项目的一些整合】springboot+mybatisplus pagehelper swagger2

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


记录一下springboot项目的一些整合

springboot+mybatisplus pagehelper swagger2
项目结构
在这里插入图片描述


一、搭建springboot项目 mybatisplus 整合

springboot+mybatisplus

(1)新建一个项目

在这里插入图片描述在这里插入图片描述` 如果没有这一项的话添加一个插件重启idea就可以了
在这里插入图片描述

设置项目名等信息
在这里插入图片描述点击next 添加相关依赖
在这里插入图片描述
点击next 设置项目存放地址
然后就有了一个初步的springboot项目
目录结构

如果出现spring.io time out 的问题在第二张图那里设置
在这里插入图片描述

(2) .修改pom文件

我用的版本是2.4.3

添加会用到的依赖

下面展示一些 内联代码片

<!-- MySQL连接 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
		</dependency>
		<!--mybatis-plus依赖-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.3.0</version>
		</dependency>
		<!--mybatis-plus代码生成器依赖-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-generator</artifactId>
			<version>3.3.0</version>
		</dependency>
		<!--引入freemarker,自动生成代码的时候会用到-->
		<dependency>
			<groupId>org.freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>2.3.30</version>
		</dependency>

最后的pom文件

下面展示一些 内联代码片

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo1</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- MySQL连接 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
    </dependency>
    <!--mybatis-plus依赖-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.0</version>
    </dependency>
    <!--mybatis-plus代码生成器依赖-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.3.0</version>
    </dependency>
    <!--引入freemarker,自动生成代码的时候会用到-->
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.30</version>
    </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
(2)新建一个application.yml文件
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/demo1?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=UTC
    username: root
    password: root

mybatis-plus:
  mapper-locations: classpath*:/mybatis/mapper/**Mapper.xml

mysql 6以后用的 com.mysql.cj.jdbc.Driver 如果是mysql5的话 com.mysql.jdbc.Driver 就可以 我用的mysql8 所以用前者

(3)、配置mapper扫描

![在这里插入图片描述](https://img-blog.csdnimg.cn/06e72bf680ed466381d0b6543ff6c2e2.png在这里插入图片描述

(4)、代码生成类

CodeGeneratorUtil

package com.example.demo.util;

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;

/**
 * @Description 代码生成器工具类
 *    详细可参考官方文档:https://mp.baomidou.com/guide/generator.html#%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B
 * @Author sweet
 * @Date  2022/6/4
 * @Vesrion v1.0
 **/
public class CodeGeneratorUtil {

    public static final String DB_URL = "jdbc:mysql://localhost:3306/meeting?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=UTC";
    public static final String DB_DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
    public static final String BASE_PACKAGE_PATH = "com.example.demo";

    /**
     * Description: 窗口获取信息
     * @Author: sweet
     * @Param: [tip]
     * @Return: java.lang.String
     */
    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.isNotEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    /**
     * Description: 执行生成代码
     * @Author: sweet
     * @Param: []
     * @Return: void
     */
    public static void execute() {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");  // 获取当前项目路径
        gc.setOutputDir(projectPath + "/src/main/java");      // 设置基础包路径
        gc.setAuthor("sweet");                                  // Mapper,Service等类注解中显示创建人信息
        gc.setOpen(false);                                    // 文件生成完毕后,是否需要打开所在路径
//        gc.setSwagger2(true);                               // 实体属性 Swagger2 注解
//        gc.setBaseColumnList(true);                         // 在Mapper.xml文件中是否生成公用SQL代码段
//        gc.setBaseResultMap(true);                          // 在Mapper.xml文件中是否生成公用返回集合ResultMap
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl(CodeGeneratorUtil.DB_URL);
        // dsc.setSchemaName("public");
        dsc.setDriverName(CodeGeneratorUtil.DB_DRIVER_NAME);
        dsc.setUsername("root");
        dsc.setPassword("123456");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
//        pc.setModuleName(scanner("模块名"));   // 模块名称
        pc.setParent(CodeGeneratorUtil.BASE_PACKAGE_PATH);           // 基础包路径
        mpg.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/mybatis/mapper/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        /*
        cfg.setFileCreate(new IFileCreate() {
            @Override
            public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
                // 判断自定义文件夹是否需要创建
                checkDir("调用默认方法创建的目录,自定义目录用");
                if (fileType == FileType.MAPPER) {
                    // 已经生成 mapper 文件判断存在,不想重新生成返回 false
                    return !new File(filePath).exists();
                }
                // 允许生成模板文件
                return true;
            }
        });
        */
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);
        mpg.setTemplate(new TemplateConfig().setXml(null));

        // 策略配置,具体配置可查看官方文档:
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);          // Entity文件名称命名规范
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);    // Entity字段名称
        strategy.setRestControllerStyle(true);                          // Controller注解使用是否RestController标注,否则是否开启使用Controller标注
//        strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");  // Entity的公共父类
        strategy.setEntityLombokModel(true);                            // 是否使用lombok完成Entity实体标注Getting Setting ToString 方法
        strategy.setControllerMappingHyphenStyle(true);                 // Controller注解名称,不使用驼峰,使用连字符
//        strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");   // controller公共父类
        strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
//        strategy.setTablePrefix(pc.getModuleName() + "_");              // 表前缀,添加该表示,则生成的实体,不会有表前缀,比如sys_dept 生成就是Dept
//        strategy.setFieldPrefix("sys_");                              // 字段前缀
        mpg.setStrategy(strategy);
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());          // 用的是freeemarker模板引擎
        mpg.execute();
    }

    public static void main(String[] args) {
        execute();
    }
}

在类中配置数据库地址 然后main方法运行 控制台输入表名
在这里插入图片描述在这里插入图片描述这是最后的目录结构

(5)、测试

在这里插入图片描述端口号默认8080 想要修改的话在yml文件修改

在这里插入图片描述浏览器输入 http://localhost:8080/guest/test
在这里插入图片描述到这里一些框架就可以用了 接下来是一些比较小的点 例如 主键生成实现创建时间、更新时间自动添加 分页

(6)主键生成

@TableId(value = “id”, type = IdType.UUID)
我数据库设置的主键是char 32
在这里插入图片描述 @TableId(value = “id”,type= IdType.AUTO)
也可以设置自增的 数据库是int 或者bigint类型的 设置自增 不然会失效
@TableId(value = “id”,type= IdType.ID_WORKER)
实体用long类型 数据库用bigint

(7)实现创建时间、更新时间自动添加

1 在实体相关属性上加注解

数据库
在这里插入图片描述
实体
@TableField(fill = FieldFill.INSERT, value = “create_at”)
在这里插入图片描述

2 添加配置类 CustomMetaObjectHandler

package com.example.demo.common;


import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * 填充类
 */
@Component
public class CustomMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        if (metaObject.hasGetter("createAt")) {
            this.setFieldValByName("createAt", LocalDateTime.now(), metaObject);
        }

        if (metaObject.hasGetter("updateAt")) {
            this.setFieldValByName("updateAt", LocalDateTime.now(), metaObject);
        }

        this.strictInsertFill(metaObject, "build", Boolean.class, Boolean.FALSE);
        this.strictInsertFill(metaObject, "enable", Boolean.class, Boolean.TRUE);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        if (metaObject.hasGetter("updateAt")) {
            this.setFieldValByName("updateAt",LocalDateTime.now(), metaObject);
        }
    }
}



这些设置好以后新增与更新的时候时间就会自动更新不需要再单独设置了

二、整合pagehelper

(1)导入依赖

	<!-- 分页 -->
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>1.3.0</version>
		</dependency>
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper</artifactId>
			<version>5.1.0</version>
		</dependency>

(2)application.yml 配置pagehelper插件

#pagehelper分页配置
pagehelper:
  helperDialect: mysql          #分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。
  reasonable: true              #分页合理化参数,默认值为falsesupportMethodsArguments: true #支持通过 Mapper 接口参数来传递分页参数,默认值false
  params: count=countSql        #增加了该参数来配置参数映射,用于从对象中根据属性名取值。

(3)分页用法

![在这里插入图片描述](https://img-blog.csdnimg.cn/b676a9007a69427d9c8a0ddb561dd0df.pngpageinfo相关的参数
转载:谔定靴 https://blog.csdn.net/qq_42734859/article/details/81502384

在这里插入图片描述

二、整合swagger2+Knife4j 因为这个是几种方法里面最好看的

(1)导入依赖

  <!-- swagger相关依赖 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>io.swagger</groupId>
                    <artifactId>swagger-annotations</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.swagger</groupId>
                    <artifactId>swagger-models</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.21</version>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-models</artifactId>
            <version>1.5.21</version>
        </dependency>


        <!--整合Knife4j-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0</version>
        </dependency>
    </dependencies>

可以使用这些版本最好用这些版本 springfox-swagger 2.9.2 内置的swagger-models1.5.20 会引起Long类型格式转换异常

java.lang.NumberFormatException: For input string: ""
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_181]
	at java.lang.Long.parseLong(Long.java:601) ~[na:1.8.0_181]
	at java.lang.Long.valueOf(Long.java:803) ~[na:1.8.0_181]
	at io.swagger.models.parameters.AbstractSerializableParameter.getExample(AbstractSerializableParameter.java:412) ~[swagger-models-1.5.20.jar:1.5.20]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181]

类似上面的报错信息 可以正常使用 但是控制台会有一些报错信息

(2)swagger配置类 Swagger2Config

package com.example.demo.config;

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
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.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

/**
 * @Author: liudf
 * @Date: 2020/10/28 14:09
 * @DESC: Swagger2API文档的配置
 **/
@Configuration
//@EnableSwagger2
@EnableKnife4j
public class Swagger2Config {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                // 指定构建api文档的详细信息的方法:apiInfo()
                .apiInfo(apiInfo())
                .select()
                // 指定要生成api接口的包路径,这里把controller作为包路径,生成controller中的所有接口
                .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                // 设置页面标题
                .title("demo")
                // 设置接口描述
                .description("demoApi")
                // 设置联系方式
                .contact(new Contact("dfliu", null, "dfliu@163.com"))
                // 设置版本
                .version("1.0")
                .build();
    }
}

(3)浏览器访问 http://localhost:8080/doc.html#/home

在这里插入图片描述

这个页面是不是就很好看

(5)使用swagger注解

![在这里插入图片描述](https://img-blog.csdnimg.cn/06fa9e580a6046708561264620e9b170.png标注的地方一定要大些 不然会报错 还有ApiImplicitParam 里面的参数与入参也要对应 不然文档访问会出错
在这里插入图片描述实体的一些注解在这里插入图片描述体现在这里
在这里插入图片描述在这里插入图片描述
在这里插入图片描述更多的用法可以去官网看看

三、统一接口返回类R

package com.baidu.polycom.commom.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.HashMap;
import java.util.Map;

//统一返回结果的类
@Data
@ApiModel
public class R {

   // @ApiModelProperty(value = "是否成功")
   // private Boolean success;

    @ApiModelProperty(value = "返回码")
    private Integer code;

    @ApiModelProperty(value = "返回消息")
    private String message;

    @ApiModelProperty(value = "返回数据")
    private Map<String, Object> data = new HashMap<String, Object>();

    //把构造方法私有   不让别人new该类
    private R() {}
    //实现链式编程
    //R.ok().code().message().data();

    //成功静态方法
    public static R ok() {
        R r = new R();
      //  r.setSuccess(true);
        r.setCode(ResultCode.SUCCESS);
        r.setMessage("成功");
        return r;
    }

    //失败静态方法
    public static R error() {
        R r = new R();
     //   r.setSuccess(false);
        r.setCode(ResultCode.ERROR);
        r.setMessage("失败");
        return r;
    }

    public R success(Boolean success){
      //  this.setSuccess(success);
        return this;   //返回this  实现链式编程
    }

    //实现链式编程
    //R.ok().code().message().data();
    
    public R message(String message){
        this.setMessage(message);
        return this;
    }

    public R code(Integer code){
        this.setCode(code);
        return this;
    }

    public R data(String key, Object value){
        this.data.put(key, value);
        return this;
    }

    public R data(String key, Object value,String key2, Object value2){
        this.data.put(key, value);
        this.data.put(key2, value2);
        return this;
    }
    public R data(Map<String, Object> map){
        this.setData(map);
        return this;
    }
}


package com.baidu.polycom.commom.vo;

public interface ResultCode {
    public static Integer SUCCESS = 0;
    public static Integer ERROR = 201;
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/4f7ddd572dc4460fbec8a88a624c5ce5.png)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值