阅读 1067

Spring Boot 初探 - 接口和数据库操作

之前一直使用 Python ,学习 Java 基本语法后也一直没能实践,正好部门的测试平台是使用的 Spring Boot 框架开发,借此机会学习一下,未来也能体会一下与 Python 的差异。

带着目标

首先明确我们在本次体验 Spring Boot 中想要实现的功能:

  • 一个 Web 接口
  • 数据写入数据库中

之所以是这两者,是因为我们在 Web 开发中最遇到的操作就是它们。

而能够实现写入数据库后,其他查、改、删的操作都是类似的。

基础环境

工具 版本
IDEA 2019.2
JDK 11
MySQL 5.7

此处只是个人环境,非推荐环境,环境不一致没太大问题

Spring Boot 插件安装

专业版自带插件,无需安装。

社区版需要在 IDEA 插件中心中搜索 "Spring Assistant" 安装。

项目配置

新建项目

  1. 选择项目类型 "Spring Initializr"
  2. 选择对应 SDK,"Initializr Service URL" 选择默认即可,下一步
  3. 输入项目名称等信息(我保持默认,因此项目为 com.example.demo),我选择 Maven 作为构建工具
  4. 选择需要加入的依赖,推荐使用:
    • Developer Tools:
      • Spring Boot DevTools (修改代码后能自动重启服务)
      • Lombok (Java优秀的注解库,可以减少Setter/Getter等代码的编写)
    • Web:
      • Spring Web Starter (包含Spring项目所需要的组件与容器)
    • SQL:
      • Spring Data JPA (遵循JPA规范,使用Hibernate持久化数据的库)
      • MySQL Driver (数据库驱动)

以上即创建成功一个新项目。

pom.xml

因为使用的 Spring Initializr 创建项目,pom.xml 中的依赖坐标都已经配置好,无需修改。

添加数据库配置

修改 src/main/resouces/application.properties 文件,添加下面内容:

# 数据库配置
# 数据库连接地址,jpa库需要提前创建好
spring.datasource.url=jdbc:mysql://localhost:3306/jpa?useSSL=false
# 数据库账号
spring.datasource.username=root
# 数据库密码
spring.datasource.password=123456
# 数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# JPA 配置
# 自动处理对象关系映射,允许自动建表等操作
spring.jpa.hibernate.ddl-auto=update
# 是否在控制台显示数据库语句
spring.jpa.show-sql=true
复制代码

关于 spring.jpa.hibernate.ddl-auto 的配置,有如下几个选项:

  • validate: 加载 Hibernate 时,验证创建数据库表结构
  • create: 每次加载 Hibernate ,重新创建数据库表结构
  • create-drop: 加载 Hibernate 时建表,退出时删除表结构
  • update: 加载 Hibernate 自动更新数据库表结构

代码实现

数据库操作

实体类

实体类是对一个实体对象的代码描述。

在实体类中建立与数据库表和字段的关系映射(ORM),使得通过操作实体类就完成对数据库的增删改查操作。

以创建一个 "Book" 实体类为例,假设我们期望操作的表名为 "t_book":

// 标记此类为实体类
@Entity
// 设置操作的数据库表
@Table(name="t_book")
public class Book{
    // 设置主键
    @Id
    // 字段值的生成策略,暂不展开说明,可以私下查一下
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    // 配置字段属性,可以不需要
    @Column(length = 32)
    private String name;

    // 添加字段的 getter/setter 方法
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
复制代码

代码有些长,可以使用 Lombok 进行简化。

*使用 Lombok 简化代码

Lombok 是一个 Java 实用工具,可以通过注解来帮助开发人员消除冗长的 Java 代码,应用在我们的实体类上的效果如下:

@Entity
@Table(name="t_book")
@Data
public class Book{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
}
复制代码

可以看到,在使用 lombokData 注解后,我们的代码简化了很多,不需要再编写字段的 Getter/SettertoString 方法,并且不需要为字段注明数据库Column,只需要保留主键的 @Id 注解即可。

DAO 类

实体类 Book 只是建立了对象关系映射,还需要创建一个 DAO 类简化持久化过程(save/delete等)。

import org.springframework.data.jpa.repository.JpaRepository;
public interface BookDao extends JpaRepository<Book, Integer> {
}
复制代码

方法在 JpaRepository 中已经实现,不需要额外编写。

测试用例

创建一个测试用例,用来测试数据的写入:

@RunWith(SpringRunner.class)
@SpringBootTest
public class BookTests {
    @Autowired
    public BookDao bookDao;

    @Test
    public void testBook() {
        Book book = new Book();
        book.setName("book1");
        bookDao.save(book);
    }
}
复制代码

测试用例通过,查询数据库的 t_book 表可以看到已经插入一条数据。

Web 接口

还是从最简单的开始实现,先写一个接收 GET 请求的接口,返回 "Hello, Spring Boog!" 响应内容:

@RestController
@RequestMapping("/")
public class HelloController {
    @RequestMapping("/hello")
    public String index(){
        return "Hello, Spring Boot!";
    }
}
复制代码

右键运行项目的 DemoApplication ,启动后,访问 0.0.0.0:8080/hello 看到浏览器输出 "Hello, Spring Boot!" ,一个最简单的接口就创建成功了。

总结

之前对 Java 的印象是繁琐,声明多、配置多。但是在体验了 Spring Boot 后,特别是使用了一些初始化插件进行创建项目后可以发现,其实最基础的代码框架 Spring Boot 已经为我们生成好,不过是需要理解一些框架或者库的用法,大体 Web 开发的思想还是一致。接下来在业务代码中继续学习了!