Springboot 项目快速入门
参考视频:https://www.bilibili.com/video/BV1nV4y1s7ZN?spm_id_from=333.337.search-card.all.click
idea新建springboot 项目后,在其基础上进行学习:
开发环境热部署
学习目的:
简化修改代码后手动运行时间,使用spring-boot-devtools组件使得无须手动重启Spring Boot应用即可重新编译、启动项目。
步骤:
1.pom.xml添加依赖,并下载
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
2.在application.properties文件中配置
//热部署生效
spring.devtools.restart.enabled=true
//设置重启目录
spring.devtools.restart.additional-paths=src/main/java
3.鼠标进行如下配置
打开Settings页面,在左边的菜单栏依次找到Build,Execution,Deployment→Compile,勾选Build project automatically
打开设置界面,选择高级设置,下拉选择编译器允许自动make启动。
web入门
1.创建SpringBoot项目勾选Spring Web选项后,会自动将spring-boot-starter-web组件加入到项目中。
webmvc为Web开发的基础框架,json为JSON数据解析组件,tomcat为自带的容器依赖。
2.Spring Boot提供了@Controller和@RestController两种注解来标识此类负责接收和处理HTTP请求。
如果请求的是页面和数据,使用@Controller注解即可;如果只是请求数据,则可以使用@RestController注解,,@RestController注解会将返回的对象数据转换为JSON格式。
路由映射
@RequestMapping和@GetMapping作用一致,@GetMapping写法更为简便。
参数传递
1.通过url?后携带参数与函数参数保持一致
2.url后多参数通过&进行参数的衔接,在函数参数中加入对应属性名称即可。
如上,类比出一下参数传递方式。
@RestController
public class ParamsController {
@RequestMapping(value = "/getTest1",method = RequestMethod.GET)
public String getTest1(){
return "GET请求";
}
@RequestMapping(value = "/getTest2",method = RequestMethod.GET)
// http://localhost:8080/getTest2?nickname=xxx&phone=xxx
public String getTest2(String nickname,String phone){
System.out.println("nickname:"+nickname);
System.out.println("phone:"+phone);
return "GET请求";
}
//url中的nickname和函数参数中的name进行匹配
@RequestMapping(value = "/getTest3",method = RequestMethod.GET)
// http://localhost:8080/getTest2?nickname=xxx
public String getTest3(@RequestParam(value = "nickname",required = false) String name){
System.out.println("nickname:"+name);
return "GET请求";
}
//post请求不能用url进行调试,可用测试工具postman进行http请求调试
@RequestMapping(value = "/postTest1",method = RequestMethod.POST)
public String postTest1(){
return "POST请求";
}
@RequestMapping(value = "/postTest2",method = RequestMethod.POST)
public String postTest2(String username,String password){
System.out.println("username:"+username);
System.out.println("password:"+password);
return "POST请求";
}
//url后跟的参数可以是java对象
@RequestMapping(value = "/postTest3",method = RequestMethod.POST)
public String postTest3(User user){
System.out.println(user);
return "POST请求";
}
//url后跟的参数可以是json对象
@RequestMapping(value = "/postTest4",method = RequestMethod.POST)
public String postTest4(@RequestBody User user){
System.out.println(user);
return "POST请求";
}
@GetMapping("/test/*")
public String test(){
return "通配符请求";
}
postTest2请求测试方法,以下2张图片均可。
postTest3测试之前在后端需要有对应的实体类,测试方法如下。
postTest4测试之前在后端需要有对应的实体类,测试方法如下。
访问静态资源
resoures/static目录下可与存放静态资源。
访问方式:
想要在访问路径前加上前缀,可以在图下文件中加入以下语句,然后通过local host:8080/imges/test.jpg进行访问。
静态资源的存储位置也可以进行如下配置:
文件上传
上传文件类代码如下:
@RestController
public class FileUploadController {
@PostMapping("/upload")
public String up(String nickname, MultipartFile photo, HttpServletRequest request) throws IOException {
System.out.println(nickname);
// 获取图片的原始名称
System.out.println(photo.getOriginalFilename());
// 取文件类型
System.out.println(photo.getContentType());
String path = request.getServletContext().getRealPath("/upload/");
System.out.println(path);
saveFile(photo,path);
return "上传成功";
}
//
public void saveFile(MultipartFile photo,String path) throws IOException {
// 判断存储的目录是否存在,如果不存在则创建
File dir = new File(path);
if(!dir.exists()){
// 创建目录
dir.mkdir();
}
File file = new File(path+photo.getOriginalFilename());
photo.transferTo(file);
}
测试方法如下:
注意事项:
上传文件的大小受限的话可以对application.properties进行如下配置:
spring.servlet.multipart.max-file-size=10MB
spring.servlet. multi part. max-request -size=10MB
如果希望用户能访问自己上传的文件,可以对application.properties进行如下配置:
通过如下方式对已经上传的图片进行访问;
拦截器
创建登录拦截器如下:
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("LoginInterceptor");
return true;
}
}
request对应前端的请求,response对应响应信息。
创建config类,注册拦截器拦截自定义路径:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor( new LoginInterceptor()).addPathPatterns("/user/**");
}
}
构建restful服务
restful服务的controller类模板如下:
@RestController
public class UserController {
@ApiOperation("获取用户")
@GetMapping("/user/{id}")
public String getUserById(@PathVariable int id){
System.out.println(id);
return "根据ID获取用户信息";
}
@PostMapping("/user")
public String save(User user){
return "添加用户";
}
@PutMapping("/user")
public String update(User user){
return "更新用户";
}
@DeleteMapping("/user/{id}")
public String deleteById(@PathVariable int id){
System.out.println(id);
return "根据ID删除用户";
}
}
Swagger
在Spring Boot项目中集成Swagger同样非常简单,只需在项目中的pom.xml文件引入springfox-swagger2和springfox-swagger-ui依赖即可。
<!-- 添加swagger2相关功能 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- 添加swagger-ui相关功能 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
兴建config文件夹,创建SwaggerConfig 类,swagger代码如下:
@Configuration // 告诉Spring容器,这个类是一个配置类
@EnableSwagger2 // 启用Swagger2功能
public class SwaggerConfig {
/**
* 配置Swagger2相关的bean
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com"))// com包下所有API都交给Swagger2管理
.paths(PathSelectors.any()).build();
}
/**
* 此处主要是API文档页面显示信息
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("演示项目API") // 标题
.description("演示项目") // 描述
.version("1.0") // 版本
.build();
}
}
Spring Boot 2.6.X后与Swagger有版本冲突问题,需要在application.properties中加入以下配置:
启动项目访问 http://127.0.0.1:8080/swagger-ui.html ,即可打开自动生成的可视化测试页面
MyBatis-Plus
添加依赖
<!-- MyBatisPlus依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<!-- mysql驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 数据连接池 druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
application.properties文件全局配置:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false
spring.datasource.username=root
spring.datasource.password=root
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
server.port=8088
springboot都的启动类添加注解,全路径可以通过选中该文件右键copy路径:
1.新建controller文件夹,添加UserController类,先写一个测试方法:
2.新建entity文件夹,添加User类,对应数据库中的表项及其属性值。
3.新建mapper文件夹,添加Usermapper类。
4.在UserController类中添加注解,注入mapper方法:
注意实现:对于前端想要返回json对象,函数返回参数为list即可。
增删改查基础模板如下,usermapper类添加:
usercontroller类内添加:
// 插入数据
@PostMapping("/user")
public String save(User user){
int r= userMapper.add(user);
}
MyBatis-Plus简化
usermapper修改如下,BaseMapper提供基本方法,具体可以查看该类文件:
继承BaseMapper后,只需通过多态的方式调用父方法即可:
MyBatis-Plus提供一些细节操作,可以根据官网对自己的进行调整:
简介 | MyBatis-Plus (baomidou.com)
多表查询
模拟现实中一个用户多个订单,一个订单只对应一个用户的使用场景,实现通过用户查询订单,和通过订单查询用户的功能:
1:N:
1.在User类中新增表中不存在的字段
// 描述用户的所有订单
@TableField(exist = false)
private List<Order> orders;
2.在Usermapper中新增selectAllUserAndOrders方法:
// 查询用户及其所有的订单 id在user表中 ,通过这个查找订单
@Select("select * from t_user")
@Results(
{
@Result(column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(column = "birthday",property = "birthday"),
@Result(column = "id",property = "orders",javaType = List.class,
many=@Many(select = "com.example.mpdemo.mapper.OrderMapper.selectByUid")
)
}
)
List<User> selectAllUserAndOrders();
3.在OrderMapper新增selectByUid方法:
@Select("select * from t_order where uid = #{uid}")
List<Order> selectByUid(int uid);
这样完成了从用户查订单的操作。
1:1:
1.在Order类中新增表中不存在的字段:
@TableField(exist = false)
private User user;
2.在Oderrmapper中新增selectAllOrdersAndUser方法:
// 查询所有的订单,同时查询订单的用户
@Select("select * from t_order")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "ordertime",property = "ordertime"),
@Result(column = "total",property = "total"),
@Result(column = "uid",property = "user",javaType = User.class,
one=@One(select = "com.example.mpdemo.mapper.UserMapper.selectById")
)
})
List<Order> selectAllOrdersAndUser();
3.在UserMapper新增selectById方法:
// 查询用户,根据用户id查询信息 select * from user where id =
@Select("select * from t_user where id = #{id}")
User selectById(int id);
这样完成了从订单查用户的操作。
分页查询
1,先做配置,新建config文件夹,新建MyBatisPlusConfig配置类:
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
interceptor.addInnerInterceptor(paginationInterceptor);
return interceptor;
}
}
2.在Controller层中实现自定义分页查询方法:
// 分页查询
@GetMapping("/user/findByPage")
public IPage findByPage(){
//设置起始值及每页条数
Page<User> page = new Page<>(0,2);
IPage iPage = userMapper.selectPage(page,null);
return iPage;
}
至此,springboot项目能够实现基本的http请求和链接数据库的相关操作。