- _nosay
idea搭建springBoot环境
2018-02-08 14:27:10
- File -> Create project创建Spring Boot项目,如图
- 点击NEXT,为项目命名,如图
- 选择需要安装的组件,简单点,直接先一个web即可,如图
- 点击Finish完成项目的初始化
初始项目结构如图所示
我们把用不到的文件和文件夹先删除掉,删掉后的结构如下所示
我们在src>main>java下建立 com.nosay.book.controller包,在此包下建立BookController类文件,内容如下
package com.nosay.book.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class BookController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String sayHello()
{
return "Hello";
}
}
我们使用IDEA打开BookApplication.java文件,右键,选择Run运行程序,我们访问 http://127.0.0.1:8080/hello 得到Hello输出,安装是正确无误的。
但是SpringBoot除了使用Idea启动以外,还有以下的两种启动方式,使用终端进入项目目录,执行
mvn spring-boot:run
或者编译成jar后,使用java启动,相关命令如下
mvn install
cd target
java -jar book-0.0.1-SNAPSHOT.jar
这三种方式选择任意一种即可。
关于项目属性的配置
SpringBoot创建成功后,会在resources文件夹中生成一个application.properties配置文件,里面虽然是空的,但此配置文件很重要。我们把此配置文件修改为
server.port=8081
server.context-path=/nosay
启动后,发现原来的链接已经打不开了,新的链接换成了http://127.0.0.1:8081/nosay/hello
其中server.port配置的是启动端口号,而server.context-path则配置的是nosay前缀。
但是我们也可以后application.properties更换为application.yml文件,内容如下
server:
port: 80
context-path: nosay
发现此种写法清晰明了多了,于是果断把application.properties更换为application.yml
此时我们稍微的研究一下此配置文件,在文件中加上两个配置值,文件内容变为
server:
port: 8080
name1: book1
name2: book2
接下来我们怎么获取定义的name1和name2的值呢,我们修改一下BookController.java文件,内容变更为
package com.nosay.book.controller;
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;
@RestController
public class BookController {
@Value("${name1}")
private String name1;
@Value("${name2}")
private String name2;
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String sayHello()
{
return this.name1 + "<br />" + this.name2;
}
}
此时访问http://127.0.0.1:8080/hello 网址,成功输出了我们定义的两个配置值,十分的方便。
我们如何在配置文件里继续使用上文的配置呢?这个也比较的简单,如下
server:
port: 8080
name1: book1
name2: book2
content: "the name1 is ${name1},the name2 is ${name2}"
直接使用即可,很强大,但是如果配置文件太多的话,我们就需要对其进行归类了,我们把配置文件改为
server:
port: 8080
book:
name1: book1
name2: book2
然后建立com.nosay.book.properties,在此包下建立BookProperties类文件,内容如下
package com.nosay.book.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "book")
public class BookProperties {
private String name1;
private String name2;
public String getName1() {
return name1;
}
public void setName1(String name1) {
this.name1 = name1;
}
public String getName2() {
return name2;
}
public void setName2(String name2) {
this.name2 = name2;
}
}
发现idea顶部出现了警告,于是我们需要打开pom.xml文件,添加好下依赖
<dependency>
<groupId> org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
重新刷新Maven后,警告消失,在BookController.java文件中,可以像这样调用
package com.nosay.book.controller;
import com.nosay.book.properties.BookProperties;
import org.springframework.beans.factory.annotation.Autowired;
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;
@RestController
public class BookController {
@Autowired
private BookProperties bookProperties;
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String sayHello()
{
return this.bookProperties.getName1() + this.bookProperties.getName2();
}
}
但是如何做开发环境和生产环境的配置文件分离呢?于是我们在application.yml的同级目录下,新增两个application-dev.yml文件及application-pro.yml文件,在application.yml指定运行哪个环境即可
spring:
profiles:
active: dev
#其中若为dev则引用application-dev.yml文件若为pro则引用application-pro.yml文件
我们可以通过在控制台执行
java -jar book-0.0.1-SNAPSHOT.jar --spring.profiles.active=pro
java -jar book-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
只要端口号不冲突,我们可以同时启动多个环境,很方便。
关于Controller的常注解
- @Controller 处理http请求
- @RestController Spring4之后新加的注解,原来返回json需要@ResponseBody配合@Controller
- RequestMapping 配置url映射
比较方便的是,我们可以使用两条不同的url指向相同的控制器
@RequestMapping(value = {"/hello","/hi"}, method = RequestMethod.GET)
- @PathVariable 获取url中的数据
- @RequestParam 获取请求参数的值
- @GetMapping 组合注解
其中@RequestParam的一种常见使用
@RequestParam(value = "id", required = false,defaultValue="0" Integer id)
一个简单的数据库CURD记录
请求类型 | 请求路径 | 功能 |
---|---|---|
GET | /books | 获取图书列表 |
POST | /books | 创建一本图书 |
GET | /books/id | 通过id查询一本图书 |
PUT | /books/id | 通过id更新一本图书 |
DELETE | /books/id | 通过id删除一本图书 |
首先需要在pom.xml文件中加入两个依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
然后添加数据库配置,application.yml文件内容变更为
spring:
profiles:
active: dev
#其中若为dev则引用application-dev.yml文件若为pro则引用application-pro.yml文件
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://172.18.0.2:3306/books
username: root
password: root
jpa:
hibernate:
ddl-auto: create
show-sql: true
建立com.nosay.book.bean包,在此包下建立Books类文件,文件内容如下
package com.nosay.book.bean;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Books {
@Id
@GeneratedValue
private Integer id;
private String name;
private Float price;
public Books() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
}
运行一下程序,发现已经生成了相应的books表,因为每次运行的时候都要重建,所以我们把配置文件中的ddl-auto改为update
建立com.nosay.book.repository,在此包下建立BookRepository接口文件,文件内容如下
package com.nosay.book.repository;
import com.nosay.book.bean.Books;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface BookRepository extends JpaRepository<Books,Integer> {
//通过name查询
List<Books> findByName(String name);
}
相关的控制器代码如下所示
package com.nosay.book.controller;
import com.nosay.book.bean.Books;
import com.nosay.book.repository.BookRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
public class BookController {
@Autowired
private BookRepository bookRepository;
@GetMapping(value = "/books")
public List<Books> booksList()
{
return bookRepository.findAll();
}
@PostMapping(value = "/books")
public Books addBook(@RequestParam("name") String name,
@RequestParam("price") Float price
)
{
Books books = new Books();
books.setName(name);
books.setPrice(price);
return bookRepository.save(books);
}
@GetMapping(value = "/books/{id}")
public Books findOneBook(@PathVariable("id") Integer id)
{
return bookRepository.findOne(id);
}
@PutMapping(value = "/books/{id}")
public Books updateBook(@PathVariable("id") Integer id,
@RequestParam("name") String name,
@RequestParam("price") Float price)
{
Books books = new Books();
books.setId(id);
books.setName(name);
books.setPrice(price);
return bookRepository.save(books);
}
@DeleteMapping(value = "/books/{id}")
public void deleteBook(@PathVariable("id") Integer id)
{
bookRepository.delete(id);
}
//通过name查询图书信息
@GetMapping(value = "/books/name/{name}")
public List<Books> bookListByName(@PathVariable("name") String name)
{
return bookRepository.findByName(name);
}
//通过price查询图书信息
@PostMapping(value = "/books/price")
public List<Books> booksListByPrice(@RequestParam("price") Float price)
{
return bookRepository.findByPrice(price);
}
}