之前一直使用 Python ,学习 Java 基本语法后也一直没能实践,正好部门的测试平台是使用的 Spring Boot 框架开发,借此机会学习一下,未来也能体会一下与 Python 的差异。
带着目标
首先明确我们在本次体验 Spring Boot 中想要实现的功能:
- 一个 Web 接口
- 数据写入数据库中
之所以是这两者,是因为我们在 Web 开发中最遇到的操作就是它们。
而能够实现写入数据库后,其他查、改、删的操作都是类似的。
基础环境
工具 | 版本 |
---|---|
IDEA | 2019.2 |
JDK | 11 |
MySQL | 5.7 |
此处只是个人环境,非推荐环境,环境不一致没太大问题
Spring Boot 插件安装
专业版自带插件,无需安装。
社区版需要在 IDEA 插件中心中搜索 "Spring Assistant" 安装。
项目配置
新建项目
- 选择项目类型 "Spring Initializr"
- 选择对应 SDK,"Initializr Service URL" 选择默认即可,下一步
- 输入项目名称等信息(我保持默认,因此项目为
com.example.demo
),我选择 Maven 作为构建工具 - 选择需要加入的依赖,推荐使用:
- Developer Tools:
- Spring Boot DevTools (修改代码后能自动重启服务)
- Lombok (Java优秀的注解库,可以减少Setter/Getter等代码的编写)
- Web:
- Spring Web Starter (包含Spring项目所需要的组件与容器)
- SQL:
- Spring Data JPA (遵循JPA规范,使用Hibernate持久化数据的库)
- MySQL Driver (数据库驱动)
- Developer Tools:
以上即创建成功一个新项目。
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;
}
可以看到,在使用 lombok
的 Data
注解后,我们的代码简化了很多,不需要再编写字段的 Getter/Setter
和 toString
方法,并且不需要为字段注明数据库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 开发的思想还是一致。接下来在业务代码中继续学习了!