SpringBoot(二)整合SpringDataJPA

Spring Data JPA概述

Spring Data JPA简介

它是Spring基于ORM框架、JPA规范封装的一套JPA应用框架,可使开发者用极简
的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,
且易于扩展!学习并使用Spring Data JPA可以极大的提供开发效率。

Spring Data JPA作用

主要看看Spring Data JPA提供的编程接口:
- Repository:最顶层的接口。是一个空接口,目的是为了统一所有的Repository
的类型,且能让组件扫描的时候自动识别。
- CrudRepository:Repository的子接口,提供CRUD功能。
- PagingAndSortingRepository:CrudRepository的子接口,添加分页排序功能。
- JpaRepository:PagingAndSortingRepository的子接口,增加批量操作等功能。
- JpaSpecificationExecutor:用来做复杂查询的接口。

接口继承关系图


Spring Data Repository的核心接口是Repository。这个接口需要领域类(Domain Class)
跟领域类的ID类型作为参数。这个接口主要是让你能知道继承这个类的接口的类型。
CrudRepository 供了对被管理的实体类的一些常用CRUD方法。

Spring DAata JPA的优势

开发中对数据库的操作大多为增删改查,开发者重复大量且枯燥的代码来实现这部分逻辑
Spring-data-jpa**使数据访问层变成只是一层接口的编写方式。**
Spring-data-jpa 只需要一个继承了JpaRepository的接口就能实现数据的访问

public interface UserRepository extends JpaRepository<User, Long> {

    User findByName(String name);

    @Query("from User u where u.name=:name")
    User findUser(@Param("name") String name);

}

SpringBoot整合SpringDataJPA

1.SpringBoot集成SpringData-JPA依赖
<!-- SpringData-Jpa依赖-->
<dependency
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- mysql驱动:com.mysql.jdbc.Driver -->
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.29</version>
</dependency>
2.数据库连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/studyjdbc
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.properties.hibernate.hbm2ddl.auto=update

Spring-data-jpa依赖于Hibernate
spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置属性
主要作用是:自动创建、更新、验证数据库表结构
参数配置介绍:
- create
每次加载hibernate时都会删除上一次的生成的表,
然后根据model类重新生成表,哪怕没有改变,
这是导致数据库表数据丢失的一个重要原因。
- create-drop
每次加载hibernate时根据model类生成表,但sessionFactory关闭时,表自动删除。
- update(最常用)
首次加载hibernate时根据model类自动建立起表结构(要先建立数据库)
以后加载hibernate时根据model类自动更新表结构,即使表结构变了,老数据不删除。
注意:当部署到服务器后,表结构不会立即建立起来,应用首次运行后才会建立表结构。
- validate
每次加载hibernate时,验证创建数据库表结构,和数据库表比较,不创建新表,会插入新值。

3.创建实体类

创建User实体,会被映射到数据库
根据配置项 hibernate.hbm2ddl.auto,应用启动时自动创建表

4.创建数据访问接口
  • 一般的,对于数据访问层,需要创建一个接口来规定对数据操作的一系列方法,再创建DAO来实现此接口,
    从而实现对数据库的访问.
  • Spring-data-jpa,对数据访问,只需继承Spring-data-jpa提供的接口(这里以JpaRepository为例)
    即可完成对数据的访问
package com.jxlg.lance.springdatajpastudy.dao;

import com.jxlg.lance.springdatajpastudy.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

/**
 * @author lance(ZYH)
 * @function 用户管理的dao
 * @date 2018-03-26 11:21
 */
public interface UserRepository extends JpaRepository<User,Long> {

    User findByName(String name);

    User findByNameAndAge(String name, Integer age);

    @Query("from User u where u.name=:name")
    User findUser(@Param("name") String name);

}
  • 以上即可实现数据库的访问,无需再写实现类.
  • JpaRepository接口实现的数据库操作方法
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    List<T> findAll();

    List<T> findAll(Sort var1);

    List<T> findAllById(Iterable<ID> var1);

    <S extends T> List<S> saveAll(Iterable<S> var1);

    void flush();

    <S extends T> S saveAndFlush(S var1);

    void deleteInBatch(Iterable<T> var1);

    void deleteAllInBatch();

    T getOne(ID var1);

    <S extends T> List<S> findAll(Example<S> var1);

    <S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
5.单元测试
  • save
package com.jxlg.lance.springdatajpastudy.dao;

import com.jxlg.lance.springdatajpastudy.SpringdatajpastudyApplication;
import com.jxlg.lance.springdatajpastudy.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import static org.junit.Assert.*;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringdatajpastudyApplication.class)
public class UserRepositoryTest {
    @Autowired
    private UserRepository userRepository;

    @Test
    public void test() {
        userRepository.save(new User("张三",12));
        userRepository.save(new User("李四",24));
        userRepository.save(new User("王五",36));
        userRepository.save(new User("王麻子",48));
        userRepository.save(new User("狗不理",56));
        System.out.println("执行成功!");
    }
}

  • findAll
  Assert.assertEquals(5, userRepository.findAll().size());
        List<User> userList = userRepository.findAll();
        for (User user : userList){
            System.out.println(user.getName()+":"+user.getAge());
        }
  • 测试其他方法
        // 测试findByName, 查询姓名为张三的User.Age=12
        Assert.assertEquals(12, userRepository.findByName("张三").getAge().longValue());

        // 测试findUser, 查询姓名为王五的User.Age=36
        Assert.assertEquals(36, userRepository.findUser("王五").getAge().longValue());

        // 测试findByNameAndAge, 查询姓名为王麻子并且年龄为48的User
        Assert.assertEquals("王麻子", userRepository.findByNameAndAge("王麻子", 48).getName());

        // 测试删除姓名为狗不理的User
        userRepository.delete(userRepository.findByName("狗不理"));

        // 测试findAll, 删除后为4条记录
        Assert.assertEquals(4, userRepository.findAll().size());
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值