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不会改变数据库表结构,一般数据库默认是这个规则 -
updateHibernate会根据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'@'%';