继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Spring Boot 基础(1)

道可
关注TA
已关注
手记 47
粉丝 1万
获赞 1426
1. 介绍

使用Spring Boot开发web应用程序非常方便,只需要进行简单的配置,可以把更多的精力放在业务逻辑上。

在spring 官网上,根据需求下载Spring Boot的初始工程。链接如下:

  https://start.spring.io/

拿到初始工程之后,第一件事情,就是搞一个helloworld程序。代码写好之后,运行程序。

Spring Boot程序的运行有三种方式:

  1. 通过idea直接启动,右键—run
  2. 通过maven直接启动,进入到项目的目录下,执行 mvn spring-boot:run
  3. 进入到项目目录下,执行 maven install 编辑jar包,执行 java -jar XX.jar 运行程序。
2. 程序配置文件

web应用程序,肯定是要需要使用配置文件保存基本配置信息,比如各种DB的连接信息或者业务逻辑的配置项。Spring Boot项目中对于配置项的支持非常友好,支持两种类型的配置文件,分别是 properties 类型和 yml 类型。其中 yml 的配置文件描述的更加清晰,推荐使用。下边是一个yml格式的配置文件:

图片描述

2.1 在程序中,使用 @Value 注解提取配置信息。

@Entity
public class Student
{
    @Value("${id}")
    private Integer id;

    @Value("${name}")
    private String name;

    ...

2.2 使用@ConfigurationProperties注解加载整个小结

例如,yml 配置文件中存在如下配置:

student:
  id: 1
  name: zhangsan
  age: 18
  height: 175

使用@ConfigurationProperties注解,使得该小结的配置项直接映射成为一个对象。在注解中,通过prefix字段指定要加载的配置小结。

@Entity
@ConfigrationProperties(prefix="student")
public class Student
{
    private Integer id;

    private String name;

    private Integer age;

    private Integer height;

    public Student()
    {
    }
...

2.3 支持多套配置文件

Spring Boot中可以准备多套备用的配置文件,在主配置文件中,可以指定要使用的备用配置文件

图片描述
在主配置文件 application.yaml 中,指定要使用的配置文件:

spring:
  profiles:
    active: file1

配置文件与程序代码是分开的,在运行jar的时候,可以自由使用对应的配置文件

java -jar target/test-0.0.1-SNAPSHOT.jar --spring.profiles.active=file1
3. Controller

3.1 基本注解使用

  • @Controller注解修饰类,标明该类用于处理请求,使用的时候,需要在pom文件中国配置模版引擎,准备templates目录下的html文件。
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

在controller中,通过return指定返回的html模版。

@Controller
public class HelloController
{
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String sayHello()
    {
        return "index";
    }
}

如果不想使用模版,则需要同时标注@ResponseBody注解。

  • @RequestMapping注解用于修饰方法,表示绑定的url和http方法类型。
  • @RestController注解用于修饰类,与@Controller类似,但是不需要使用模版引擎,可以单独直接使用。
    @RestController
    public class HelloController
    {
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String sayHello()
    {
        return "helloworld";
    }
    }
  • @GetMapping,@PostMapping等注解用于修饰方法,作用与@RequestMapping类似。但是因为@GetMapping注解本身已经包含了方法,所以只需要设置路径信息。
    @GetMapping(value = "/hello")
    public String sayHello()
    {
        return "index";
    }

3.2 绑定多个url

只需要给@RequestMapping注解的value字段赋值为一个集合即可。

@RestController
public class HelloController
{
    @RequestMapping(value = {"/hello", "/hi"}, method = RequestMethod.GET)
    public String sayHello()
    {
        return "helloworld";
    }
}

3.3 请求中的参数

参数包含两类,路径参数 @PathVariable 和请求参数 @RequestParam

路径参数举例:

    @GetMapping(value = "/hello/{word}")
    public String sayHello(@PathVariable("word") String word)
    {
        return "index";
    }

请求参数举例如下:

    @GetMapping(value = "/hello")
    public String sayHello(@RequestParam("word") String word)
    {
        return "index";
    }

3.4 请求参数的默认值

    @GetMapping(value = "/hello")
    public String sayHello(@RequestParam(value = "word", required = false, 
        defaultValue = "hello") String word)
    {
        return "index";
    }

3.5 参数合并

我们的controller中可能存在这样的接口,根据用户输入的信息,来创建某一个对象。下边的例子是根据用户提交的信息,创建一个Student对象并且入库。

    @PostMapping(value = "/student")
    public Student studentCreate(@RequestParam("name") String name,
            @RequestParam("age") Integer age,
            @RequestParam("height") Integer height)
    {
        Student student = new Student();
        student.setName(name);
        student.setAge(age);
        student.setHeight(height);

        return save(student);
    }

这段代码看起来没有问题问题,但是扩展性不足,而且参数太多,如果后续还需要再增加100个属性,就需要把新的100个参数也都塞进来。

其实,可以将该接口的参数直接设置为Student类型的对象,这样无论Student类怎么变更,这里都是通用的。

    @PostMapping(value = "/student")
    public Student studentCreate(Student student)
    {
        return save(student);
    }

这里只侧重介绍Spring boot的使用方法,实际使用的时候,注意安全校验哈。

4. 数据库操作

4.1 配置mysql和jpa

在application.yml中配置mysql的连接信息和jpa的ddl策略:

spring:
  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        enable_lazy_load_no_trans: false
      show-sql: true
  datasource:
      username: root
      password: root
      url: jdbc:mysql://192.168.99.100:3306/test
      driver-class-name: com.mysql.jdbc.Driver
  1. ddl-auto指定策略。当指定为create或者update的时候,在程序启动的时候,均为自动创建要使用的数据表。两者的区别在于,当db中已经存在同名表的时候,create会选择删除重建,而update则直接使用。

  2. show-sql字段用于表示是否在控制台显示出最终的sql语句。

4.2 数据表定义

在jpa中,不需要通过sql语句来创建表。对于需要存储的对象,我们只需要在定义的类上边添加 @Entity 注解即可。jpa会创建与该类同结构字段的数据表。@Id 表示主键,@GeneratedValue表示自增。

需要定义无参的构造函数和set/get方法。

@Entity
public class Student
{
    @Id
    @GeneratedValue
    private Integer id;

    private String name;

    private Integer age;

    private Integer height;

    public Student(){}

    // set和get方法
    ...

4.3 定义sql操作

使用jpa会大大提高效率,因为不需要去写sql语句,而是通过java代码实现。
jpa中存在一系列的函数命名规范,开发过程中需要遵守其规范。

extends JpaRepository<类, 主键类型>

根据id查询Student对象。

public interface StudentDao extends JpaRepository<Student, Integer>
{
    public Student findById(Integer id);
}
5. 事务支持

使用 @Transactional 注解修饰方法,保证该方法中的操作都处在同一个事务中。

    @Transactional
    public void insert()
    {
        DbUtil.insertNum(1);
        DbUtil.insertNum(2);
    }
6. 表单验证

我们认为客户提交的数据都是不安全的,对于表单数据,我们可以使用spring boot提供的注解方式进行验证。

下边的例子中,我们设置学生的年龄不能小于7岁。通过 @Min 注解设置最小值,并不满足条件时候的错误信息。

@Entity
public class Student
{
    @Id
    @GeneratedValue
    private Integer id;

    private String name;

    @Min(value = 7, message = "不满足入学年龄")
    private Integer age;

    ...

在rest接口中,添加 @Valid 注解打开校验,并在参数中添加BindingResult 对象,用于获取校验结果。

    @PostMapping(value = "/student")
    public Student studentCreate(@Valid Student student, BindingResult bindingResult)
    {
        if (bindingResult.hasErrors())
        {
            System.out.println(bindingResult.getFieldError().getDefaultMessage());
            return null;
        }
        return save(student);
    }
7. 异常

在spring boot中,如果处理逻辑中抛出了异常,则可以通过定义ControllerAdvice进行统一的处理。

@ControllerAdvice
public class ExceptionHandle
{
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public void handleException(Exception e)
    {
        ...
    }
}

也可以把@ControllerAdvice替换成@RestControllerAdvice,这样就不需要添加@ResponseBody

@RestControllerAdvice
public class ExceptionHandle
{
    @ExceptionHandler(value = Exception.class)
    public void handleException(Exception e)
    {
        ...
    }
}
打开App,阅读手记
17人推荐
发表评论
随时随地看视频慕课网APP