学习目标
- 多环境配置文件、日志配置
- 数据校验
- 异常处理
- 过滤器和拦截器
- 响应结果封装
- 格式化转换器
学习阶段(二)
- 整合mybatis实现增删查改
- 分页查询插件pagehelper
- 整合shiro
shiro介绍(一)
SpringBoot2.0集成Shiro
springBoot整合shiro
Spring Boot整合Shiro
spring boot + mybatis + layui + shiro后台权限管理系统
pom依赖
<dependencies>
<!-- web启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!-- 热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok 自动生成Getter&Setter、toString()、构造函数 尽量不使用lombok
还要Idea安装lombok插件
-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 分页查询插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.0</version>
</dependency>
<!--测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
yml配置
server:
port: 8888
spring:
#数据库连接,注意修改数据库名和密码
datasource:
url: jdbc:mysql://localhost:3306/work?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
#热部署
devtools:
restart:
#热部署生效
enable: true
#设置重启的目录
additional-paths: src/main/java
freemarker:
#页面不加载缓存,修改即时生效
cache: false
mybatis:
# mybatis的 Mapping.xml的位置
mapper-locations: classpath:mapping/*Mapping.xml
# 指定POJO扫描包来让mybatis自动扫描到自定义的POJO,如果配置了该配置则不需要再ResultMap中指定全类名了
type-aliases-package: com.su.springboot.entity
configuration:
#一开始我的数据库的表属性是teacher_id,address_id
#在Student类中定义的属性是teacherId,addressId结果就查询不出来
#所以通过以下方式将其改为驼峰式名下划线去掉,后面的一个字母变为大写
map-underscore-to-camel-case: true
#打印sql
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
logging:
#日志打印等级,注意修改对应项目下的包路径
level:
com:
su:
springboot: DEBUG
pattern:
#控制台只输出日期和内容
console: "%d - %msg%n"
file:
#设置日志文件路径及名称
name: e:\日志\test.log
######### 分页插件 ##########
pagehelper:
#配置使用哪种数据库语言,不配置的话pageHelper也会自动检测
helper-dialect: mysql
#为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值;
# 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值,
# 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
params: count = countSql
#配置分页参数合理化功能,默认是false。 #启用合理化时,如果pageNum<1会查询第一页,如果pageNum>总页数会查询最后一页;
#禁用合理化时,如果pageNum<1或pageNum>总页数会返回空数据。
reasonable: true
#支持通过Mapper接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。
support-methods-arguments: true
package com.su.springboot02.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
//接口:http://localhost:8081/hello
@RequestMapping("/hello")
public String hello(){
//调用业务,接收前端参数
return "hello";
}
}
ASCII文字,Spring Boot自定义启动Banner在线生成工具
package com.su.springboot03.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexController {
@RequestMapping("/abc")
public String test(){
return "demo";
}
}
整合Swagger文档
第一步:jar包的引入:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
第二步:swagger的配置启动类编写:
package com.su.springboot03.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.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket CreatRestApi(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
// 为当前包路径
.apis(RequestHandlerSelectors.basePackage("com.su.springboot03.controller")).paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
// 页面标题
.title("SpringBoot中的使用swagger2接口规范")
// 版本号
.version("1.0.0")
// 描述
.description("接口说明")
.build();
}
}
package com.su.springboot03.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
/* 类注解 */
@Api(value = "desc of class")
@RestController
public class HelloController {
/* 方法注解 */
@ApiOperation(value = "desc of method", notes = "")
@GetMapping(value="/hello")
public Object hello( /* 参数注解 */ @ApiParam(value = "desc of param" , required=true ) @RequestParam String name) {
return "Hello " + name + "!";
}
}
F5清除页面缓冲
练习
package com.su.springboot03.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@RequestMapping("\test")
public String fun(){
return "做一个小测试";
}
}
package com.su.springboot03.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@Api(value="用户接口",tags="万相之王",description = "测试接口")
@RequestMapping(value="/home")
public class TestController {
private Map<String,String> map = new HashMap<>();
@RequestMapping(value = "/add",method = RequestMethod.POST)
@ApiOperation(value = "增加一个角色", notes = "好像爱这个世界")
public Map<String,String> Add(@RequestParam String role,@RequestParam String name) {
map.put(role,name);
return map;
}
@RequestMapping(value = "/delete",method = RequestMethod.DELETE)
@ApiOperation(value = "删除一个角色", notes = "好像爱这个世界")
public Map<String,String> Delete(@RequestParam String role) {
map.remove(role);
return map;
}
@RequestMapping(value = "/select",method = RequestMethod.GET)
@ApiOperation(value = "查询所有角色", notes = "好像爱这个世界")
public Map<String,String> Select() {
for(Map.Entry<String,String> entry:map.entrySet()){
System.out.println("角色:" + entry.getKey() + " 姓名: "+entry.getValue());
}
return map;
}
@RequestMapping(value = "/update",method = RequestMethod.PUT)
@ApiOperation(value = "更新一个角色姓名", notes = "好像爱这个世界")
public Map<String,String> Update(@RequestParam String role,@RequestParam String name) {
map.put(role,name);
return map;
}
}
springboot文件上传简单实例 使用MultipartFile