idea搭建springBoot环境

2018-02-08 14:27:10

  1. File -> Create project创建Spring Boot项目,如图
  2. 点击NEXT,为项目命名,如图
  3. 选择需要安装的组件,简单点,直接先一个web即可,如图
  4. 点击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);
    }

}