SpringBoot学习(二)--构建RESTFUL API并用JdbcTemplate进行存储
2018-02-17 10:14
801 查看
RESTFUL API
首先,REST是所有Web应用都应该遵守的架构设计指导原则。面向资源是REST最明显的特征,对于同一个资源的一组不同的操作。在这里我们是对一个User对象进行操作。增删改查。REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。(7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS)REST总是使用http协议。有下列几个常用操作。
GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
DELETE(DELETE):从服务器删除资源。
构造User对象(/domain)
public class User { private Long id; private String name; private Integer age; public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } }
实现对User对象的操作接口(/web)
import com.kaihong.springboot.domain.User; import com.kaihong.springboot.domain.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/users") public class UserController { @Autowired UserDao userDao;//对user进行增删改查的dao @RequestMapping(value="/", method = RequestMethod.GET) public String getUsersSum(){ //处理“/users/"的GET请求。获取现在数据库中的总的user数量 return userDao.getAllUsers().toString(); } @RequestMapping(value="/", method = RequestMethod.POST) public String postUser(@ModelAttribute User user){ // 处理"/users/"的POST请求,用来创建User userDao.create(user.getName(),user.getAge()); return "success"; } @RequestMapping(value="/{id}", method = RequestMethod.GET) public User getUser(@PathVariable Long id){ //处理"/users/id"的GET请求,用来通过id获取User对象 return userDao.getUserById(id); } @RequestMapping(value="/{id}", method = RequestMethod.PUT) public String putUser(@PathVariable Long id, @ModelAttribute User user){ // 处理"/users/{id}"的PUT请求,用来更新User信息 userDao.updateById(id, user); return "success"; } @RequestMapping(value="/{id}", method = RequestMethod.DELETE) public String deleteUser(@PathVariable Long id){ //处理"/users/id"的DELETE请求,用来根据id删除User userDao.deleteAllUsers(); return "success"; } }
为了连接数据库,需要添加依赖如下
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.21</version> </dependency>
在application.properties中配置数据库的信息,数据库的名称,用户名密码要更改。
spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver
Spring的JdbcTemplate是自动配置的,你可以直接使用@Autowired来注入到你自己的bean中来使用。
定义包含有插入、删除、查询的抽象接口UserDao(/domain)
package com.kaihong.springboot.domain; public interface UserDao { void create(String name, Integer age); void deleteByName(String name); Integer getAllUsers(); void deleteAllUsers(); User getUserById(Long id); void updateById(Long id, User u); }
通过JdbcTemplate实现UserService中定义的数据访问操作
package com.kaihong.springboot.domain; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service("userDao") public class UserDaoImpl implements UserDao { @Autowired private JdbcTemplate jdbcTemplate; @Override public void create(String name, Integer age) { jdbcTemplate.update("insert into USER(NAME, AGE) values(?,?)",name,age); } @Override public void deleteByName(String name) { jdbcTemplate.update("delete from USER where name=?", name); } @Override public Integer getAllUsers() { return jdbcTemplate.queryForObject("select count(1) from USER",Integer.class); } @Override public void deleteAllUsers() { jdbcTemplate.update("delete from USER"); } @Override public User getUserById(Long id){ User u=new User(); String name=jdbcTemplate.queryForObject("select name from USER where id=?", String.class, new Object[]{id}); Integer age=jdbcTemplate.queryForObject("select age from USER where id=?", Integer.class, new Object[]{id}); u.setAge(age); u.setId(id); u.setName(name); return u; } @Override public void updateById(Long id, User u){ jdbcTemplate.update("update USER set name=?, age=? where id=?",u.getName(),u.getAge(),id); } }
jdbcTemplate的操作简单。直接用@Autowired注解就可以注入。
测试
刚开始是使用JUnit进行测试。但是正确处理http请求后从test跳转到UserController时userDao总是注入失败,空指针异常,查了很久都不知道怎么解决。网上大多是非Controller下注入失败的例子,可能是Junit不熟,之后再回来解决。Caused by: java.lang.NullPointerException
at com.kaihong.springboot.controller.UserController.getUsersSum(UserController.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
… 38 more
最后使用Postman进行测试,不会注入失败。Postman官网下载即可。
这是post请求发送内容的例子。
最后测试成功。
一些注解
@Autowired:@Autowired是一种函数,可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作,@Autowired标注可以放在成员变量上,也可以放在成员变量的set方法上。在这里我就直接用来导入一整个Dao。@Autowired是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Qualifier使用。比如接口Persion有两个实现类,Student和Teacher。为了确定实例化时是哪个就需要
@Autowired @Qualifier("student") private Persion persion;
这样实例化的就是Student.在上面的例子中因为UserDao只有一个实现类,所以可以不需要。另外要注意的是这里的Qualifier要配合Service使用,见下。
@Service:@Service表示告诉Spring创建这个类的实例。一个接口有多个实现类时,需要在增加名字,如@Service(“student”),@Service(“teacher”).这样就能跟@Qualifier配合使用了。
相关文章推荐
- SpringBoot学习系列 | 构建一个较为复杂的RESTful API以及单元测试
- Spring Boot构建RESTful API与单元测试
- springboot集成swagger2构建RESTful API文档
- Spring Boot 构建 Restful API 和测试
- Spring Boot教程(十八)构建RESTful API
- springboot集成swagger2构建RESTful API文档
- 企业分布式微服务云SpringCloud SpringBoot mybatis (三)Spring Boot构建RESTful API与单元测试
- Spring Boot-构建一个复杂的RESTful API及单元测试
- springboot集成swagger2,构建优雅的Restful API doc
- Spring Boot构建RESTful API与单元测试
- Springboot中使用Swagger2构建RESTful API文档
- Spring Boot构建RESTful API与单元测试
- 企业分布式微服务云SpringCloud SpringBoot mybatis (三)Spring Boot构建RESTful API与单元测试
- 基于spring-boot使用Swagger构建restful api文档
- Spring Boot构建RESTful API与单元测试
- SpringCloud SpringBoot mybatis 分布式微服务(三)Spring Boot构建RESTful API与单元测试
- Spring Boot 2.0.0.M7 中使用Swagger2构建RESTful API文档
- springboot 学习笔记【5】使用Swagger2构建RESTful APIs
- Spring Boot 构建一个较为复杂的RESTful API以及单元测试
- Spring Boot构建RESTful API与单元测试