版权声明:本文为博主原创文章,未经博主允许不得转载。如需转载请标明原博地址:https://blog.csdn.net/m0_37898659/article/details/82383467
@纯属个人学习总结,不喜勿喷哈。(学习来自慕课网)
我觉得学习SpringBoot需要具备的前置知识
熟悉maven构建项目;
懂得Spring注解开发的知识;
了解restful
API的理论知识(http://www.ruanyifeng.com/blog/2011/09/restful.html)
一、SpringBoot介绍
我们在做java的项目中经常被xml的配置搞得头大,也会花很多时间在配置项目上面,SpringBoot的出现就帮我们解决了这个问题。
SpringBoot的好处和特点:
创建独立的Spring应用程序
嵌入的Tomcat,无需部署WAR文件
简化Maven配置
自动配置Spring
提供生产就绪型功能,如指标,健康检查和外部配置
绝对没有代码生成和对XML没有要求配置
编码变得简单,配置变得简单,部署变得简单,监控变得简单
备受关注,是下一代框架
微服务的入门级微框架。微服务是当下火热的技术之一,spring推出一套专门做微服务的SpringCloud,而学习SpringCloud就必须先学习SpringBoot。
附上maven的pom.xml文件代码:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-thymeleafartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-jpaartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
注意:我使用的开发工具是 idea
使用\@ConfigurationProperties和\@component注释将属性绑定到JavaBean。也可以用不同的形式指定属性名称。
例如,person.first-name,person.firstName和PERSON_FIRSTNAME可以互换使用。
我们称这个功能为“宽松绑定”。
可以加一个实体类person,使用配置注入,
定义实体的前缀为 prefix = Person
在实体中定义这个前缀,可以获取配置文件中前缀是Person的配置,映射过来。
注意:pom.xml文件中记得要导入自动映射的依赖包,不然会报错;
我们复制多两份application.prooperties,并加上dev和prod代表开发环境和生产环境
在application.porperties中通过spring.profiles.active 参数调用dev或者prod。
我们在dev中定义name为AA,在prod中定义name为BB
切换spring.profiles.active的参数就可以实现不同环境下切换
当然,多环境配置还有其他的方式。
想看下面三个注解
(1)@RestController注解相当于\@ResponseBody + \@Controller合在一起的作用。
如果用@RestController进行注解,视图解析器
InternalResourceViewResolver不起作用,返回的内容就是Return 里的
内容,而不能返回jsp页面,或者html页面。
例如:使用RestController注解是return上的 index 只是返回一个字符串。
https://img-blog.csdn.net/20180904154226872?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3ODk4NjU5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70” alt=”这里写图片描述” title=”” />70)
(2)使用@Controller 注解,在对应的方法上,视图解析器可以解析return
的jsp,html页面,并且跳转到相应页面
若返回json等内容到页面,则需要加\@ResponseBody注解
例如:如果直接用Controller的话(加了依赖包的话),运行。
会发现,页面报错,说你没有模板 “BB”这个模板,因为personPorperties.getName()
返回的是一个字符串 “BB”,
但是视图解析器会认为这个是一个网页,但是没找到。
既然没有,那就创建一个页面,在resource目录下templates目录,里面再创建一个index.html页面随便写点东西
把HelloController的personPorperties.getName() 改为index
可以在\@RequestMapping中用集合来定义value
这个时候,访问路径就变为
http://127.0.0.1:8080/hello/say
(1)@pathVariable:获取url的数据
例如获取id :(那个{id}也可以放在say前面: /{id}/say )
url输入:127.0.0.1:8080/hello/say/23,则出现
(2)@RequestParam:像上面那个的URL比较简洁,但是传统的URL并不是那样写,例如:127.0.0.1:8080/hello/say?id=12
所有我们要用\@RequestParam获取这样的id值
注意:(1)@RequestParam(“id”)里面的id必须跟URL的相同,但是后面Integer id
里面的id可以不相同。
(2)@RequestParam(“id”)在页面中不传(?id=)则显示为空,如果连(?id=)都不写则报400,
给定默认值,这时候不写(?id=)则默认为0
(3)GetMapping
GetMapping其实就是等于默认Get请求方式的RequestMapping
效果都一样,当然还有PostMapping等、、
使用: Spring-Data-Jpa ( 老师说是类似Hibernate的东西)
MySQL
1、JPA: 定义了一系列对象持久化的标准,目前实现这一规范的产品又Hibernate、TopLink
2、这次定义 五个RESTful API 的设计
请求类型 | 请求路径 | 功能 |
---|---|---|
GET | /persons | 获取人列表 |
POST | /persons | 创建一个人 |
GET | /persons/id | 通过id查一个人 |
PUT | /persons/id | 通过id更新一个人 |
DELETE | /persons/id | 通过id删除一个人 |
5、配置jpa。选择update:创建的时候自动帮我们生成表,如果里面已经存在表或者已经有数据则不会重新创建;
注意:jpa选择create,每次启动之后都会创建新的表,里面的数据会没掉。
配置showsql,可以让我们在控制台看到sql语句
6、定义实体类Person
\@Entity是定义这个类是实体类,\@id指定该属性为id,\@GeneratedValue是自增(但是由于jpa策略升级问题,要改为(\@GeneratedValue(strategy
= GenerationType.IDENTITY )))
编译,启动,就会自动生成数据库表
开始实现功能
1、创建一个PersonController
2、Spring-data-jpa操作数据库十分简单,不需要写一句sql语句
创建一个接口PersonRepository
继承JpaRepository接口,第一个参数是:你要操作的实体类,第二个参数是:这个实体类的id的类型.(后面可以直接根据这个id进行操作,类似直接调用已经定义好的findAll()方法,会根据你这个id去找)
3、查询人类列表。因为这次只是尝试一下SpringBoot,就直接在Controller中调用Dao,勿怪勿怪。在方法中直接调用接口的findAll方法。(会自动根据实体id去查所有的数据)
启动项目,可以看到已经把数据库的内容取出来了。
4、添加一个人类。
这次用了post,所以选择用postman这个软件
填入name和age两个值作为参数。可以看到成功插入一个person
5、实现通过id查询。
注意:在springBoot低版本中,根据主键查找一个数据使用的是findOne()这个方法。
6、根据id更新。
注意是使用put请求,但是在put请求下在postman中不能在from-data中插入参数,而在x-www-from-urlencoded,这个http的一种格式。
7、根据id删除。
8、在查询中,如果不是只是通过id查询,可以拓展接口,实现其他的查询方式(根据年龄查询)
在做项目的时候很多情况会出现需要两边同时要成功或者不成功。例如银行取钱,要么存进去了,卡也扣钱了;要么存不进去,卡不扣钱。不可能说卡扣钱了,机器却提示没存成功。
1、写一个PersonService管理事务。插入两个person 。
在Controller中进行调用
启动,数据库成功插入两条数据
2、现在来一个需求,我故意让第二条数据插入失败,同时第一条也插入不了。(我把数据库name改为只有四个长度)
3、给service中方法加上事务\@Transactional
(一般哪怕操作一条,尽量都加上事务,除非是查询操作。)
然后删掉刚才添加的第一条数据。
再次之前,提醒一件事,只有InnoDB引擎的数据库表才支持事务。(这个我查了半天)记得要修改。