Springboot整合MyBatisPlus swagger测试

简介: Springboot整合MyBatisPlus swagger测试

介绍:

本篇我们介绍一下Springboot整合MyBatisPlus后台相对比较完整的代码,以swager来进行测试。

主要依赖

   <!--mybatis-plus-->

   <dependency>

     <groupId>com.baomidou</groupId>

     <artifactId>mybatis-plus-boot-starter</artifactId>

     <version>3.3.1</version>

   </dependency>

   <!--freemarker-->

   <dependency>

     <groupId>org.freemarker</groupId>

     <artifactId>freemarker</artifactId>

     <version>2.3.30</version>

   </dependency>

   <!--代码生成器-->

   <dependency>

     <groupId>com.baomidou</groupId>

     <artifactId>mybatis-plus-generator</artifactId>

     <version>3.4.1</version>

   </dependency>

   <!--swagger-->

   <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>

代码生成器代码

public class CodeGenerator {

   /**

    * <p>

    * 读取控制台内容

    * </p>

    */

   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 mpg = new AutoGenerator();

       // 全局配置

       GlobalConfig gc = new GlobalConfig();

       String projectPath = System.getProperty("user.dir");

       gc.setOutputDir(projectPath + "/src/main/java");

       gc.setAuthor("elite");

       gc.setOpen(false);

       // gc.setSwagger2(true); 实体属性 Swagger2 注解

       mpg.setGlobalConfig(gc);

       // 数据源配置

       DataSourceConfig dsc = new DataSourceConfig();

       dsc.setUrl("jdbc:mysql://数据库ip:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8");

       // dsc.setSchemaName("public");

       dsc.setDriverName("com.mysql.jdbc.Driver");

       dsc.setUsername("root");

       dsc.setPassword("123456");

       mpg.setDataSource(dsc);

       // 包配置

       PackageConfig pc = new PackageConfig();

       pc.setModuleName(scanner("模块名"));

       pc.setParent("com.elite");

       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/mapper/" + pc.getModuleName()

                       + "/" + 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);

       // 配置模板

       TemplateConfig templateConfig = new TemplateConfig();

       // 配置自定义输出模板

       //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别

       // templateConfig.setEntity("templates/entity2.java");

       // templateConfig.setService();

       // templateConfig.setController();

       templateConfig.setXml(null);

       mpg.setTemplate(templateConfig);

       // 策略配置

       StrategyConfig strategy = new StrategyConfig();

       strategy.setNaming(NamingStrategy.underline_to_camel);

       strategy.setColumnNaming(NamingStrategy.underline_to_camel);

       //strategy.setSuperEntityClass("BaseEntity");

       strategy.setEntityLombokModel(true);

       strategy.setRestControllerStyle(true);

       // 公共父类

       //strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");

       // 写于父类中的公共字段

       //strategy.setSuperEntityColumns("id");

       //strategy.setSuperEntityColumns("id");

       //strategy.setSuperEntityColumns("id");

       //strategy.setSuperEntityColumns("id");

       strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));

       strategy.setControllerMappingHyphenStyle(true);

       strategy.setTablePrefix(pc.getModuleName() + "_");

       mpg.setStrategy(strategy);

       mpg.setTemplateEngine(new FreemarkerTemplateEngine());

       mpg.execute();

   }

}

执行代码生成器,系统会自动生成controller,service以及mapper。mybatisplus提供了部分封装好的方法。

service层

/**

* <p>

* 订单表 服务类

* </p>

*

* @author elite

* @since 2022-08-22

*/

public interface IOrderService extends IService<Order> {

}

/**

* <p>

* 订单表 服务实现类

* </p>

*

* @author elite

* @since 2022-08-22

*/

@Service

public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {

}

mapper

/**

* <p>

* 订单表 Mapper 接口

* </p>

*

* @author elite

* @since 2022-08-22

*/

public interface OrderMapper extends BaseMapper<Order> {

}

controller

/**

* <p>

* 订单表 前端控制器

* </p>

*

* @author elite

* @since 2022-08-22

*/

@RestController

@RequestMapping("/springboot/order")

@Api(tags = "订单接口")

public class OrderController {

   @Autowired

   IOrderService orderService;

   /**

    * 获取订单列表

    */

   @ApiOperation(value = "获取订单列表")

   @GetMapping("/getOrderList")

   public R getOrderList(){

       List<Order> orderList = orderService.list();

       return R.ok(orderList);

   }

   /**

    * 分页获取订单列表

    */

   @ApiOperation(value = "分页获取订单列表")

   @PostMapping("/getOrderListByPage/{currentPage}/{PageSize}")

   public R getOrderListPage(@PathVariable("currentPage")Integer currentPage,

                             @PathVariable("PageSize") Integer PageSize,

                             @RequestBody Order order){

       QueryWrapper<Order> queryWrapper = new QueryWrapper<>();

       IPage<Order> page = new Page<>();

       page.setCurrent(currentPage);

       page.setSize(PageSize);

       //订单ID

       //queryWrapper.eq("order_id",order.getOrderId());

      queryWrapper.eq("order_no",order.getOrderNo());

       IPage<Order> Orders = orderService.page(page, queryWrapper);

       return R.ok(Orders);

   }

   /**

    * 通过订单ID获取订单信息

    */

   @ApiOperation(value = "通过订单ID获取订单信息")

   @GetMapping("/getOrderById/{order_id}")

   public R getOrderById(@PathVariable("order_id") Integer order_id){

       Order order = orderService.getById(order_id);

       return R.ok(order);

   }

   /**

    * 保存订单信息

    */

   @ApiOperation(value = "保存订单信息")

   @PostMapping("/saveOrder")

   public R saveOrder(@RequestBody Order order){

       boolean save = orderService.save(order);

       if (save){

           return R.ok(null);

       }

       return R.fail();

   }

   /**

    * 更新订单信息

    */

   @ApiOperation(value = "更新订单信息")

   @PutMapping("/updateOrder")

   public R updateOrder(@RequestBody Order order){

       Wrapper<Order> updateWrapper = new UpdateWrapper<>();

       boolean success = orderService.update(updateWrapper);

       if (success){

           return R.ok(null);

       }

       return R.fail();

   }

   /**

    * 删除订单信息

    */

   @ApiOperation(value = "删除订单信息")

   @DeleteMapping("/delOrderById")

   public R delOrderById(@PathVariable("order_id") Integer order_id){

       boolean success = orderService.removeById(order_id);

       if (success){

           return R.ok(null);

       }

       return R.fail();

   }

}

实体类Order

**

* <p>

* 订单表

* </p>

*

* @author elite

* @since 2022-08-22

*/

@ApiModel("订单表")

@Data

@EqualsAndHashCode(callSuper = false)

@TableName("`order`")

public class Order implements Serializable {

   private static final long serialVersionUID = 1L;

   /**

    * 订单ID

    */

   @ApiModelProperty(value = "订单ID")

   @TableId(value = "order_id", type = IdType.AUTO)

   private Integer orderId;

   /**

    * 订单号

    */

   @TableField(value = "order_no")

   private Integer orderNo;

   /**

    * 产品id

    */

   @TableField(value = "product_id")

   private Integer productId;

   /**

    * 用户ID

    */

   @TableField(value = "user_id")

   private Integer userId;

   /**

    * 订单产品数量

    */

   @TableField(value = "order_num")

   private Integer orderNum;

   /**

    * 订单金额

    */

   @TableField(value = "order_amt")

   private BigDecimal orderAmt;

   /**

    * 订单状态

    */

   @TableField(value = "order_status")

   private String orderStatus;

   /**

    * 支付状态

    */

   @TableField(value = "pay_status")

   private String payStatus;

   /**

    * 创建时间

    */

   @TableField(value = "create_time")

   private LocalDateTime createTime;

   /**

    * 更新时间

    */

   @TableField(value = "update_time")

   private LocalDateTime updateTime;

   /**

    * 创建人

    */

   @TableField(value = "create_user")

   private String createUser;

   /**

    * 更新人

    */

   @TableField(value = "update_user")

   private String updateUser;

}

swagger


API Developmentfor Everyone


Simplify API development for users, teams, and enterprises with the Swagger open source and professional toolset. Find out how Swagger can help you design and document your APIs at scale.


制作API接口文档非常方便


常用的注解:


@Api:标注在一个类上


@ApiOperation :在方法上


@ApiModel :用于标注一个实体类


@ApiModelProperty:标注属性


接口文档访问地址:


http://ip地址:port/swagger-ui.html#/


分页测试

Response body

Download

{

 "code": 200,

 "msg": "成功",

 "data": {

   "records": [

     {

       "orderId": 3,

       "orderNo": 2,

       "productId": 2,

       "userId": 1,

       "orderNum": 2,

       "orderAmt": 20,

       "orderStatus": "取消下单",

       "payStatus": "未支付",

       "createTime": "2022-08-21T11:20:29",

       "updateTime": "2022-08-21T11:20:29",

       "createUser": "annotation",

       "updateUser": "annotation"

     }

   ],

   "total": 1,

   "size": 2,

   "current": 1,

   "orders": [],

   "optimizeCountSql": true,

   "hitCount": false,

   "countId": null,

   "maxLimit": null,

   "searchCount": true,

   "pages": 1

 }

}


相关文章
|
24天前
|
Java 测试技术 开发者
必学!Spring Boot 单元测试、Mock 与 TestContainer 的高效使用技巧
【10月更文挑战第18天】 在现代软件开发中,单元测试是保证代码质量的重要手段。Spring Boot提供了强大的测试支持,使得编写和运行测试变得更加简单和高效。本文将深入探讨Spring Boot的单元测试、Mock技术以及TestContainer的高效使用技巧,帮助开发者提升测试效率和代码质量。
130 2
|
1月前
|
XML Java 测试技术
【SpringBoot系列】初识Springboot并搭建测试环境
【SpringBoot系列】初识Springboot并搭建测试环境
73 0
|
1月前
|
安全 Java 数据库
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
这篇文章是关于Apache Shiro权限管理框架的详细学习指南,涵盖了Shiro的基本概念、认证与授权流程,并通过Spring Boot测试模块演示了Shiro在单应用环境下的使用,包括与IniRealm、JdbcRealm的集成以及自定义Realm的实现。
42 3
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
52 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
288 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
84 1
|
1月前
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
|
1月前
|
Java 数据库连接 mybatis
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
该文档详细介绍了如何在Springboot Web项目中整合Mybatis,包括添加依赖、使用`@MapperScan`注解配置包扫描路径等步骤。若未使用`@MapperScan`,系统会自动扫描加了`@Mapper`注解的接口;若使用了`@MapperScan`,则按指定路径扫描。文档还深入分析了相关源码,解释了不同情况下的扫描逻辑与优先级,帮助理解Mybatis在Springboot项目中的自动配置机制。
125 0
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
|
2月前
|
前端开发 Java Spring
【非降版本解决】高版本Spring boot Swagger 报错解决方案
【非降版本解决】高版本Spring boot Swagger 报错解决方案
|
2月前
|
XML Java 关系型数据库
springboot 集成 mybatis-plus 代码生成器
本文介绍了如何在Spring Boot项目中集成MyBatis-Plus代码生成器,包括导入相关依赖坐标、配置快速代码生成器以及自定义代码生成器模板的步骤和代码示例,旨在提高开发效率,快速生成Entity、Mapper、Mapper XML、Service、Controller等代码。
springboot 集成 mybatis-plus 代码生成器