优点:
前置知识:
利用maven构建项目
Spring注解
RESTful API
推荐环境:
可以在spring官网 https://start.spring.io/ 上建项目,也可以用idea构建。官网上直接生成项目如下:
本案例使用IDEA 来创建一个 SpringBoot 项目:
说明:
|-resources
|-static 存放静态资源,如 css js images
|-templates 存放模板页,可以使用模板引擎,如freemarker、velocity、theamleaf等
|-application.properties SpringBoot应用的配置文件
package com.xmlvhy.girl.web;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* Author: 小莫
* Date: 2019-01-17 19:11
* Description:<描述>
*/
@RestController
public class HelloController {
@RequestMapping(value = "/hello" , method = RequestMethod.GET)
public String say(){
return "Hello SpringBoot!";
}
}
1. 在 IDEA 中启动,进入 GirlApplication 启动类中运行
2. 在项目根路径下执行maven命令: mvn spring-boot:run
3. 在项目跟路径下执行 maven 命令, 先执行 mvn install :
进入 target ,到target目录下后, 再执行 : java -jar girl-0.0.1-SNAPSHOT.jar
4. 启动成功后,访问:http://ip:端口/hello
,效果如下 :
文件名固定,放在 classpath:/ 或 classpath:/config 目录下 :
YAML用法:
YAML不是一种标记语言
YAML是专门用来写配置文件的语言,比xml、properties更适合作为配置文件
YAML文件的后缀是.yml或.yaml
语法规则:
大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tag键,只允许使用空格
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
`#`表示注释
根据个人喜好选择一种配置文件类型吧,我比较喜欢 application.properties ,本篇也是以这个为主!
在 aplication.properties 文件中添加属性,如何在类文件中读取到属性呢 ?
#配置端口号
server.port=8082
#配置属性
name=jack
age=18
在HelloController类中读取 :
package com.xmlvhy.girl.web;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* Author: 小莫
* Date: 2019-01-17 19:11
* Description:<描述>
*/
@RestController
public class HelloController {
@Value("${name}")
private String name;
//在属性文件中无需指定数据类型,在类中声明类型即可
@Value("${age}")
private Integer age;
@RequestMapping(value = "/hello" , method = RequestMethod.GET)
public String say(){
//return "Hello SpringBoot!";
return name +" "+ age;
}
}
浏览器地址栏中输入:http://localhost:8082/hello
:
如果想要在配置文件中,引用配置文件中的属性,那么可以通过下面这种配置:
#配置端口号
server.port=8082
#配置属性
name=jack
age=18
content=name: ${name}, age: ${age}
Java类中同样方式引用:
package com.xmlvhy.girl.web;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* Author: 小莫
* Date: 2019-01-17 19:11
* Description:<描述>
*/
@RestController
public class HelloController {
//@Value("${name}")
//private String name;
//@Value("${age}")
//private Integer age;
@Value("${content}")
private String content;
@RequestMapping(value = "/hello" , method = RequestMethod.GET)
public String say(){
//return "Hello SpringBoot!";
//return name +" "+ age;
return content;
}
}
效果如下:
可能有人会想到 : 两个属性还好,要是很多属性呢?那么我们继续修改配置文件,相当于建立一个分组,就需要用到这两个注解 : @Component @ConfiguartionProperties
新添加一些属性:
#配置端口号
server.port=8082
#配置属性
test.name=jack
test.age=18
test.sex=Man
#content=name: ${name}, age: ${age}
新建一个类 :
package com.xmlvhy.girl.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* Author: 小莫
* Date: 2019-01-17 21:29
* Description:
*/
@Component //将当前Bean添加到容器中
//默认读取全局配置文件获取值,将当前类中的属性与配置文件中的test前缀进行绑定,这个可以自定义的
@ConfigurationProperties(prefix = "test")
@NoArgsConstructor //生成无参的构造方法
@Data //lombok插件的注解,默认帮生成 setter getter 和toString()方法
public class PersonProperties {
private String name;
private Integer age;
private String sex;
}
在 HelloController 中引用 :
package com.xmlvhy.girl.web;
import com.xmlvhy.girl.entity.PersonProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* Author: 小莫
* Date: 2019-01-17 19:11
* Description:<描述>
*/
@RestController
public class HelloController {
//@Value("${name}")
//private String name;
//@Value("${age}")
//private Integer age;
//@Value("${content}")
//private String content;
@Autowired
private PersonProperties personProperties;
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String say() {
//return "Hello SpringBoot!";
//return name +" "+ age;
//return content;
return personProperties.toString();
}
}
可以为不同环境提供不同中的配置信息,如开发环境、测试环境、生产环境。我们可以将application.properties 复制两份,分别命名(随意)为:application-dev.properties(表示开发环境) application-pro.properties(表示生产环境) :
具体使用哪一个配置,在主配置文件 application.properties 中指定 :
//表明使用开发环境下的配置
spring.profiles.active=dev
//表明使用生产环境下的配置
//spring.profiles.active=pro
当然,不管生产环境还是开发环境,主配置文件中的配置都会生效(一般都是各环境下通用的一些配置)
备注:java -jar 启动项目可以指定一种配置环境,这时候你也可以通过IDEA中启动同项目的另外一种配置环境,注意端口需要修改一下。这样也就实现多环境了
java -jar girl-0.0.1-SNAPSHOT.jar –spring.profiles.active=pro
@Controller:处理http请求
@RestController:Spring4之后新的注解,原来返回json需要@ResponseBody配合@Controller
@RequestMapping:配置url映射
单独使用 Controller 注解时,在MVC里,是需要返回ModelAndView等类型的类或者页面;但如使用 @RestController 注解,表示给前端提供RESTful风格的接口返回一些json格式数据。
@Controller 这个和在spingmvc没啥区别;@RestController 用了这个之后,就可以省掉两个注解@Controller和@RequestBody。
@RestController = @ResponseBody + @Controller
@PathVariable:获取url中的数据
@RequestParam:获取请求参数的值
@GetMapping: 组合注解 表示 @RequestMapping(value="...",method= RequestMethod.GET) 其他同理
@RequestMapping(value = "/get/{name}",method = RequestMethod.GET)
public String getName(@PathVariable String name){
return name;
}
如上这种方式: @PathVariable 获取url中的数据例如 "/get/{name}",浏览器中输入:http://localhost:8082/get/小莫 ,看下效果:
那如果我们不传 name 呢?看会怎么样:
出错了,提示404找不到!!就是说url中必须要有这个参数。
我们接下来看下另外一种请求参数:
@RequestMapping(value = "/get")
public String getId(@RequestParam("id") String id){
return id;
}
@RequestParam获取请求参数的值,我们在浏览器地址栏中输入:http://localhost:8082/get?id=666666 ,效果如下:
如果我们访问这个:http://localhost:8082/get ,看下会有什么结果:
返回 400 ,客户端非法请求,提示请求参数 id 没有;这时候我们可以这样解决这个问题:
//required = false;表示该参数非必须
//defaultValue = "123456";表示没有填写参数时候默认给的参数值
@RequestMapping(value = "/get")
public String getId(@RequestParam(value = "id",required = false,defaultValue = "123456") String id){
return id;
}
修改后,我们再次访问:http://localhost:8082/get ,效果如下:
这时候可以看到,不报错了,并且将我们设定的默认值 123456 返回来。同样我们在浏览器输入栏中输入:http://localhost:8082/get?id=666666
也能把我们预期的内容返回给我们。
SpringBoot 结合 Spring-Data-Jpa 使用,实现对数据库的操作。Spring-Data-Jpa 定义了一系列对象持久
化的标准,目前实现这一规范的产品有Hibernate.TopLink等。
<!--jpa的依赖jar-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--mysql 数据库的连接驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
package com.xmlvhy.girl.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
/**
* Author: 小莫
* Date: 2019-01-18 17:43
* Description:<描述>
*/
@Entity //表示该类映射数据库中的表
@Data //lombok插件注解,默认生成setter getter toString()方法,没有插件的话,自己手动生成即可
@NoArgsConstructor //无参构造方法,jpa 这块需要映射数据库的实体类有个无参的构造方法
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private Integer age;
}
首先我们先创建一个数据库: test (名称随意),然后在 application.properties 中添加如下配置:
#配置端口号
server.port=8082
#配置属性
test.name=jack
test.age=18
test.sex=Man
#content=name: ${name}, age: ${age}
#通用数据库配置
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=数据库账户
spring.datasource.password=数据库的密码
# Hikari 数据源专用配置
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
#jpa相关配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
#springboot 2.x 不加这句则默认为myisam引擎,该引擎不会事务回滚,添加如下可将引擎修改为innodb,事务可回滚
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
此时我们运行项目,查看数据库 test 。你会发现它自动帮我们生成一个 user 表:
这时候,我们可以添加一些数据,以便后面测试 :
package com.xmlvhy.girl.Dao;
import com.xmlvhy.girl.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* Author: 小莫
* Date: 2019-01-18 18:11
* Description:<描述>
*/
//不需要添加任何注解 ,springboot 将接口类会自动注解到spring容器中,只需要继承JpaRepository(这个接口默认会提供给我们一些基础的数据库操作)
//第一个参数 User:表示接口对应的实体类 ;第二个参数 Integer : 表示该实体类对应表主键的类型
public interface UserRepository extends JpaRepository<User,Integer> {
}
package com.xmlvhy.girl.service;
import com.xmlvhy.girl.entity.User;
import java.util.List;
/**
* Author: 小莫
* Date: 2019-01-18 18:26
* Description:<描述>
*/
public interface UserService {
//获取所有的用户信息
List<User>findAllUsers();
//保存用户信息,这个方法主要是为了后面演示一下,事务回滚
void saveUsers();
}
package com.xmlvhy.girl.service.impl;
import com.xmlvhy.girl.Dao.UserRepository;
import com.xmlvhy.girl.entity.User;
import com.xmlvhy.girl.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* Author: 小莫
* Date: 2019-01-18 18:27
* Description:<描述>
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public List<User> findAllUsers() {
return userRepository.findAll();
}
@Override
public void saveUsers() {
User user1 = new User();
user1.setAge(10);
user1.setName("小红");
userRepository.save(user1);
User user2 = new User();
user2.setAge(10);
user2.setName("小明");
userRepository.save(user2);
}
}
编写一个 获取 user 的信息和保存用户的接口:
package com.xmlvhy.girl.web;
import com.xmlvhy.girl.entity.User;
import com.xmlvhy.girl.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Author: 小莫
* Date: 2019-01-18 19:45
* Description:<描述>
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
*功能描述: 获取所有用户
* @Author 小莫
* @Date 19:48 2019/01/18
* @Param []
* @return List<User>
*/
@GetMapping("/get")
public List<User> getUsers(){
return userService.findAllUsers();
}
/**
*功能描述: 保存两个用户的信息
* @Author 小莫
* @Date 19:48 2019/01/18
* @Param []
* @return void
*/
@RequestMapping("/save")
public void saveUsers(){
userService.saveUsers();
}
}
打开浏览器,地址栏中输入:http://localhost:8082/user/get ,结果如下:
表明成功返回获取的数据。
此时我们访问:http://localhost:8082/user/save, 这时候成功结果会将我们设定好的两个数据插入数据库中,访问如果没什么异常,这时候查看数据库:
表明数据也成功插入进入了。
#不加这句则默认为myisam引擎,该引擎不会事务回滚,添加如下:在application.properties 中可将引擎修改为 innodb
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
我们来模拟一个异常,在service中,修改一下 saveUsers 这个方法,通过是用事务和不使用事务来对比看一下:
@Override
public void saveUsers() {
User user1 = new User();
user1.setAge(10);
user1.setName("小杰");
userRepository.save(user1);
//模拟一个异常
int i = 10/0;
User user2 = new User();
user2.setAge(10);
user2.setName("小明");
userRepository.save(user2);
}
此时,我们重新build项目,然后访问一下:http://localhost:8082/user/save ,会提示服务器内部错误,从报错可以看出是我们设定的场景!然后再去看一下数据库,看小杰
有没有保存进入数据库:
发现小杰的数据插入数据库了,小明的没有插入成功,因为小明的数据插入前出现我们设定的异常了
那么我们如何避免这种情况呢?我们希望的是要么两个都失败,要么都成功!这就需要事务管理了!修改如下:
@Transactional
@Override
public void saveUsers() {
User user1 = new User();
user1.setAge(10);
user1.setName("加事务还能保存吗");
userRepository.save(user1);
//模拟一个异常
int i = 10/0;
User user2 = new User();
user2.setAge(10);
user2.setName("小明");
userRepository.save(user2);
}
再次build项目,然后我们在访问保存用户的接口:http://localhost:8082/user/save ,你会发现,虽然还会报同样的异常,但是事务起作用了,也就是说,加事务还能保存吗
这条数据也不能保存到数据库中了。这就实现了事务的回滚!
以上便是SpringBoot 2.x 快速入门的所有内容,教你快速创建一个Web项目!
本内容涉及的代码:获取源码
另外,提供一套免费学习视频,这套课程原本在慕课网最受欢迎的一套 2 小时入门 SpringBoot,老师讲的不错,但是由于内容中影响不好,被慕课官方下架了,网友提供录制版本,蛮清晰的。仅供学习使用!
视频获取地址:https://pan.baidu.com/s/1Clpnwxacn2SIOh4w3_rSiA
本文作者: AI码真香
本文标题: SpringBoot 2.x 教你快速入门
本文网址: https://www.xmlvhy.com/article/62.html
版权说明: 自由转载-非商用-非衍生-保持署名 署名-非商业性使用4.0 国际 (CC BY-NC 4.0)