本篇概述
上一篇中我们已经介绍了在SpringBoot项目中怎么修改默认配置参数,并且我们还掌握了怎么获取配置文件中自定义参数。在这一篇中我们将介绍SpringBoot对数据库的操作。既然是对数据库的操作,那难免有一些配置的参数。例如数据库的连接、数据库账号及数据库密码等。所以掌握上篇中的内容很重要。除此之外,我们还要介绍一下用什么样的技术来操作数据库。操作数据库的技术有很多例如比较常见的JDBC、Mybatis、Hibernate等。在SpringBoot的项目中为我们提供了另外一种操作数据库的技术,也就是JPA。我们可以通过JAP中提供的方式来非常方便的操作数据库。下面我们首先添加SpringBoot对数据库的配置参数。具体参数如下:
数据库配置
spring:
profiles:
active: dev
datasource:
url: jdbc:mysql://localhost:3306/springboot?useSSL=false&characterEncoding=utf8
username: root
password: jilinwula
driver-class-name: com.mysql.jdbc.Driver
jpa:
hibernate:
ddl-auto: create
show-sql: true
spring.jpa.hibernate.ddl-auto参数详解
上面的配置参数比较简单,我们就不详细介绍了,我们只介绍spring.jpa.hibernate.ddl-auto参数。该参数的作用是自动操作表结构。且该参数有4种选项,下面我们详细介绍一下这4种的区别。
- create: 当我们启动SpringBoot项目时,会自动为我们创建与实体类对应的表,不管表中是否有数据。也就是如果指定参数为create时,当项目启动后,该表的数据一定为空。因为该参数的处理方式,是先将表删除后,然后在创建新的表。
- create-drop: 当我们启动项目时也会我们自动创建表,但当我们的项目运行停止后,它会自动为我们删除表,并且该参数为create一样在启动时也会先把表删除后,然后在创建。
- update: 每当我们启动项目时,如果表不存在,则会根据实体类自动帮我们创建一张表。如果表存在,则会根据实体类的变化来决定是不是需要更新表,并且不管更不更新表都不会清空原数据。
- validate: 当我们启动项目时会验证实体类中的属性与数据库中的字段是否匹配,如不匹配则报错。
添加相关依赖
如果我们按照上面的方式配置完后,则会发现上面的driver-class-name参数会报红显示,原因是没有找到相关的依赖。并且在SpringBoot的项目中如果想用JPA功能的除了要引入Mysql的依赖外,还要引入Jpa的依赖。具体依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
当我们添加完上面的依赖后发现配置文件中的driver-class-name参数已经不报红显示了,这就表示我们的依赖引入成功了。
spring.jpa.hibernate.ddl-auto参数验证
下面我们创建一个实体类,来验证一下,上面的spring.jpa.hibernate.ddl-auto参数是不是上面说的那样。我们首选验证当参数为create时。下面为实体类的代码:
package com.jilinwula.springboot.helloworld.entity;
import lombok.Data;
import javax.persistence.*;
@Data
@Entity
@Table(name = "user_info")
public class UserInfoEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
}
上面实体类中我们指定了几个注解,下面我们详细介绍一下它们的作用:
实体类详解
- @Data: 自动生成GET和SET方法的注解,在上一篇中我们已经介绍过了,该注解可以在类上和属性中添加。如果添加在类上,是表示自动为该实体类的所有属性创建GET和SET方法。如果添加到属性中则表示只会为该属性添加GET和SET方法。这样我们就没必要为代码中生成大量的GET和SET烦恼了。这时可能有人会想到那如果我只想让它帮我生成GET方法或者只想生成SET方法时应该怎么办呢?别着急,既然你想到了,那么开发这个注解的人也想到了,我们只需要将上面的@Data注解修改为相应的@Getter或者@Setter注解即可。它们正好对应的生成GET和SET方法。
- @Entity: 实体类注解。只有标识该注解的类,JPA才能自动将这个类中的属性和数据库进行映射。
- @Table: 标识该实体类和数据库中哪个表进行映射。
- @Id: 标识该自动为主键标识。
- @GeneratedValue: 标识主键的生成规则。这个在后面的文章中在做详细介绍。
现在我们一切准备就绪了,我们只要启动一下SpringBoot的项目就可以了,看看会不会自动为我们创建一张userinfo的表。(备注:数据库需要我们自己创建)。我们首先确认一下数据库中确实没有userinfo这张表。
下面我们启动一下SpringBoot的项目,看一下数据库中有没有创建新的表。
我们看JPA确实为我们创建了一张和实体类中@Table注解指定的表,并且表中的字段和实体类中的属性一致。下面我们手动向表中添加一条数据,然后重新启动项目,看看项目启动后,这条新增的数据还是否存在。
我们只新增了一条数据,然后重启启动项目后,在看一下数据中的userinfo表,看看该数据还有没有。
我们发现刚刚添加的那条数据已经没有了,这也就恰恰证明了,我们上面所有说当spr