####前言 Spring Boot
是用来简化Spring
应用初始搭建以及开发过程的全新框架,被认为是SpringMVC
的接班人,和微服务紧密联系在一块儿。Spring Boot 简单实例Demohtml
####SpringMVC 的优缺点java
优势:mysql
Spring Boot
适合快速开发,适合构建微服务系统。封装了常用的组件,好比MyBatis
, Hibernate
, MongoDB
等。Java
的配置,简单方便。java -jar
进行部署比较简单。Spring Boot
对自定义十分友好,能够配置在application.yml
或者Config
类,Spring Boot
的总体思想是有自定义的话,自定义优先,不然走默认配置。Spring Boot
使编码,配置,部署,监控变得简单起来。缺点:git
Spring Boot
底层到底干了什么。集成度较高,使用过程当中不容易了解底层。####第一个Spring Boot的应用github
New Project
,要选择Spring Initializr,
而后Choose Initializr Service URL
应该选择Custom
, 正确的连接应该是http://start.spring.io/
,而不是https://start.spring.io/
。https
会形成咱们访问失败!2.相关配置,Type
咱们选择Maven Project
web
3.选择Web
就好了。另外Spring Boot
的版本是1.5.8 spring
4.Finished
。大功告成! sql
5.因为默认的setting.xml
配置,致使咱们从远程下jar实在是太慢,因此咱们要修改.m2
下面的setting.xml
文件,同时将setting.xml
本来指向C:\Users\Administrator\.m2\repository
的仓库地址,改为咱们自定义的盘下面便可。 个人setting.xml是这样的,若是仍是看不懂的话,请移步Setting.xml相关配置数据库
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors
复制代码
6.咱们能够看到这个DemoApplication
类, 这是整个Spring Boot
应用的入口,有@SpringBootApplication
这个注解,显而易见。apache
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
复制代码
7.接下来咱们建立一个HelloController.java
, @RestController
这个注解的做用:声明这是一个Controller
类,返回json
。其实就是@ResponseBody
和@Controller
的结合体。
@RestController
public class HelloController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String say() {
return "Hello, Spring Boot!";
}
}
复制代码
8.启动有3种方式。 (1)直接在Itellij IDEA
启动。
mvn spring-boot:run
(3)在项目的根目录下,打开命令窗口,输入mvn install
,让项目生成jar
包。
target
包下面多了一个
jar
包。
输入命令java -jar target/demo-0.0.1-SNAPSHOT.jar
Spring Boot
应用了。
###项目属性配置 1.咱们能够在resources文件夹
下面建3个properties
, application-dev.properties
是开发环境下的配置文件。application-prod.properties
是应用环境下的配置文件。Spring Boot
默认读取的配置文件是application.properties
,咱们只须要在application.properties
指定使用哪个环境下的配置文件便可。好比:spring.profiles.active=dev
2.咱们在application-dev.properties
,配置一些信息,让咱们的Controller
类去读取配置信息。
server.port=8081
server.context-path=/girl
cupSize=A
height=160
content="cupSize: ${cupSize}, age: ${height}"
girl.cupSize=A
girl.height=160
复制代码
3.Controller类读取配置信息,启动Spring Boot输出结果。
public class HelloController {
@Value("${cupSize}")
private String cupSize;
@Value("${height}")
private String height;
@Value("${content}")
private String content;
@RequestMapping(value = "/display", method = RequestMethod.GET)
public String display() {
return "cupSize=" + cupSize + ", height=" + height;
}
@RequestMapping(value = "/content", method = RequestMethod.GET)
public String displayContent() {
return content;
}
}
复制代码
4.Controller
类读取配置信息带前缀的字符串,好比咱们要读取girl.cupSize=A girl.height=160
这些带girl的配置信息,咱们该怎么办呢。咱们须要定义一个GirlProperties.java
。@ConfigurationProperties
表明咱们要读取带什么前缀的配置信息,@Component
表明这个类已经在Spring配置文件中注册过。
@ConfigurationProperties(prefix = "girl")
@Component
public class GirlProperties {
private String cupSize;
private String height;
public String getCupSize() {
return cupSize;
}
public void setCupSize(String cupSize) {
this.cupSize = cupSize;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
}
复制代码
5.Controller
类读取GirlProperties
,咱们要使用@Autowired
注入GirlProperties
这个类的实例,它是经过bean的类型注入的。启动Spring Boot应用,输出结果。
@RestController
public class HelloController {
@Autowired
private GirlProperties girlProperties;
@RequestMapping(value = "/properties", method = RequestMethod.GET)
public String displayProperties() {
return girlProperties.getCupSize() + girlProperties.getHeight();
}
}
复制代码
###Controller的使用 1.尽可能使用@GetMapping
和 @PostMapping
代替 @RequestMapping(value = "/xxxxx", method = RequestMethod.GET)
2.若是须要在Spring Boot
使用@Controller
,须要返回一个逻辑视图。好比
@Controller
public class DemoController {
@RequestMapping(value = "/saylove", method = RequestMethod.GET)
public String sayLove() {
return "index";
}
}
复制代码
index.html
是在templates
文件夹下面的
3.pom.xml
配置以下
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>girl</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>1.5.8.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
复制代码
###数据库操做 1.在application-dev.properties
配置数据链接配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/spring_boot
spring.datasource.username=root
spring.datasource.password=xiaoma96
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
复制代码
spring.jpa.hibernate.ddl-auto
有4个属性: create
: 无论数据库原先有没有这个表,每次启动应用,都会drop这个表,而后再建立新的一张表。 update
: 若是数据库中有这个表且有数据,那么我会保留这张表,不会去删除它。 create-drop
: 应用中止的时候, 会把数据库里面这张表删除。 none
: 不产生任何行为。
2.什么是JPA
?JPA
的英文全称是Java Persistence API
定义了一系列对象持久化的标准,目前实现这个规范的产品有Hibernate
。
3.怎么去使用JPA
? 以前用过Liferay
技术, Liferay
经过ServiceBuilder
生成Service.xml
,在这个Service.xml
配置你须要建立数据库表的entity
信息,而后定义一些方法的字段。而后build一下。就会生成对应的CRUD
方法,非常智能。并且在下一次应用启动时,会生成对应的数据库表哟。若是须要定制化sql语句,只须要在finderImpl
和ServiceImpl
里面添加本身的方法,而后build
一下,从新生成接口。一样JPA
,简单的CRUD
咱们不须要去写sql语句,只须要定义一个GirlRepository
的接口,继承JpaRepository<Girl, Integer>
就好了。须要定制化CRUD
,咱们添加相应的方法就好了。
public interface GirlRepository extends JpaRepository<Girl, Integer> {
public List<Girl> findByAge(Integer age);
public List<Girl> findByCupSize(String cupSize);
public List<Girl> findByName(String name);
}
复制代码
4.定义RESTfulAPI
,开放CRUD
接口。增长,使用POST
, 查询使用GET
, 更新使用PUT
,删除使用DELETE
。
@RestController
public class GirlController {
@Autowired
private GirlRepository girlRepository;
/**
* Queries all girls.
* @return girls List queryed
*/
@GetMapping(value = "/girls")
public List<Girl> girlList() {
return girlRepository.findAll();
}
/**
* Adds girl
* @param name
* @param cupSize
* @param age
* @return girl added
*/
@PostMapping(value = "/girls")
public Girl girlAdd(@RequestParam("name") String name, @RequestParam("cupsize") String cupSize
, @RequestParam("age") Integer age) {
Girl girl = new Girl();
girl.setAge(age);
girl.setName(name);
girl.setCupSize(cupSize);
return girlRepository.save(girl);
}
/**
* Finds girl by id
* @param id
* @return girl finded
*/
@GetMapping(value = "/girls/{id}")
public Girl girlFindOne(@PathVariable("id") Integer id) {
return girlRepository.findOne(id);
}
/**
* Updates girl
* @param id
* @param name
* @param cupSize
* @param age
* @return girl updated
*/
@PutMapping(value = "/girls/{id}")
public Girl girlUpdateOne(@PathVariable("id") Integer id, @RequestParam("name") String name, @RequestParam("cupsize") String cupSize
, @RequestParam("age") Integer age) {
Girl girl = new Girl();
girl.setCupSize(cupSize);
girl.setName(name);
girl.setAge(age);
girl.setId(id);
return girlRepository.save(girl);
}
/**
* Deletes girl by id
* @param id
*/
@DeleteMapping(value = "/girls/{id}")
public void girlDeleteOne(@PathVariable("id") Integer id) {
girlRepository.delete(id);
}
/**
* Queries girls by name
* @param name
* @return girl list queryed
*/
@GetMapping(value = "/girls/name/{name}")
public List<Girl> girlFindByName(@PathVariable("name") String name) {
return girlRepository.findByName(name);
}
/**
* Queries girls by age
* @param age
* @return girl list queryed
*/
@GetMapping(value = "/girls/age/{age}")
public List<Girl> girlFindByAge(@PathVariable("age") Integer age) {
return girlRepository.findByAge(age);
}
/**
* Queries girls by cupsize
* @param cupSize
* @return girl list queryed
*/
@GetMapping(value = "/girls/cupsize/{cupsize}")
public List<Girl> girlFindByCupSize(@PathVariable("cupsize") String cupSize) {
return girlRepository.findByCupSize(cupSize);
}
}
复制代码
5.使用Postman
软件,测试API
。在这里,我就测试一个查询api
,演示一下。
###事务管理 1.什么是事务?事务是做为一个逻辑单元执行的一系列操做。它有4个特性
2.咱们经常使用的几个事务:
PROPAGATION_REQUIRED
: 若是存在一个事务,则支持当前的事务,若是没有则开启。PROPAGATION_SUPPORTS
: 若是存在一个事务,就支持当前事务, 若是没有事务,则以非事务执行。PROPAGATION_REQUIRES_NEW
: 启动一个新的事务,不依赖当前事务,当前事务挂起。3.咱们模拟一个事务的回滚,体现事务的原子性,第一个save
操做不会出现问题,第二个save
操做会抛出异常。可是不能部分红功,不能部分失败。这二个操做最终会被回滚。
@Service
public class GirlService {
@Autowired
private GirlRepository girlRepository;
@Transactional
public void insertTwo() {
Girl girlA = new Girl("garrett-test", 18, "Z");
girlRepository.save(girlA);
Girl girlB = new Girl("mayday-test", 21, "BBBBBBBB");
girlRepository.save(girlB);
}
}
@RestController
public class GirlController {
@Autowired
private GirlService girlService;
/**
* Tests transaction
*/
@GetMapping(value = "/transaction")
public void transactionTest() {
girlService.insertTwo();
}
}
复制代码
4.启动应用,打开Postman
,测试API
。很显然,操做发生异常进行回滚,数据库未插入任何数据。
####尾言 学无止境,一块儿共勉。