Spring Boot快速入门

时间:2021-04-25 13:10:54

安装

安装依赖

maven是一个依赖管理工具,我们利用maven进行构建。创建一个maven项目,在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>1.0</groupId>
<artifactId>SpringBoot</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent> <properties>
<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>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

,接着在idea里面import change,或者执行mvn install来下载依赖。

启动

在src根目录创建一个包,然后将项目的代码放进去。(注:App类不能直接放在src根目录,否则将无法正常启动)

package App;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}

运行

点击RUN,即可运行。如果是正常启动,控制台会输出

Spring Boot快速入门

路由

什么是路由?

路由是什么?路由即我们浏览器上的地址,我们通过路由与服务器进行信息交互。例如:https://search.bilibili.com/all?keyword=老友记。在这个例子中,我们访问https://search.bilibili.com/all,并且参数是老友记,直观意思是搜索keyword是老友记的视频。也可以这么理解,https://search.bilibili.com/all是一个函数,keyword是参数,通过调用函数来获得对应的结果。

匹配方法和路由

在Spring Boot中,我们需要指定哪一个路由对应哪一个方法。

我们在一个Controller里面通过@RequestMapping注解来匹配路径和对应的方法,以下是代码例子。

@RestController
@RequestMapping("test")
public class IndexController
{
@RequestMapping("index")
public String fun()
{
return "hello Spring boot";
}
}

@RestController注解的作用是表示这一个类是一个控制器类,并且返回的对象会自动转换为JSON(如果返回字符串则还是字符串形式)。@RequestMapping作用是匹配路由和方法,当它加在类上的时候,就是给该类的所有路径前加一层,但它加在方法上的时候,表示该路径匹配该方法。在这个例子中访问http://localhost:8080/hello/index,页面即打印hello Spring boot。

返回Json对象

进一步,如果我们想要返回JSON对象,怎么办呢?

@RestController注解的类会自动转换对象为JSON的,如果只是用@Controller修饰类,则要在方法前加上@ResponseBody。以下演示如何返回Json对象。

 @RequestMapping("person")
public Object testJson()
{
return new Person("Overflow",18);
}

在之前的控制器上加上以上代码,Person是我们自己定义的类。在浏览器上打开即可以看到Json字符串

{"name":null,"age":18}。

指定请求方法

如果我们想指定路由的请求方法,我们可以在@RequestMapping指定method,method可以是单个对象,也可以是数组形式。

@RequestMapping( value = "index",method ={RequestMethod.GET,RequestMethod.POST} )

以上例子说明该路由请求可以用GET和POST访问。如果不特别指定,则任何方法都可以访问该路由。

接受路由参数

只有单纯的路由是不够的,路由可以附带参数对服务器,那么我们绑定的方法要如何接受这些参数呢?

在Spring Boot里,我们只需要结合注解即可,以下介绍几种例子

1、匹配路由中的参数

 @RequestMapping("/person/{name}")
public Object testJson(@PathVariable(name = "name")String name)

2、获得get 或者post方法的参数

get方法路径就是 http:localhost:8080/hello/data?name=Tom

post方法要把参数放在form-data中

@RequestMapping(value = "/data",method={RequestMethod.GET,RequestMethod.POST})
public Object accessData(@RequestParam(name="name") String name)
{
return name;
}

3、接受Json对象

当参数比较多的时候,可以将参数解释为一个对象。注意该类一定要有一个默认的构造方法。

@RequestMapping(value = "/json")
public Object accessJsonData(Person person)
{
return person.getName();
}

4、接收HttpServletRequest对象

事实上以上的接收参数方法都是框架封装HttpServletRequest对象,而我们获得这个对象的方法很简单,只需要在函数的参数列表里面声明就好,Spring框架会为我们的方法注入该对象。

  @RequestMapping(value = "/servlet")
public Object selvlet(HttpServletRequest request)
{
return request.getRequestURL();
}

Session和Cookie

cookie的作用

cookie是存储在浏览器端的数据。通常用于保存客户端的状态信息。

Session的作用

Http请求,与普通的程序不一样,他是没有状态的。但是许多应用需要记录用户的状态,例如用户的登录信息等等,这时候就利用session技术来存储。当浏览器与服务器进行交互,服务器会分配一个SessionID给浏览器,浏览器会把这个ID保存在cookie里,然后每一次发送请求的时候都会将这一个sessionID附上,然后服务器就可以获得该ID的相关数据。

Map<String,Map<String,Object>> Session

Session的使用类似于以上的代码说明,一个SessionID对应一个Map来存储数据。

当然在Spring Boot里面,不需要手动地调用sessionID,就能获取对应该ID的HttpSession对象。

@RequestMapping(value = "/sessionAndCookie")
public Object sessionAndCookie(HttpSession session, HttpCookie cookie)

与数据库交互数据

什么是ORM?

数据库的数据是通过字段来存储信息的,如果Java类的属性能够与数据库的字段互相映射,那么我们就可以像操作Java对象一样操作数据库数据,方便的进行增删查改操作。

SpringBoot与MySQL进行数据交互

添加依赖

在原来的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>

在resource文件夹新建一个application.properties文件,这是一个配置文件

spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/你的数据库名称
spring.datasource.username=username
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto的作用,在这里我直接引用文档的解释

Here, spring.jpa.hibernate.ddl-auto can be noneupdatecreatecreate-drop, refer to the Hibernate documentation for details.

  • none This is the default for MySQL, no change to the database structure.

  • update Hibernate changes the database according to the given Entity structures.

  • create Creates the database every time, but don’t drop it when close.

  • create-drop Creates the database then drops it when the SessionFactory closes.

创建与数据库表对应的Entity类

@Entity
@Table(name = "user")
public class User
{
@Id
public int id;
public String username;
public String password;
public int power;
}

注解解释,@Entity注解表示该类是一个与数据库映射的类,@Table表示这个类绑定的是user表,@Id表示id是主键。

创建Repository类

这个类是与数据库进行交互用的,我们要继承Spring框架给我们提供的一个接口,CrudRepository<>,在使用的时候Spring框架会为我们自动注入相关的方法,方便我们进行增删查改

public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
<S extends T> S save(S var1); <S extends T> Iterable<S> save(Iterable<S> var1); T findOne(ID var1); boolean exists(ID var1); Iterable<T> findAll(); Iterable<T> findAll(Iterable<ID> var1); long count(); void delete(ID var1); void delete(T var1); void delete(Iterable<? extends T> var1); void deleteAll();
}

解释以上相关的函数

save(S var)    传入对象即可保存在数据库对象,如果我们的对象有指定ID,则会更新相应ID的记录

delete(ID var1)  传入ID即可删除对应ID的记录

构造查询方法

以下是我们的UserRepository的例子

public interface UserRepository extends CrudRepository<User,Long>
{
//1、通过函数名来进行查询
User findByUsername(String username);
List<User> findUsersByUsername(String username); //2、通过指定HQL语句进行查询
@Query("select u from User u where u.username= :username and u.password= :password")
User findUser(@Param("username") String name,@Param("password") String password);
}

查询方式有两种

一种是Spring Data提供的通过一定规范的函数名进行查询

另一种是利用@Query注解,指定HQL,来实现复杂的查询

大家看到这里可能会疑惑,为什么只需要定义方法名,而不需要写具体的方法体呢。这是Spring框架的优势,因为对象都是由Spring来管理,因此只需要给与必要的信息给框架识别,框架就能够构建一个继承你的接口的函数,接着按照Spirng自动载入的方法,将该对象引入类中即可。

在Controller类里使用Repository类

@RestController
@RequestMapping("user")
public class UserController
{
@Autowired
UserRepository userRepository; @RequestMapping("find/{name}")
public Object findUser(@PathVariable("name")String name)
{
return userRepository.findByUsername("hello");
} @RequestMapping("check/{name}/{password}")
public Object checkUser(@PathVariable("name") String name,@PathVariable("password") String password)
{
return userRepository.findUser(name, password);
}
}

利用@AutoWired即可自动载入我们定义的UserRepository

参考资料

1、http请求方法:http://www.runoob.com/http/http-methods.html

2、spring boot文档:http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/

3、spring data jpa文档:http://docs.spring.io/spring-data/jpa/docs/2.0.0.M4/reference/html/#jpa.query-methods

4、spring boot guide:https://spring.io/guides/gs/rest-service/