概念介绍:
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。
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也可以,这样就可以不用添加依赖了。
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。
@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方法省略
}
public interface AccountRepository extends JpaRepository<Account, String> {
}
接口解释:
1、这里需要继承JpaRepository泛型接口(param1:实体名, param2:主键类型),这个接口是SpringDataJPA官方接口,后续的CURD主要依赖这个接口来实现。
2、不需要创建实现类,Spring在启动的时候会通过代理反射生成其实现类。
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会给出提示(包括字段名称以及表操作关键字),非常简单。
@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新特性系列文章中进行学习!
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,大家可以去下载!