使用Spring Boot整合JPA
下面,重点讲解Spring Boot与JPA的整合使用,具体步骤如下。
(1)添加Spring Data JPA依赖启动器。在项目的pom.xml文件中添加Spring Data JPA依赖启动器,示例代码如下。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
上述代码中,并没有编写Spring Data JPA对应的版本号,这是因为Spring Boot对Spring Data JPA的版本号进行了统一管理。
(2)编写ORM实体类。为了方便操作,以之前创建的数据库表t_comment为例编写对应的实体类,将之前创建的Comment类复制一份并重命名为Discuss,同时参考3.3.1小节介绍添加JPA对应的注解进行映射配置,内容如文件1所示。
文件1 Discuss.java
1 import javax.persistence.*;
2 @Entity(name = "t_comment") // 设置ORM实体类,并指定映射的表名
3 public class Discuss {
4 @Id // 表明映射对应的主键id
5 @GeneratedValue(strategy = GenerationType.IDENTITY) // 设置主键自增策略
6 private Integer id;
7 private String content;
8 private String author;
9 @Column(name = "a_id") //指定映射的表字段名
10 private Integer aId;
11 // 省略属性getXX()和setXX()方法
12 // 省略toString()方法
13 }
(3)编写Repository接口。在chapter03项目中创建名为com.itheima.repository的包,并在该包下创建一个用于数据库表t_comment操作的Repository接口DiscussRepository,内容如文件2所示。
文件2 DiscussRepository.java
1 import com.itheima.domain.Discuss;
2 import org.springframework.data.domain.Pageable;
3 import org.springframework.data.jpa.repository.*;
4 import org.springframework.transaction.annotation.Transactional;
5 import java.util.List;
6 public interface DiscussRepository extends JpaRepository<Discuss,Integer> {
7 // 1、查询author非空的Discuss评论集合
8 public List<Discuss> findByAuthorNotNull();
9 // 2、根据文章id分页查询Discuss评论集合
10 @Query("SELECT c FROM t_comment c WHERE c.aId = ?1")
11 public List<Discuss> getDiscussPaged(Integer aid,Pageable pageable);
12 // 3、使用元素SQL语句,根据文章id分页查询Discuss评论集合
13 @Query(value = "SELECT * FROM t_comment WHERE a_Id = ?1",nativeQuery = true)
14 public List<Discuss> getDiscussPaged2(Integer aid,Pageable pageable);
15 //4、 根据评论id修改评论作者author
16 @Transactional
17 @Modifying
18 @Query("UPDATE t_comment c SET c.author = ?1 WHERE c.id = ?2")
19 public int updateDiscuss(String author,Integer id);
20 // 5、根据评论id删除评论
21 @Transactional
22 @Modifying
23 @Query("DELETE t_comment c WHERE c.id = ?1")
24 public int deleteDiscuss(Integer id);
25 }
文件2中,自定义了一个DiscussRepository接口文件,并编写了对数据库表t_comment数据进行查、改、删操作的方法。
(4)编写单元测试进行接口方法测试。将Chapter03ApplicationTests测试类在当前位置复制一份并重命名为JpaTests用来编写Jpa相关的单元测试,并对内容稍微修改后编写DiscussRepository接口对应的测试方法,内容如文件3所示。
文件3 JpaTests.java
1 import static org.springframework.data.domain.ExampleMatcher.
2 GenericPropertyMatchers.startsWith;
3 ...
4 @RunWith(SpringRunner.class)
5 @SpringBootTest
6 public class JpaTests {
7 @Autowired
8 private DiscussRepository repository;
9 // 1、使用JpaRepository内部方法进行数据操作
10 @Test
11 public void selectComment() {
12 Optional<Discuss> optional = repository.findById(1);
13 if(optional.isPresent()){
14 System.out.println(optional.get());
15 }
16 System.out.println();
17 }
18 // 2、使用方法名关键字进行数据操作
19 @Test
20 public void selectCommentByKeys() {
21 List<Discuss> list = repository.findByAuthorNotNull();
22 System.out.println(list);
23 }
24 // 3、使用@Query注解进行数据操作
25 @Test
26 public void selectCommentPaged() {
27 Pageable pageable = PageRequest.of(0,3);
28 List<Discuss> allPaged = repository.getDiscussPaged(1, pageable);
29 System.out.println(allPaged);
30 }
31 // 4、使用Example封装参数进行数据查询操作
32 @Test
33 public void selectCommentByExample() {
34 Discuss discuss =new Discuss();
35 discuss.setAuthor("张三");
36 Example<Discuss> example = Example.of(discuss);
37 List<Discuss> list = repository.findAll(example);
38 System.out.println(list);
39 }
40 @Test
41 public void selectCommentByExampleMatcher() {
42 Discuss discuss =new Discuss();
43 discuss.setAuthor("张");
44 ExampleMatcher matcher = ExampleMatcher.matching()
45 .withMatcher("author",startsWith());
46 Example<Discuss> example = Example.of(discuss, matcher);
47 List<Discuss> list = repository.findAll(example);
48 System.out.println(list);
49 }
50 }
文件3中,使用注入的DiscussRepository实例对象编写了多个单元测试方法针对DiscussRepository接口中的方法进行调用测试。通过示例中的代码注释可以看到,测试方法中分别使用了JpaRepository默认方法、方法名关键字、@Query注解和Example封装参数的形式进行了数据操作。
(5)整合测试。选择JpaTests测试类中的selectCommentByExampleMatcher()方法进行效果演示说明(其他方法读者可以自行演示查看)。此处为了方便查看结果,选择使用Debug的方式执行单元测试,控制台效果如图1所示。
图1 selectCommentByExampleMatcher()方法执行结果
从图1可以看出,selectCommentByExampleMatcher()方法执行成功,查询出了评论作者author以“张”开头的评论详情,这也就说明Spring Boot整合JPA成功。