您当前的位置:首页 > 计算机 > 编程开发 > Spring Boot

SpringBoot集成JPA方案---SpringDataJPA

时间:02-13来源:作者:点击数:

概念介绍:

1、JPA主要用在项目中的持久层,是一款持久化框架。它主要是将数据库的CURD进行封装,极大的减少了持久层的代码量,并且极大的提高了开发效率。

2、JPA与SpringBoot整合,需要使用SpringDataJPA组件,该组件出自于Spring家族的SpringData中,SpringData中除了SpringDataJPA之外,还有一些优秀的组件,比如SpringDataElasticSearch、SpringDataRedis、SpringDataRabbitMQ等等。SpringData都将这些组件的API进行了封装,使我们操作起来得心应手!

3、搭建之前需要准备以下:

(1)纯净的SpringBoot项目(避免包冲突)

(2)需要在机器上安装Gradle构建工具。本教程使用的项目构建工具为Gradle,与Maven大同小异,比Maven可读性高。

4、废话不多说了,接下来搭建SpringDataJPA,并使用它完成工作中常用的CRUD。

一、导入SpringDataJPA与MySQL驱动的依赖(如果数据库为Oracle,就导入ojdbc驱动)

dependencies {
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile ('mysql:mysql-connector-java')
testImplementation('org.springframework.boot:spring-boot-starter-test')
}

当然在创建SpringBoot项目时,勾选JPA也可以,这样就可以不用添加依赖了。

二、在application文件中加入相关配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
  jpa:
    hibernate:
      ddl-auto: update   # 建表策略,正向更新数据库表
    open-in-view: true   # 避免懒加载异常
    show-sql: true   # 控制台显示SQL

DataSource解释:

以往在配置数据源时,我们都需要制定driver-class-name,如果使用SpringDataJPA,默认给我们实现了,所以无需再显示为它指定。

注:这里driver-class-name默认采用的是com.mysql.cj.jdbc.Driver,MySQL已经摒弃了古老的com.mysql.jdbc.Driver。

三、创建实体类(可以借助JPA反向生成)

@Entity
@Table(name = "tb_account")
public class Account {

    @Id
    @Column(length = 36)
    private String accountId;

    private String accountUsername;

    private String accountPassword;

    private Boolean AccountGender;

    private Boolean AccountDeleted;

    @Column(columnDefinition = "TIMESTAMP(3) NULL DEFAULT NULL")
    private Timestamp accountLastTime;

    @Column(columnDefinition = "TIMESTAMP(3) NULL DEFAULT NULL")
    private Timestamp accountCreateTime;

    @Column(columnDefinition = "TIMESTAMP(3) NULL DEFAULT NULL")
    private Timestamp accountUpdateTime;

    // Getter与Setter方法省略
}

四、创建Dao持久层接口(CURD接口)

public interface AccountRepository extends JpaRepository<Account, String> {

}

接口解释:

1、这里需要继承JpaRepository泛型接口(param1:实体名, param2:主键类型),这个接口是SpringDataJPA官方接口,后续的CURD主要依赖这个接口来实现。

2、不需要创建实现类,Spring在启动的时候会通过代理反射生成其实现类。

五、创建业务层接口以及实现类(Service层相关接口以及实现类)

Interface:

public interface AccountService {

    Account saveAccount(Account account);


    List<Account> listAccounts();


    Account getAccountById(String id);
}

Implement Class:

@Service
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountRepository accountRepository;

    @Override
    public Account saveAccount(Account account) {
        return accountRepository.save(account);
    }

    @Override
    public List<Account> listAccounts() {
        return accountRepository.findAll();
    }

    @Override
    public Account getAccountById(String id) {
        return accountRepository.findById(id).orElse(null);
    }
}

方法调用解释:

(1)实现类中通过持久层(DAO)层接口来实现相关的CURD接口,我们可以通过DAO接口发现大量的CURD方法,这些方法都是语义化的,通过名称我们就可以能明白方法的含义。(关于CURD接口的命名所对应的含义在文章最下方会附上一张图)

(2)SpringDataJPA正是通过这种严格的方法名,在程序运行期间,动态生成SQL,来实现CURD操作。

(3)这种方式使用与简单的CURD,对于带条件的CURD,我们必须要在DAO层的接口中,手动定义其方法。在自定义方法的时候,JPA会给出提示(包括字段名称以及表操作关键字),非常简单。

六、单元测试CURD

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    @Autowired
    private AccountService accountService;

    @Test
    public void contextLoads() {
        Account account = new Account();
        account.setAccountUsername("zhangsan");
        account.setAccountGender(false);
        account.setAccountPassword("admin");
        accountService.saveAccount(account);

        List<Account> accounts = accountService.listAccounts();
        accounts.forEach(account1 -> {
            System.out.println(account1.toString());
        });
    }
}

注:

1、List集合的forEach方法采用了JDK1.8中的Lamdba表达式,这里也可以通过普通for或者JDK1.5的foreach来loop。

2、可以正常新增数据到MySQL中,也可以查询,由于时间原因,我就给大家演示这些简单的方法,大家可以按照我上面说的完成其他CURD操作。

3、想要了解JDK1.8中的Lamdba表达式以及其他新特性,请到我的JDK1.8新特性系列文章中进行学习!

七:附图(SpringDataJPA接口命名与含义表)供参考!

Keyword Sample JPQL snippet
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Between findByStartDateBetween … where x.startDate between 1? and ?2
LessThan findByAgeLessThan … where x.age < ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1(parameter bound with appended%)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1(parameter bound with prepended%)
Containing findByFirstnameContaining … where x.firstname like ?1(parameter bound wrapped in%)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection<Age> ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection<Age> age) … where x.age not in ?1
True findByActiveTrue() … where x.active = true
False findByActiveFalse() … where x.active = false

文章源代码GitHub仓库:https://github.com/wuyongfei-1/SpringDataJPADemo,大家可以去下载!

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门