Swagger 接口统一管理工具+EasyCode模板v2
【摘要】 1.模块搭建 1.sun-common下新建sun-common-swagger模块 2.修改pom.xml 不跟父模块进行耦合<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/X...
1.模块搭建
1.sun-common下新建sun-common-swagger模块
2.修改pom.xml 不跟父模块进行耦合
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 不跟父模块进行耦合 -->
<modelVersion>4.0.0</modelVersion>
<groupId>com.sunxiansheng</groupId>
<artifactId>sun-common-swagger</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
3.发现交给了sun-frame模块管理,就相当于跟common是同一层级了
4.引入swagger依赖
<dependencies>
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>
2.配置Swagger
1.编写配置类 SwaggerConfig.java
package com.sunxiansheng.swagger.config;
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;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* Description: Swagger2 配置类
* @Author sun
* @Create 2024/7/17 15:02
* @Version 1.0
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
/**
* 注入配置的对象逻辑
*
* @return
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.sunxiansheng")) // 扫描的包
.paths(PathSelectors.any())
.build();
}
/**
* 构建一个apiInfo
*
* @return
*/
public ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("sun-frame")
.contact(new Contact("孙显圣", "url地址", "sunxiansehng@gmail.com"))
.version("v1.0")
.description("开箱即用的脚手架")
.build();
}
}
2.sun-user 引入Swagger模块
<!-- swagger模块 -->
<dependency>
<groupId>com.sunxiansheng</groupId>
<artifactId>sun-common-swagger</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
3.将mapper.xml统一放到resources/mapper下管理
1.移动UserMapper.xml
2.application.yml 配置扫描
4.启动sun-user访问http://localhost:8080/swagger-ui.html
3.EasyCode模板v2(Mapper新增方法)
1.Mapper.java
## 设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.java"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/java/$!{tableInfo.savePackageName.replace('.','/')}/mapper"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
package $!{tableInfo.savePackageName}.mapper;
import $!{tableInfo.savePackageName}.entity.po.$!{tableInfo.name}Po;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* ($!{tableInfo.name})表数据库访问层
*
* @author $!{author}
* @since $!{time.currTime('yyyy-MM-dd HH:mm:ss')}
*/
public interface $!{tableInfo.name}Mapper {
/**
* 根据主键查询单条数据
*
* @param $!{pk.name} 主键
* @return 实例对象
*/
$!{tableInfo.name}Po queryById($!{pk.shortType} $!{pk.name});
/**
* 分页查询
*
* @param po 查询条件
* @param offset 偏移量:计算公式 (pageNo - 1) * pageSize
* @param pageSize 页面大小
* @return 对象列表
*/
List<$!{tableInfo.name}Po> queryPage(@Param("po") $!{tableInfo.name}Po po, @Param("offset") Integer offset, @Param("pageSize") Integer pageSize);
/**
* 根据条件查询记录
*
* @param po 查询条件
* @return 对象列表
*/
List<$!{tableInfo.name}Po> queryAllByLimit(@Param("po") $!{tableInfo.name}Po po);
/**
* 统计总行数
*
* @param po 查询条件
* @return 总行数
*/
Integer count(@Param("po") $!{tableInfo.name}Po po);
/**
* 新增数据
*
* @param po 实例对象(会封装新增的id)
* @return 影响行数
*/
int insert($!{tableInfo.name}Po po);
/**
* 批量新增数据(MyBatis原生foreach方法)
*
* @param entities 实例对象列表(会封装新增的id)
* @return 影响行数
*/
int insertBatch(@Param("entities") List<$!{tableInfo.name}Po> entities);
/**
* 批量新增或按主键更新数据(MyBatis原生foreach方法)
*
* @param entities 实例对象列表
* @return 影响行数
* @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参
*/
int insertOrUpdateBatch(@Param("entities") List<$!{tableInfo.name}Po> entities);
/**
* 根据主键修改数据
*
* @param po 实例对象
* @return 影响行数
*/
int updateById($!{tableInfo.name}Po po);
/**
* 根据主键批量更新数据
*
* @param list 实例对象列表
* @return 影响行数
*/
int updateBatchById(@Param("list") List<$!{tableInfo.name}Po> list);
/**
* 根据主键逻辑删除数据
*
* @param $!{pk.name} 主键
* @return 影响行数
*/
int logicDeleteById($!{pk.shortType} $!{pk.name});
/**
* 根据主键批量逻辑删除数据
*
* @param ids 主键列表
* @return 影响行数
*/
int logicDeleteBatchById(@Param("list") List<$!{pk.shortType}> ids);
}
2.Mapper.xml(全局变量可以指定删除和未删除的标识)
## 定义全局变量(删除和未删除的标识)
#set($deleteColumnValue = 1)
#set($notDeletedColumnValue = 0)
##引入mybatis支持
$!{mybatisSupport.vm}
##设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.xml"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
##检查是否有包含delete的字段
#set($deleteColumn = "")
#foreach($column in $tableInfo.fullColumn)
#if($column.name.contains("delete"))
#set($deleteColumn = $column.obj.name)
#end
#end
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="$!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper">
<resultMap type="$!{tableInfo.savePackageName}.entity.po.$!{tableInfo.name}Po" id="$!{tableInfo.name}Map">
<id property="$!pk.name" column="$!pk.obj.name"/>
#foreach($column in $tableInfo.fullColumn)
#if($column.name != $pk.name)
<result property="$!column.name" column="$!column.obj.name"/>
#end
#end
</resultMap>
<!--根据主键查询一条记录-->
<select id="queryById" resultMap="$!{tableInfo.name}Map">
select #allSqlColumn()
from $!{tableInfo.obj.name}
where $!pk.obj.name = #{$!pk.name}
#if($deleteColumn != "")
and $!deleteColumn = $notDeletedColumnValue
#end
</select>
<!--分页查询指定行数据-->
<select id="queryPage" resultMap="$!{tableInfo.name}Map">
select #allSqlColumn()
from $!{tableInfo.obj.name}
<where>
#foreach($column in $tableInfo.fullColumn)
<if test="po.$!column.name != null#if($column.type.equals('java.lang.String')) and po.$!column.name != ''#end">
and $!column.obj.name = #{po.$!column.name}
</if>
#end
#if($deleteColumn != "")
and $!deleteColumn = $notDeletedColumnValue
#end
</where>
limit #{offset}, #{pageSize}
</select>
<!--根据条件查询记录-->
<select id="queryAllByLimit" resultMap="$!{tableInfo.name}Map">
select #allSqlColumn()
from $!{tableInfo.obj.name}
<where>
#foreach($column in $tableInfo.fullColumn)
<if test="po.$!column.name != null#if($column.type.equals('java.lang.String')) and po.$!column.name != ''#end">
and $!column.obj.name = #{po.$!column.name}
</if>
#end
#if($deleteColumn != "")
and $!deleteColumn = $notDeletedColumnValue
#end
</where>
</select>
<!--根据条件统计总行数-->
<select id="count" resultType="java.lang.Integer">
select count(1)
from $!{tableInfo.obj.name}
<where>
#foreach($column in $tableInfo.fullColumn)
<if test="po.$!column.name != null#if($column.type.equals('java.lang.String')) and po.$!column.name != ''#end">
and $!column.obj.name = #{po.$!column.name}
</if>
#end
#if($deleteColumn != "")
and $!deleteColumn = $notDeletedColumnValue
#end
</where>
</select>
<!--新增一条记录-->
<insert id="insert" keyProperty="$!pk.name" useGeneratedKeys="true">
insert into $!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($foreach.hasNext), #end#end)
values (#foreach($column in $tableInfo.otherColumn)#{$!column.name}#if($foreach.hasNext), #end#end)
</insert>
<!--批量新增多条记录-->
<insert id="insertBatch" keyProperty="$!pk.name" useGeneratedKeys="true">
insert into $!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($foreach.hasNext), #end#end)
values
<foreach collection="entities" item="entity" separator=",">
(#foreach($column in $tableInfo.otherColumn)#{entity.$!column.name}#if($foreach.hasNext), #end#end)
</foreach>
</insert>
<!--插入记录,如果主键冲突,则变为更新记录-->
<insert id="insertOrUpdateBatch" keyProperty="$!pk.name" useGeneratedKeys="true">
insert into $!{tableInfo.obj.name}(id, #foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($foreach.hasNext), #end#end)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.id}, #foreach($column in $tableInfo.otherColumn)#{entity.$!column.name}#if($foreach.hasNext), #end#end)
</foreach>
on duplicate key update
#foreach($column in $tableInfo.otherColumn)
$!column.obj.name = values($!column.obj.name)#if($foreach.hasNext),#end
#end
</insert>
<!--根据主键修改数据-->
<update id="updateById">
update $!{tableInfo.obj.name}
<set>
#foreach($column in $tableInfo.otherColumn)
<if test="$!column.name != null#if($column.type.equals('java.lang.String')) and $!column.name != ''#end">
$!column.obj.name = #{$!column.name},
</if>
#end
</set>
where $!pk.obj.name = #{$!pk.name}
#if($deleteColumn != "")
and $!deleteColumn = $notDeletedColumnValue
#end
</update>
<!--根据主键批量更新记录-->
<update id="updateBatchById">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update $!{tableInfo.obj.name}
<set>
#foreach($column in $tableInfo.otherColumn)
<if test="item.$!column.name != null#if($column.type.equals('java.lang.String')) and item.$!column.name != ''#end">
$!column.obj.name = #{item.$!column.name},
</if>
#end
</set>
where $!pk.obj.name = #{item.$!pk.name}
#if($deleteColumn != "")
and $!deleteColumn = $notDeletedColumnValue
#end
</foreach>
</update>
<!--根据主键逻辑删除单个记录-->
<update id="logicDeleteById">
update $!{tableInfo.obj.name}
set $!deleteColumn = $deleteColumnValue
where $!pk.obj.name = #{$!pk.name}
#if($deleteColumn != "")
and $!deleteColumn = $notDeletedColumnValue
#end
</update>
<!--根据主键批量逻辑删除记录-->
<update id="logicDeleteBatchById">
update $!{tableInfo.obj.name}
set $!deleteColumn = $deleteColumnValue
where $!pk.obj.name in
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
#if($deleteColumn != "")
and $!deleteColumn = $notDeletedColumnValue
#end
</update>
</mapper>
4.动态配置Swagger
1.创建SwaggerInfo.java的bean存储信息
package com.sunxiansheng.swagger.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* Description: 将Swagger的配置暴露到外边
* @Author sun
* @Create 2024/7/17 15:32
* @Version 1.0
*/
@Component
@ConfigurationProperties(prefix = "swagger") // 只要在Resource文件中配置swagger的信息,就会自动set到这个对象中
public class SwaggerInfo {
private String basePackage;
private String title;
private String contactName;
private String contactUrl;
private String email;
private String version;
private String description;
// getter和setter方法(必须)
public String getBasePackage() {
return basePackage;
}
public void setBasePackage(String basePackage) {
this.basePackage = basePackage;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContactName() {
return contactName;
}
public void setContactName(String contactName) {
this.contactName = contactName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getContactUrl() {
return contactUrl;
}
public void setContactUrl(String contactUrl) {
this.contactUrl = contactUrl;
}
}
2.SwaggerConfig.java 直接从bean中获取数据
package com.sunxiansheng.swagger.config;
import com.sunxiansheng.swagger.bean.SwaggerInfo;
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;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import javax.annotation.Resource;
/**
* Description: Swagger2 配置类
* @Author sun
* @Create 2024/7/17 15:02
* @Version 1.0
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Resource
private SwaggerInfo swaggerInfo;
/**
* 注入配置的对象逻辑
*
* @return
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage(swaggerInfo.getBasePackage())) // 扫描的包
.paths(PathSelectors.any())
.build();
}
/**
* 构建一个apiInfo
*
* @return
*/
public ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title(swaggerInfo.getTitle())
.contact(new Contact(swaggerInfo.getContactName(), swaggerInfo.getContactUrl(), swaggerInfo.getEmail()))
.version(swaggerInfo.getVersion())
.description(swaggerInfo.getDescription())
.build();
}
}
3.sun-user配置application.yml
# 自定义的swagger配置
swagger:
base-package: com.sunxiansheng
title: sun-frame
contact-name: sun
contact-url: git地址
email: sunxiansehng@gmail.com
version: 1.0
description: 开箱即用的脚手架
4.使用swagger标记注解
5.重启查看
http://localhost:8080/swagger-ui.html
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)