Spring Data JPA相关——初识Spring Data JPA
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 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 运行测试
配置完成后,创建项目连接的数据库,运行项目,如果成功的话,会发现数据库中会创建好实体类对应的表
表的字段属性和实体类中的设置是对应的
现在尝试插入一条数据,只需要创建实体类的对象,然后调用对应接口类的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);
}
}
运行结果