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)

类的结构关系图

image

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 运行测试

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

image

image

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

现在尝试插入一条数据,只需要创建实体类的对象,然后调用对应接口类的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);
    }
}

运行结果

image

posted @ 2021-10-11 11:42  TidalCoast  阅读(90)  评论(0编辑  收藏  举报