大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。
版权声明:本文为博主原创文章,未经博主允许不得转载。如需转载请标明原博地址: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.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>
<!-- 配置文件自动映射 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!--模板-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--JPA-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--数据库连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
二、SpringBoot版本的helloworld
注意:我使用的开发工具是 idea
1、在idea中使用maven创建一个SpringBoot项目
2、打开启动类,右键点击run,让程序跑起来。
3、可以看到,在控制台中已经启动了,而且Tomcat也已经启动了
4、接下来,写一个类,在浏览器上显示点东西,创建一个HelloController
5、在浏览器上访问 http://127.0.0.1:8080/hello,显示信息。
三、属性配置
1、在项目结构中,有个application.properties文件 ,它是SpringBoot项目的配置文件,尝试在里面配置端口和项目名称。
2、启动项目,显示tomcat已经在8081端口启动了。
3、尝试把配置文件里的内容通过注解注入到类的属性中。
在配置文件中定义:name = xxxx ;
4、在Controller中通过\@Value注解注入到name中
5、启动程序,打印在浏览器上
6、同时,也可以在配置文件中调用配置文件的name
7、打印显示
8、但是这样发现,每个属性都要写\@Value注解,有点麻烦。
使用\@ConfigurationProperties和\@component注释将属性绑定到JavaBean。也可以用不同的形式指定属性名称。
例如,person.first-name,person.firstName和PERSON_FIRSTNAME可以互换使用。
我们称这个功能为“宽松绑定”。
可以加一个实体类person,使用配置注入,
定义实体的前缀为 prefix = Person
在实体中定义这个前缀,可以获取配置文件中前缀是Person的配置,映射过来。
注意:pom.xml文件中记得要导入自动映射的依赖包,不然会报错;
9、在HelloController中使用@Autowired对javaBean进行装配使用
10、配置文件中,我们可以通过使用 spring.profiles.active 参数,搭配\@Profile注解,可以实现不同环境下(开发、测试、生 产)配置参数的切换。
我们复制多两份application.prooperties,并加上dev和prod代表开发环境和生产环境
在application.porperties中通过spring.profiles.active 参数调用dev或者prod。
我们在dev中定义name为AA,在prod中定义name为BB
切换spring.profiles.active的参数就可以实现不同环境下切换
当然,多环境配置还有其他的方式。
四、Controller控制器的使用
想看下面三个注解
1、Controller和RestController的区别
(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
好了,启动。好了。
2、如果我们想在浏览器中无论是访问 http://127.0.0.1:8080/hello 还是 http://127.0.0.1:8080/hi 都可以访问到这个方法
可以在\@RequestMapping中用集合来定义value
3、@RequestMapping也可以给整个类指定URL。
这个时候,访问路径就变为
http://127.0.0.1:8080/hello/say
4、处理URL里面的参数
(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删除一个人 |
3、添加依赖包
4、配置数据库
5、配置jpa。选择update:创建的时候自动帮我们生成表,如果里面已经存在表或者已经有数据则不会重新创建;
注意:jpa选择create,每次启动之后都会创建新的表,里面的数据会没掉。
配置showsql,可以让我们在控制台看到sql语句
6、定义实体类Person
\@Entity是定义这个类是实体类,\@id指定该属性为id,\@GeneratedValue是自增(但是由于jpa策略升级问题,要改为(\@GeneratedValue(strategy
= GenerationType.IDENTITY )))
要生成无参构造函数和getter setter方法
编译,启动,就会自动生成数据库表
六、数据库操作(下)
开始实现功能
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改为只有四个长度)
启动,执行插入(控制台报错了),说name太长;
但是在数据库中第一条已经插进去了。
3、给service中方法加上事务\@Transactional
(一般哪怕操作一条,尽量都加上事务,除非是查询操作。)
然后删掉刚才添加的第一条数据。
再次之前,提醒一件事,只有InnoDB引擎的数据库表才支持事务。(这个我查了半天)记得要修改。
启动,运行,发现两天都没有插入。这就是事务管理。(aaaa和aaaaaa都没有插入)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119806.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...