创建SpringBoot项目
1.配置maven
出现bug
java: 无法访问org.springframework.boot.SpringApplication 错误的类文件: /D:/maven/repository/org/springframework/boot/spring-boot/3.0.0/spring-boot-3.0.0.jar!/org/springframework/boot/SpringApplication.class 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类
2.修改pom.xml,bug消除(2.7.2 、<java.version>1.8</java.version>)
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>demo</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Web入门
- Spring Boot将传统Web开发的mvc、json、tomcat等框架整合,提供了spring-boot-starter-web组件,简化了Web应用配置。
- 创建SpringBoot项目勾选Spring Web选项后,会自动将spring-boot-starter-web组件加入到项目中。
- spring-boot-starter-web启动器主要包括web、webmvc、ison、tomcat等基础依赖组件,作用是提供Web开发场景所需的所有底层依赖。
- webmvc为Web开发的基础框架,ison为JSON数据解析组件,tomcat为自带的容器依赖。
控制器
- Spring Boot提供了@Controller和@RestController两种注解来标识此类负责接收和处理HTTP请求。
- 如果请求的是页面和数据,使用@Controller注解即可;如果只是请求数据则可以使用@RestControler注解。
路由映射
- @RequestMapping注解主要负责URL的路由映射。它可以添加在Controller类或者具体的方法上
- 如果添加在Controller类上,则这个Controller中的所有路由映射都将会加上此映射规则,如果添加在方法上,则只对当前方法生效。
- @RequestMapping注解包含很多属性参数来定义HTTP的请求映射规则。常用的属性参数如下
- value:请求URL的路径,支持URL模板、正则表达式
- method: HTTP请求方法
- consumes: 请求的媒体类型!(Content-Type),如application/json
- produces: 响应的媒体类型
- params,headers:请求的参数及请求头的值
Method匹配
- HTTP请求Method有GET、POST、PUT、DELETE等方式。HTTP支持的全部Method
- @RequestMapping注解提供了method参数指定请求的Method类型,包括RequestMethodGET、RequestMethod.POST、RequestMethod.DELETERequestMethod.PUT等值,分别对应HTTP请求的Method
@RequestMapping(valve = "/getData",method = RequestMethod.GET)
public string getData(){
return "hello";
}
- Method匹配也可以使用@GetMapping、@PostMapping等注解代替。
参数传递
- @RequestParam将请求参数绑定到控制器的方法参数上,接收的参数来自HTTP请求体或请求url的QueryString,当请求的参数名称与Controller的业务方法参数名称一致时,@RequestParam可以省略
- @PathVaraible:用来处理动态的URL,URL的值可以作为控制器中处理方法的参数
- @RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type:application/x-www-form-urlencoded编码格式的数据比如:
application/json
、application/xml
等类型的数据
idea快捷键get和set、toString()为Alt+Insert
文件上传
文件上传原理
- 表单的enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。当表单的enctype=“application/x-www-form-urlencoded”(默认)时form表单中的数据格式为:key=value&key=value
- 当表单的enctype="multipart/form-data"时,其传输数据形式如下
SpirngBoot实现文件上传功能
- Spring Boot工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。
- 要更改这个默认值需要在配置文件(如application.properties)中加入两个配置
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
@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);
}
}
运行结果如下
拦截器
- 拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现。总结起来,拦截器大致有以下几种使用场景:
- 权限检查:如登录检测,进入处理程序检测是否登录,如果没有,则直接返回登录页面。
- 性能监控:有时系统在某段时间莫名其妙很慢,可以通过拦截器在进入处理程序之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间
- 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有提取Locale、Theme信息等,只要是多个处理程序都需要的,即可使用拦截器实现。
- Spring Boot定义了Handlerlnterceptor接口来实现自定义拦截器的功能
- HandlerInterceptor接定义了preHandle、postHandle、afterCompletion三种方法,通过重写这三种方法实现请求前、请求后等操作
1.拦截器定义:一般只设置preHandle,作为执行controller之间的拦截器,先撰写拦截器类
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("LoginInterceptor");
return true;
}
}
2.拦截器注册:(必须写,否则拦截器不可执行)绑定拦截器和拦截的资源访问路径,切记要加@Controller,才能被整个程序配置到
- addPathPatterns方法定义拦截的地址
- excludePathPatterns定义排除某些地址不被拦截添加的一个拦截器没有addPathPattern任何一个url则默认拦截所有请求如果没有excludePathPatterns任何一个请求,则默认不放过任何一个请求。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**");
}
}
RESTfuI的特点
- 每一个URI代表一种资源
- 客户端使用GET、POST、PUT、DELETE四种表示操作方式的动词对服务端资源进行操作:GET用于获取资源,POST用于新建资源(也可以用于更新资源)PUT用于更新资源,DELETE用于删除资源。
- 通过操作资源的表现形式来实现服务端请求操作。
- 资源的表现形式是JSON或者HTML。
- 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都包含必需的信息。
HTTP状态码
- HTTP状态码就是服务向用户返回的状态码和提示信息,客户端的每一次请求服务都必须给出回应,回应包括HTTP状态码和数据两部分。
- HTTP定义了40个标准状态码,可用于传达客户端请求的结果。状态码分为以下5个类别:
1xx:信息,通信传输协议级信息
2xx:成功,表示客户端的请求已成功接受
3xx:重定向,表示客户端必须执行一些其他操作才能完成其请求
4xx:客户端错误,此类错误状态码指向客户端
5xx:服务器错误,服务器负责这写错误状态码
Spring Boot实现RESTfuI API(xxMapping)
- Spring Boot提供的spring-boot-starter-web组件完全支持开发RESTfuI API提供了与REST操作方式(GET、POST、PUT、DELETE)对应的注解。
@GetMapping:处理GET请求,获取资源。
@PostMapping:处理POST请求,新增资源。
@PutMapping:处理PUT请求,更新资源。
@DeleteMapping:处理DELETE请求,删除资源:
@PatchMapping:处理PATCH请求,用于部分更新资源。 - 在RESTfu架构中,每个网址代表一种资源,所以URI中建议不要包含动词,只包含名词即可,而且所用的名词往往与数据库的表格名对应。
- 用户管理模块API示例:
Swagger
- Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTfuI风I格的Web服务,是非常流行的API表达工具。
- Swagger能够自动生成完善的RESTfuIAPI文档同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API
使用Swagger生成Web API文档
1.导入依赖
<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>
2.Swagger配置类
@Configuration //告诉Spring容器这是一个配置类
@EnableSwagger2 //开启Swagger的功能
public class Swagger2Config {
@Bean
public Docket createRestApi(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com"))
.paths(PathSelectors.any()).build();
}
/**
* 这里为API文档显示的信息
*/
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("演示项目API")
.description("学习Swagger2的演示项目")
.version("1.0")
.build();
}
}
3.在application.properties中添加
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
4.运行http://localhost:8080/swagger-ui.html
5.可以通过@ApiOperation(“xxxx”)进行备注
6.运行结果如下
MybatisPlus
ORM介绍
- ORM(Object Relational Mapping,对象关系映射)是为了解决面向对象与关系数据库存在的互不匹配现象的一种技术
- ORM通过使用描述对象和数据库之间映射的元数据将程序中的对象自动持久化到关系数据库中。
- ORM框架的本质是简化编程中操作数据库的编码
MyBatis-Plus介绍
- MyBatis是一款优秀的数据持久层ORM框架,被广泛地应用于应用系统
- MvBatis能够非常灵活地实现动态SQL,可以使用XML或注解来配置和映射原生信息,能够轻松地将Java的POJO(Plain Ordinary Java Object,普通的Java对象)与数据库中的表和字段进行映射关联
- MyBatis-Plus是一个 MyBatis 的增强工具,在 MyBatis 的基础上做了增强简化了开发
如何使用Mybatis
- Mybatis的CRUD操作
@Insert("insert into user values(#{id},#{username},#{password},#{birthday})")
int add(User user);
@Update("update user set username=#{username},password=#{password},birthday=#{birthday} where id=#{id}")
int update(user user);
@Delete("delete from user where id=#{id}")
int delete(int id);
@Select("select * from user where id=#{id}")
User findById(int id);
@Select("select * from user")
List<user> getAll();
1.添加依赖
<!--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>
2.全局配置
(1)在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=hsp
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
(2)在DemoApplication中添加@MapperScan注解
@SpringBootApplication
@MapperScan("com.example.mpdemo.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
4.创建UserController,添加下面代码
@GetMapping("/user")
public String query(){
return "查询用户";
}
5.创建entity的User类,添加get和set、toString()
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
private String birthday;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", birthday='" + birthday + '\'' +
'}';
}
}
6.创建Mapper的UserMapper接口,记得写@Mapper
@Mapper
public interface UserMapper {
//查询所有用户
@Select("select * from user")
public List<User> find();
}
7.在UserController中添加声明,注入userMapper
@Autowired
private UserMapper userMapper;
@GetMapping("/user")
public String query(){
List<User> list = userMapper.find();
System.out.println(list);
return "查询用户";
}
8.运行结果
-
如果是前后端分离项目需要将返回值String改为List,系统会自动将数据转为json
运行结果如下 -
插入
(1)在UserMapping添加下面代码
(2)在UserController中添加
@PostMapping("/user")
public String save(User user){
int i = userMapper.insert(user);
if(i > 0){
return "插入成功";
}else{
return "插入失败";
}
}
如何使用MybatisPlus
1.mapper类继承BaseMapper(注意:类的名字必须和表的名字一致)
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
2.controller修改query方法,insert方法不用变
@GetMapping("/user")
public List query(){
List<User> list = userMapper.selectList(null);
System.out.println(list);
return list;
}
- 如果表名和实体类不一致,类上方可以加“@TableName(“表名”)”映射到实体类,变量名不一致用“@TableField”。
- @TableId可以将变量设置为主键,IdType.AUTO意思是自增,再次测试,插入数据时,user传入数据时会带上id,尽管请求时并没有设置id。
MybatisPlus多表查询及分页查询
-
实现复杂关系映射,可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置。(MybatisPlus仅对单表查询进行了增强,没有修改多表查询)
-
目标:实现查询用户时,查到该用户名下所有订单
(1)新建订单表u_order(id设置为主键、自增),注意表名不能设为order,不然访问时,sql语法会出错(“select *from order where uid = #{uid}”),无法执行sql语句。
因为sql语句中不能出现sql关键词,否则会报错,sql关键词有order、form、dec等等。
(2)新建Order类,以及get、set、constructor、toString方法
@TableName("u_order")
public class Order {
private int id;
private String ordertime;
private double total;
private User user;
}
(3)User类中加入private List<Order> order;
(4)新建OrderMapper、OrderController
@Mapper
public interface OrderMapper extends BaseMapper<Order> {
@Select("select * from u_order where uid = #{uid}")
List<Order> selectByUid(int uid);
// 查询所有的订单,同时查询订单的用户
@Select("select * from u_order")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "order_time",property = "ordertime"),
@Result(column = "total",property = "total"),
@Result(column = "uid",property = "user",javaType = User.class,
one=@One(select = "com.example.demo.mapper.UserMapper.selectById")
)
})
List<Order> selectAllOrderAndUser();
}
@RestController
public class OrderController {
@Autowired
private OrderMapper orderMapper;
@GetMapping("/order/findAll")
public List findAll(){
List orders = orderMapper.selectAllOrdersAndUser();
return orders;
}
}
(5)UserMapper添加查询用户、查询所有订单的方法selectAllUserAndOrder()
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 查询用户,根据用户id查询信息 select * from user where id =
@Select("select * from user where id = #{id}")
User selectById(int id);
// 查询用户及其所有的订单
@Select("select * from 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 = "order",javaType = List.class,
many=@Many(select = "com.example.demo.mapper.OrderMapper.selectByUid")
)
}
)
List<User> selectAllUserAndOrder();
(6)UserController中添加对应方法
@GetMapping("/user/findAll")
public List<User> find(){
return userMapper.selectAllUserAndOrder();
}
@Results是结果集,@Result作用是每一个字段赋值
运行结果
条件查询
(1)在User类中的order前加上@TableField(exist = false),不然·就会报错
@TableField(exist = false)
private List<Order> order;
(2)在UserController中添加条件查询findByCond()
// 条件查询
@GetMapping("/user/find")
public List<User> findByCond(){
QueryWrapper<User> queryWrapper = new QueryWrapper();
queryWrapper.eq("username","zhangsan");
return userMapper.selectList(queryWrapper);
}
运行结果
分页查询
(1)创建MyBatis Plus拦截器,新建配置类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方法添加分页查询findByPage()
//分页查询
@GetMapping("/user/findByPage")
public IPage findByPage(){
//设置起始值及每页条数
Page<User> page = new Page<>(0,2);![请添加图片描述](https://img-blog.csdnimg.cn/direct/3e1c84ff10964acd9041b491936916fa.png)
IPage iPage = userMapper.selectPage(page,null);
return iPage;
}
Page对象是用来描述从哪查,查几条数据;iPage是描述结果集的对象。
运行结果: