Spring Data JPA相关——初识Spring Data JPA

什么是JPA?

JPA指Java Persistence API,用于对象持久化的 API。JPA可以说是一种规范,是Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层。

像Hibernate,TopLink,Mybatis这些ORM框架可以说是JPA的实现。

spring data jpa和hibernate

  • hibernate

Hibernate是一个开放源代码的对象关系映射框架,对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲就地使用 对象编程思维来提纵数据库,并且对象有自己的生命周期,着力对象与对象之间的关系,有自己的HQL查询语言,所以数据库移 植性很好。Hibemate是完备的ORM框架,是符合JPA规范的。Hibemate有自己的缓存机制。从上手的角度来说比较难,比较适合 企业级的应用系统开发。

  • Spring Data JPA

可以理解为JPA规范的再次封装抽象,底层还是使用了Hibernate 的JPA技术实现,引用JPQL (Java Persistence Query Language) 查 询语言,属于Spring整个生态体系的一部分。随着Spring Boot和Spring Cloud在市场上的流行,Spring Data JPA也逐渐进入大家 的视野,它们组成有机的整体,使用起来比较方便,加快了开发的效率,使开发者不需要关心和配置更多的东西,完全可以沉浸 在Spring的完整生态标准实现下。JPA上手简单,开发效率高,对对象的支持比较好,又有很大的灵活性,市场的认可度越来越高。


Spring Data Jpa

Mybatis

单表操作

只需继承,代码量极少,非常方便。而且支持方法名用关键字生成SQL

可以使用代码生成工具,也很方便,但相对JPA单表弱很多。

多表关联查询

友好,动态SQL使用不够方便,而且SQL和代码耦合到一起

非常友好,可以有非常直观的动态SQL

自定义SQL

SQL写在注解里面,写动态SQL比较麻烦

SQL可以写在XML里面,独立管理,动态SQL语法也容易理解

学习成本

略高

较低,因为Mybatis占有的市场更大,所以网络上的资料更多

Spring Data JPA的主要类和结构图

  • 需要掌握和使用到的类

七个大 Repository 接口:

  • Repository(org.springframework.data.repository)
  • CrudRepository(org.springframework.data.repository)
  • PagingAndSortingRepository(org.springframework.data.repository)
  • JpaRepository(org.springframework.data.jpa.repository)
  • QueryByExampleExecutor(org.springframework.data.repository.query)
  • JpaSpecificationExecutor(org.springframework.data.jpa.repository)
  • QueryDslPredicateExecutor(org.springframework.data.querydsl)

两大 Repository 实现类:

  • SimpleJpaRepository(org.springframework.data.jpa.repository.support)
  • QueryDslJpaRepository(org.springframework.data.jpa.repository.support)


类的结构关系图

Spring Data JPA相关——初识Spring Data JPA_mysql

spring data jpa入门

创建一个spring boot项目

4.1配置工作

  • 准备环境
  • JDK8+
  • Maven3+
  • Intellij IDEA
  • Spring Boot2+
  • MySQL8+
  • Spring Data JPA
  • maven依赖,pom.xml
    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>


  • application.properties
# 应用名称
spring.application.name=springdatajpaTest
# 应用服务 WEB 访问端口
server.port=8080
# 数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据源名称
spring.datasource.name=defaultDataSource
# 数据库连接地址
spring.datasource.url=jdbc:mysql://localhost:3306/db_jpa_test?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
# 数据库用户名&密码:
spring.datasource.username=root
spring.datasource.password=123
#spring data jpa配置
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
#每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)
spring.jpa.properties.hibernate.format_sql=true
#log配置
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace




spring.jpa.hibernate.ddl-auto 是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种 配置如下:

  • create :每次加载hibernate时都会删除上一次的生成的表,然后根据你的实体类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
  • create-drop :每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
  • update :最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后 加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
  • validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

4.2 创建实体类

@Entity
@Table(name = "tb_users")
@Setter
@Getter
@ToString
@NoArgsConstructor
public class User {

@Id
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator")
private String id;

@Column(name = "username", unique = true, nullable = false, length = 64)
private String username;

@Column(name = "password", nullable = false, length = 64)
private String password;

@Column(name = "email", length = 64)
private String email;
}


4.3 创建实体类对应接口

public interface UserRepository extends JpaRepository<User, String> {

}


4.4 运行测试

配置完成后,创建项目连接的数据库,运行项目,如果成功的话,会发现数据库中会创建好实体类对应的表

Spring Data JPA相关——初识Spring Data JPA_sql_02

Spring Data JPA相关——初识Spring Data JPA_hibernate_03

表的字段属性和实体类中的设置是对应的

现在尝试插入一条数据,只需要创建实体类的对象,然后调用对应接口类的save方法

测试类

@SpringBootTest
public class UserTest {

@Autowired
private UserRepository userRepository;

@Test
public void add(){
User user = new User();
user.setUsername("zhanghua");
user.setPassword("2333");
user.setEmail("www2333@google.com");
userRepository.save(user);
}
}


运行结果

Spring Data JPA相关——初识Spring Data JPA_mysql_04