创建
springboot项目的创建与初始化可以直接用idea中给的springboot initialiar,在创建的时候勾上springweb组件就可以了,一键懒人式操作,各种依赖和启动类也都会默认给出。
但是这样会存在一个致命的问题,由于springboot是一种很新的架构,默认的版本都在3.0.0以上,其依赖的的jdk版本也都默认是17以上,而大多数情况下,这两个版本都高于实际应用,因此,经常不用这种方法来搭建springboot架构。
既然springboot也是一个maven项目,那就可以采用常规的maven搭建方法,先创建maven框架,然后是导入各种依赖,包括springboot版本、mybatis、mysql和fastjson等,最后手动添加一个启动类就可以了,这是启动类的常规写法和位置:
基本结构
一个基础的springboot项目包含controller层、service层、domain层和mapper层。其中
domain
这里一般是书写实体类的地方,用于各种封装、getter、setter和tostring。
controller
@RestController
controller层用于接收外界传入的信息,用RequestMapping、PostMapping、GetMapping处理不同的应用场景。对于传入的信息类型不同也有不同的接受方式。同时,为了调用service中的方法,还需要写一段小小的联系代码:
@Autowired
TestService testService;
Mapping注解
一、@RequestMapping注解
@RequestMapping是Spring MVC中用于映射web请求(如URL路径)到具体的方法上的注解。它既可以标注在类上,也可以标注在方法上。标注在类上时,表示类中的所有响应请求的方法都是以该类路径为父路径。
示例:
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
// ... 获取用户信息的逻辑
return user;
}
}
在上述代码中,@RequestMapping("/users")注解表示该控制器处理所有以/users为前缀的URL请求。而@GetMapping("/{id}")则表示处理GET类型的请求,具体路径为/users/{id}。
二、@PostMapping注解
@PostMapping是一个组合注解,它是@RequestMapping(method = RequestMethod.POST)的缩写。它用于处理HTTP POST请求的方法,只能标注在方法上。使用@PostMapping注解的方法将仅响应POST请求。
示例:
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping("/create")
public User createUser(@RequestBody User user) {
// ... 创建用户信息的逻辑
return createdUser;
}
}
在上述代码中,@PostMapping("/create")表示该方法处理的是POST请求,路径为/users/create。通常用于创建新的资源。
三、@GetMapping注解
@GetMapping也是一个组合注解,它是@RequestMapping(method = RequestMethod.GET)的缩写。它用于处理HTTP GET请求的方法,也只能标注在方法上。使用@GetMapping注解的方法将仅响应GET请求。
示例:
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/list")
public List<User> listUsers() {
// ... 获取用户列表的逻辑
return userList;
}
}
在上述代码中,@GetMapping("/list")表示该方法处理的是GET请求,路径为/users/list。通常用于获取资源列表。
四、@RequestMapping、@PostMapping、@GetMapping之间的区别
功能区别:
@RequestMapping是一个通用的请求映射注解,可以处理所有类型的HTTP请求。
@PostMapping和@GetMapping则分别是专门处理POST和GET请求的注解,它们具有更明确的语义。
使用场景:
当你需要处理多种类型的HTTP请求时,使用@RequestMapping是合适的。
当你只想处理POST请求时,应使用@PostMapping。
当你只想处理GET请求时,应使用@GetMapping。
代码简洁性:
使用@PostMapping和@GetMapping相比于@RequestMapping更加简洁明了,因为它们已经限定了请求的方法类型。
在实际的Spring Boot应用中,为了代码的可读性和维护性,建议根据具体需求选择使用这些注解。通常,对于简单的CRUD操作,使用@GetMapping、@PostMapping等特定类型的注解更为合适;而对于更复杂的请求处理逻辑,可以使用@RequestMapping并明确指定请求方法类型。
tips:一般来说,需要取得返回值的方法可以用GetMapping,不需要取得返回值的方法用PostMapping。
Request注解
一、@RequestParam 和 @RequestBody区别。
疑问: 在使用postman工具测试api接口的时候,如何使用 json 字符串传值呢,而不是使用 form-date,x-www-form-urlencoded 类型,毕竟通过 key-value 传值是有局限性的。假如我要测试批量插入数据的接口呢,使用 x-www-form-urlencoded 方法根本就不适用于这种场景。
那么如何通过postman工具使用json字符串传值呢,这里就引申出来了spring的两个注解:
@RequestParam
@RequestBoday
这两个注解都可以在后台接收参数,但是使用场景不用。
1、@RequestParam
先介绍一下@RequestParam的使用场景:
注解@RequestParam接收的参数是来自requestHeader中,即请求头。通常用于GET请求,比如常见的url:http://localhost:8081/spring-boot-study/novel/findByAuthorAndType?author=唐家三少&type=已完结,其在Controller 层的写法如下图所示:
@RequestParam有三个配置参数:
required 是否必须传递参数,默认为 true,必须。
defaultValue 可设置请求参数的默认值。
value 为接收url的参数名(相当于key值)。
**@RequestParam用来处理 Content-Type 为 multipart/form-data; 编码的内容,Content-Type默认为该属性。
@RequestParam也可用于其它类型的请求,例如:POST、DELETE等请求。
这种使用表单格式multipart/form-data; 的请求
比如向表中插入单条数据,Controller 层的写法如下图所示:
由于@RequestParam是用来处理 Content-Type 为 application/form-data 编码的内容的
但是这样不支持批量插入数据啊,如果改用 json 字符串来传值的话,类型设置为 application/json,点击发送的话,会报错,后台接收不到值,为 null。
这时候,就可以使用@RequestBody
2、@RequestBody
先介绍一下@RequestBody的使用场景:
注解@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/form-data编码格式的数据,比如:application/json、application/xml、applicatioin/x-www-form-urlencoded等类型的数据。
就application/json类型的数据而言,使用注解@RequestBody可以将body里面所有的json数据传到后端,后端再进行解析。
1、 举个批量插入数据的例子,Controller层的写法如下图所示:
由于@RequestBody可用来处理 Content-Type 为 application/json 编码的内容,所以在postman中,选择body的类型为row -> JSON(application/json),这样在 Headers 中也会自动变为 Content-Type : application/json 编码格式。body内的数据如下图所示:
body 里面的 json 语句的 key 值要与后端实体类的属性一一对应。
**注意:**前端使用$.ajax的话,一定要指定 contentType: "application/json;charset=utf-8;",默认为 application/x-www-form-urlencoded。
2、后端解析json数据
上述示例是传递到实体类中的具体写法,那么如果传递到非实体类中,body里面的json数据需要怎么解析呢?我们再来看下面这个例子:
在body中,我们还是输入上面的json数据,根据分析,上面的json数据是一个List数组内嵌套着map对象,那么在后台的接收形式可写为 List>,具体代码如下图所示:
3、@RequestBody 还可以用于解析x-www-form-urlencoded请求参数
得出结论,通过@RequestBody可以解析Body中json格式的数据。
3、总结
注解@RequestParam接收的参数是来自requestHeader中,即请求头。通常用于GET请求,像POST、DELETE等其它类型的请求也可以使用。
注解@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/form-data编码格式的数据,比如:application/json、application/xml等类型的数据。通常用于接收POST、DELETE等类型的请求数据,GET类型也可以适用。
tips:一般来说,@RequestParam用于接收单一的、原始类型(string、int之类)的信息,@RequestBody用于接收封装类型或大量的数据;用@RequestParam时记得带上后面的括号内容。
service
@Service
这里是controller的下一层,用于实际处理controller中传入的数据,一般controller中的方法只负责接收或者对传入数据进行初步的加工,真正大量和复杂的操作应当在service中完成,同时,为了调用mapper接口,还需要写一段小小的联系代码:
@Autowired
StudentMapper studentMapperToMapper;
除此之外,这里倒是没有什么需要强调的地方,主要都是一些方法的书写。
mapper
@Mapper
@Repository
这里是service的下一层,用于连接service和mapper.xml,即连接代码操作和数据库操作,作接口用,这里通常只声明方法,真正的操作都交给与之相连的mapper.xml
mapper.xml
这里是真正操作数据库的地方,对于增删改查以及各种简单的数据操作有着独特的语法规范。一般来说,该文件开头如下:
<?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">
文件内部与html相似地使用双标签写法,最外层即为<mapper></mapper>。
内层主要功能部分大体分为增<insert></insert>、删<delete></delete>、改<update></update>、查<select></select>。
<mapper namespace="com.mapper.StudentMapper">
<insert id="insert" parameterType="com.domain.Student" >
insert into student(name,age) value (#{name},#{age})
</insert>
<select id="queryByName" resultType="com.domain.Student">
select * from student where name = #{name}
</select>
<update id="update" parameterType="com.domain.Student">
update student set age=#{age} where name = #{name}
</update>
<delete id="deleteByName">
delete from student where name = #{name};
</delete>
</mapper>
其中的parameterType和resultType分别是传入数据类型和输出数据类型,这里因为传入传出的数据类型都是domain中封装的Student类,因此只用到了Student的路径地址,实际应用中通常还包含如下情况:
<select id="get2" parameterType="java.lang.String" resultType="com.xf.pojo.User">
select * from t_user where name = #{name}
</select>
pom.xml
这是管理整个项目的依赖文件,用于提供各种<dependencies>、<properties>、和<build>。一般是需要什么以来的时候去搜索一下,要时刻注意版本问题,这里进行操作后记得去右侧maven处刷新一下
application.yml/application.properties
这是项目的配置文件,各种数据库、缓存、端口、组件等配置都是在这里完成。
需要说明的是,yml文件和properties文件的实际效益是一样的,只是格式不同。
.yml
spring:
datasource:
url: jdbc:mysql://127.0.0.0:3306/要使用的数据库的库名?characterEncoding=utf8
username: root
password: 数据库的密码
.properties
# 设置MySQL的链接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/要使用的数据库的库名?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=连接的数据库的密码
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
不难看出,yml文件的层次和条理更加清晰,因此目前大多数项目都是采用yml文件进行配置。需要注意的是,yml文件的冒号和后面的内容之间有一个空格,在idea中可以清晰地感觉出差异,有空格的时候整行才会高亮显示。
有时根据实际测试或生产的需要,会存在多个yml文件,命名格式一般如下:
根据需要在原yml文件中加入:
spring:
profiles:
active: prod
.gitignore
这是一份约束文件,在与远程gitee仓库建立联系后用于告知git哪些文件不参与commit和push。这里一般没有特殊要求的话可以通用,直接从其他项目copy一份即可。
需要注意的是,一般情况下直接从外部找.gitignore文件可能找不到,这时要在文件查看中打开隐藏项目显示: