用Spring构建RESTful服务

67 阅读2分钟

Spring中通过controller处理http请求。这些服务通常添加@RestController注解。

@RestController效果是返回一个普通的domain对象,而不是一个View。

它等价于 @Controller@ResponseBody

Spring有一个Http消息转换器,它可以自动将domain对象转成JSON。如果jackson2在classpath中,Spring会选择 MappingJackson2HttpMessageConverter作为转换器。

@SpringBootApplication 等价于:

  • @Configuration 标记这个类是一个Bean配置类
  • @EnableAutoConfiguration 根据classpath、bean配置、和Property配置来进行自动装配,比如如果classpath中存在spring-webmvc,Spring会启动一个包含DispatcherServlet的web应用。

访问Mysql数据

可以通过Spring Data JPA访问Mysql数据库。

Spring 会默认提供所有,包括一个默认的H2数据库。如果你需要使用其他数据库,可以在application.properties文件中指定。

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://xxx
spring.datasource.username=xxx
spring.datasource.password=xxx
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto 取值如下:

  • none 不会改变数据库表结构,一般数据库默认是这个规则

  • update Hibernate会根据Entity的结构修改数据库表结构

  • create 每次都会创建数据库表

  • create-drop  每次都会创建表,当SessionFactory关闭,会drop所有表。像H2这些embedded数据库默认是这个规则

    比较安全的做法是,如果你的数据库在生产环境了,设置为 none,回收所有用户连接的权限,只保留 Select,Update,Insert和Delete的权限。

使用@Entity创建实体模型

import jakarta.persistence.Entity;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    Integer id;

    String name;

    String email;

    // getter setter
}

Hibernate会自动将这个实体转换成对应的表结构。

创建Repository

import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepsitory<User, Integer> {
}

Spring 会自动创建一个Bean实现这个接口。Bean的名字取 userRepository

在Controller层使用

@RestController
public class MainController {

    @Autowired
    UserRepository userRepository;
    
    @PostMapping(path="/add")
    public String addNewUser(@RequestParam String name, @RequestParam String email) {
        User n = new User();
        n.setName(name);
        n.setEmail(email);
        userRepository.save(n);
        return "Saved";
    }

    @GetMapping(path="/all")
    public Iterable<User> getAllUsers() {
        return userRepository.findAll();
    }
}

附mysql权限操作:

取消权限:
mysql> revoke all on db_example.* from 'springuser'@'%';

添加权限:
mysql> grant select, insert, delete, update on db_example.* to 'springuser'@'%';