学科分类
目录
Spring Boot开发

使用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成功。

点击此处
隐藏目录