深入理解Spring Cloud与微服务构建(第2版)
上QQ阅读APP看书,第一时间看更新

4.5 Spring Boot整合JPA

JPA全称为JAVA Persistence API,它是一个数据持久化框架。JPA的目标是制定一个由很多数据库供应商实现的API,开发人员可以通过编码实现该API。目前,在Java项目开发中提到JPA一般是指用Hibernate的实现,因为在Java的ORM框架中,只有Hibernate实现得最好。本节以案例的形式来讲述如何在Spring Boot工程中使用JPA。另外,案例使用的数据库为MySQL数据库,需要读者提前安装好。

(1)新建一个Spring Boot项目

在Spring Boot工程的pom文件依次引入Web功能的起步依赖spring-boot-starter-web、JPA的起步依赖spring-boot-starter-data-jpa、MySQL数据库的连接器的依赖mysql-connector-java,其代码如下:

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>

(2)配置数据源

在工程的配置文件application.yml文件中加上相应的配置,需要配置两个选项:DataSource数据源的配置和JPA的配置。其中,数据源的配置包括连接MySQL的驱动类(例如com.mysql. jdbc.Driver)、MySQL数据库的地址Url(需要提前在数据库中创建数据库名spring-cloud的库)、MySQL数据库的用户名username和密码password。JPA的配置包括hibernate. ddl-auto配置,配置为create时,程序启动时会在MySQL数据库中建表;配置为update时,在程序启动时不会在MySQL数据库中建表;jpa.show-sql配置为在通过JPA操作数据库时是否显示操作的SQL语句。配置代码如下:

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spring-cloud?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&serverTimezone=GMT%2B8
    username: root
    password: 123456
  jpa:
    hibernate:
      ddl-auto: create  # 第一次建表用create,后面用update
    show-sql: true

(3)创建实体对象

通过@Entity注解表明该类是一个实体类,它和数据库的表名相对应;@Id注解表明该变量对应于数据库中的Id,@GeneratedValue注解配置Id字段为自增长;@Column表明该变量对应于数据库表中的字段,unique = true表明该变量对应于数据库表中的字段为唯一约束。代码如下:

@Entity
public class User {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
     @Column(nullable = false,  unique = true)
     private String username;
     @Column
     private String password;
  …//省略了getter、setter
}

(4)创建DAO层

数据访问层DAO,通过编写一个UserDao类,该类继承JpaRepository的接口,继承之后就能对数据库进行读写操作,包含了基本的单表查询的方法,非常方便。在UserDao类写一个findByUsername的方法,传入参数username,JPA已经实现了根据某个字段去查找的方法,所以该方法可以根据username字段从数据库中获取User的数据,不需要做额外的编码。代码如下:

public interface UserDao extends JpaRepository<User, Long>{
     User findByUsername(String username);
}

(5)创建Service层

在UserService类中注入UserDao,并写一个根据用户名获取用户的方法,代码如下:

@Service
public class UserService {
    @Autowired
    private UserDao userRepository;
    public User findUserByName(String username){
       return userRepository.findByUsername(username);
    }
}

(6)创建Controller层

在UserController类写一个Get类型的API接口,其中需要说明的是@PathVariable注解,可以获取RESTful风格的Url路径上的参数。

@RequestMapping("/user")
@RestController
public class UserController {
    @Autowired
    UserService userService;
    @GetMapping("/username/{username}")
    public User getUser(@PathVariable("username")String username){
       return userService.findUserByName(username);
    }
}

启动运行程序,控制台输出的日志如下:

Hibernate: drop table if exists user
Hibernate: create table user (id bigint not null auto_increment, password varchar(255), username varchar(255) not null, primary key (id))

可见,JPA在启动程序时在数据中创建了user表。在终端上用命令行show tables,确实发现user表被创建了。这时在数据库中插入一条数据:

insert into 'user'(username,password) VALUES('forezp','123456');

再打开浏览器,在浏览器中输入“localhost:8080/user/username/forezp”,可以从数据库读取username字段为forezp的用户对象,浏览器显示的数据如下:

{"id":1,"username":"forezp","password":"123456"}