# 常规整合
# 1.项目创建
注意:如果是要求jsp+servlet,请参考:https://www.cnblogs.com/LittleHann/p/17777980.html
创建maven项目,修改pom,继承springboot依赖
<parent>
<artifactId>spring-boot-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.3.0.RELEASE</version>
</parent>
# 指定远程资源库:
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
# 2.整合MP
依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
配置:
spring:
datasource:
username: root
password: xxxx
url: jdbc:mysql://127.0.0.1:3306/xxx?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
# 扫描实体类
typeAliasesPackage: com.xxx.xxx.entity
configuration:
map-underscore-to-camel-case: true
auto-mapping-behavior: FULL
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 指定mapper文件的位置
mapper-locations:
classpath*:mapper/*.xml
开启分页:
package com.xxx.readverse.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 向MyBatis-Plus的过滤器链中添加分页拦截器,需要设置数据库类型(主要用于分页方言)
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
案例:
@GetMapping("/page/list")
@ApiOperation("分类-分页列表")
@ResponseBody
public SaResult getNovelCategoriesByPage(@RequestParam("page") Integer page, @RequestParam("keyword") String keyword) {
Page<Category> pages = new Page<>(page, 5); // 每页显示5条记录
QueryWrapper<Category> queryWrapper = new QueryWrapper<>();
// 可以根据需要添加其他查询条件,例如关键字搜索
queryWrapper.like("category_name", keyword);
IPage<Category> categoryPage = novelCategoryService.page(pages, queryWrapper);
return SaResult.data(categoryPage);
}
# 3.整合测试
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
用法:
@SpringBootTest(classes = SimsApplication.class)
@RunWith(SpringRunner.class)
public class Demo {
@Test
public void test1(){
//test: xxxxxxxxxxxxxx
}
}
# 4.整合web
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
用法:
@RestController
@RequestMapping("/xxxx")
public class xxxxController {
// xxxxx
}
# 5.代码生成
依赖:
<!-- 代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
用法:
static void generate() {
FastAutoGenerator.create("jdbc:mysql://localhost:3306/xxx?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai", "root", "root")
.globalConfig(builder -> {
builder.outputDir("G:\\gitee\\xxx\\src\\main\\java"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.xxx.xxx") // 设置xxx父包名
.moduleName("xxx") // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, "G:\\gitee\\xxxx\\src\\main\\resources\\mapper")); // 设置mapperXml生成路径
})
.strategyConfig(builder -> {
builder.entityBuilder().enableLombok();
builder.mapperBuilder().enableMapperAnnotation().build();
builder.controllerBuilder().enableHyphenStyle() // 开启驼峰转连字符
.enableRestStyle(); // 开启生成@RestController 控制器
builder.addInclude("xxx") // 设置需要生成的表名
.addTablePrefix(""); // 设置过滤表前缀
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
# 6.接口文档
依赖:
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.2</version> <!-- 替换为最新版本 -->
</dependency>
配置:
package com.lys.sims.config;
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
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;
@Configuration
@EnableSwagger2
public class SwaggerConfig2 {
// 创建Docket存入容器,Docket代表一个接口文档
@Bean
public Docket webApiConfig(){
return new Docket(DocumentationType.SWAGGER_2)
// 创建接口文档的具体信息
.apiInfo(webApiInfo())
// 创建选择器,控制哪些接口被加入文档
.select()
// 指定@ApiOperation标注的接口被加入文档
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.build();
}
// 创建接口文档的具体信息,会显示在接口文档页面中
private ApiInfo webApiInfo(){
return new ApiInfoBuilder()
// 文档标题
.title("xxxx系统接口文档")
// 文档描述
.description("本文档描述了xxxx信息管理系统的接口定义")
// 版本
.version("1.0")
// 联系人信息
.contact(new Contact("程序员小李", "http://xxxxx.gitee.io", "xxxx@163.com"))
// 版权
.license("")
// 版权地址
.build();
}
}
访问:
http://localhost:{port}/doc.html
WARNING
如果接入权限认证相关,注意放行路径,如:
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册 Sa-Token 拦截器,打开注解式鉴权功能
registry.addInterceptor(new SaInterceptor()).
addPathPatterns("/**").excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v3/api-docs/**", "/swagger-ui.html/**"
,"/doc.html/**","/error","/favicon.ico","doc.html", "/static/**"
);
}
# 7.代码简写
依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
用法:
@Getter
@Setter
@TableName("score")
public class Score implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private Integer studentId;
private Integer courseId;
private Integer score;
}
# 8.整合thymeleaf
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
配置:
spring:
thymeleaf:
cache: false
enabled: true
prefix: classpath:/templates/
suffix: .html
encoding: UTF-8
mode: HTML
备注:注意thymeleaf语法