Spring Boot学习笔记(二)简单CRUD实现

开发配置

依赖包准备

这里选用mysql作为数据库,需要用到的包有三个,需要将相关依赖写入pom.xml,如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
  </dependency>
    
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>

数据库连接设定

在src/main/resources/application.properties文件中,加入以下配置信息:

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.tomcat.max-idle=10
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.min-idle=5
spring.datasource.tomcat.initial-size=5

其中test是数据库名称,username和password可自行设置和修改

实体定义

我们将要操作的实体很简单,只有一个id属性和一个name属性。定义如下:

@Entity
@Table(name="T_USER")
public class User {

    /**
     * 用户ID
     */
    @Id
    @GeneratedValue
    private int id;
    
    /**
     * 用户名
     */
    private String name;

    // GETTER和SETTER此处省略...
}

<说明>

  1. @Entity注解,表明了这是一个Entity,可以使用默认的ORM规则,即class名即为要更新的数据表名
  2. @Table注解,可以指定这个Entity要更新的数据表名,也不使用默认的ORM规则。
  3. @Id注解,表明了这个数据表的主键ID,这个主键可以是AUTO_INCREMENT类型的数据。

备忘
在测试中,此处的id类型使用Integer会报错,原因尚不清楚,使用int则无问题。

路由设置

以简单的User对象为例,我们来实现一个简(chou)单(lou)的的CRUD处理

Restful风格

对于简单的增删改查功能,一般的restful接口定义如下:

GET    /user        # 取得user列表
POST   /user        # 提交user
PUT    /user        # 更新user
PATCH  /user        # 更新user(个别属性)
DELETE /user/:id    # 删除user

路由设置

对于纯数据的Java后端架构来讲,MVC中少了View,但M和C仍是必不可少的。Model用于管理数据实体及持久化相关的处理,Controller则是整个业务的核心。

首先,对于user的每个接口,我们在controller中定义对应请求接收方法:

@RestController
@RequestMapping("/user")
public class UserController {
    
    @Autowired
    private UserService userService;

    @GetMapping("")
    public ResponseEntity<?> getList() {
        return new ResponseEntity<Object>(userService.getUserList(), HttpStatus.OK);
    }
    
    @PostMapping("")
    public ResponseEntity<?> create(@RequestBody User user) {
        return new ResponseEntity<User>(userService.save(user), HttpStatus.CREATED);
    }

    @PatchMapping("")
    public ResponseEntity<?> update(@RequestBody User user) {
        return new ResponseEntity<User>(userService.save(user), HttpStatus.ACCEPTED);
    }
    
    @DeleteMapping("/{id}")
    public ResponseEntity<?> remove(@PathVariable("id") int id) {
        userService.remove(id);
        return new ResponseEntity<User>(HttpStatus.ACCEPTED);
    }
}

<说明>

  1. @RestController注解,表明这个controller专门用于Restful服务,返回值不是传统的WEB数据。
  2. @RequestMapping注解,表明访问的相对路径为“/user"
  3. @GetMapping、@PostMapping、@PatchMapping和@DeleteMapping分别对应了GET、POST、PATCH和DELETE请求,这四个方法将分别接收对应访问路径上对应方法的HTTP请求。它们也可用@RequestMapping(value="", method=RequestMethod.POST(或者GET、PATCH等)来替代。
  4. @PathVariable用于取得访问路径中的参数
  5. ResponseEntity用于返回处理结果与错误码

上面通过UserService的调用,实现了user的CRUD操作。Spring通过@Autowired注解,会自动创建UserService的实例。

CRUD操作

通过UserService的相关操作,我们可以很容易的对user表进行CRUD操作。代码如下:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepo;
    
    public Iterable<User> getUserList() {
        return userRepo.findAll();
    }
    
    public User save(User user) {
        return userRepo.save(user);
    }
    
    public void remove(int id) {
        userRepo.delete(id);
    }
}

<说明>

  1. 通过@Service注解,Spring会自动实例化到UserController中
  2. Service中注解了@Autowired的实例userRepo,实际上是继承了CrudRepository的一个接口。Repository在Spring的概念体系中是类似于传统DAO的实体,一个Repository对应一个数据表的操作。
  3. UserService中使用的findAll、save和delete方法,均是CrudRepository中预定义的方法。

对于UserRepository来讲,仅仅是一个简单的继承了CrudRepository的接口。代码如下:

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

结果确认

简单接口测试可使用POSTMAN进行,结果如下:

取得用户列表

插入2条数据

取得用户列表

更新用户

删除用户

取得用户列表

待改进事项

目前只是实现了一个简单的CRUD操作,就这个简单流程来讲,以下几点尚欠缺:

  1. 返回值需要有结构化的设计
  2. 分页和排序功能也有欠缺。
  3. 缺少自动化测试
本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院