SpringBoot专题学习Part22:SpringBoot整合JPA - Spring Data JPA

一、概念

1、什么是Spring Data

Spring Data的目的是为了简化构建基于Spring框架应用的数据访问
其包括了非关系数据库 Map-Reduce 框架 云数据服务等等 另外也包含对关系数据库的访问支持

Spring Data的下面有很多子项目:

– Spring Data Commons
– Spring Data JPA
– Spring Data KeyValue
– Spring Data LDAP
– Spring Data MongoDB
– Spring Data Gemfire
– Spring Data REST
– Spring Data Redis
– Spring Data for Apache Cassandra
– Spring Data for Apache Solr
– Spring Data Couchbase (community module)
– Spring Data Elasticsearch (community module)
– Spring Data Neo4j (community module)

SpringData提供了使用统一的API来对数据访问层进行操作
主要是由Spring Data Commons项目来实现的
Spring Data Commons在使用关系型或者非关系型数据访问技术时都基于Spring提供的统一标准
该标准包含了CRUD(创建 获取 更新 删除) 查询 排序分页的相关操作

Spring Data提供了一些统一的Repository接口
这些接口具有增删改查功能 分页功能 及乐观锁机制的功能

CrudRepository<T, ID extends Serializable> :基本CRUD操作
PagingAndSortingRepository<T, ID extends Serializable> :基本CRUD及分页
RevisionRepository<T, ID extends Serializable, N extends Number & Comparable<N>> :乐观锁机制

只须用自己写的接口来继承这些自带的接口 即可具有相应的功能 无须关心其具体实现

Spring Data还提供了数据访问的模板类Template
例如RedisTemplate MongoTemplate等

因此 有了Spring Data 就相当于是"面向SpringData编程"

2、什么是JPA

JPA并不是一个框架 而是一种J2EE的规范Java Persistence API
该规范也称为JSR规范
JSRJava Specification Requests的缩写 意为Java规范提案
该规范 有很多的实现 例如著名的Hibernate
还有Toplink OpenJPA等等

总而言之 Spring Data就是相当于对这些框架的的再封装
Spring Data的底层默认使用的是Hibernate


二、SpringBoot整合JPA

首先 创建项目
在这里插入图片描述
若是用SpringBoot Initializer向导来创建的 须添加Spring Data JPA

若是手动创建 则需引入依赖:

扫描二维码关注公众号,回复: 10403838 查看本文章
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</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.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>

然后是编写数据源的配置文件:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/springboot_jpa?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
    username: root
    password: 123456

由于JPA规范是基于ORM(Object Relational Mapping)思想的
因此 须编写实体类bean和数据表进行映射配置映射关系

编写一个实体类:
数据库中若无对应的表 Spring Data JPA还能提供自动创建表的功能(当然 前提是进行了配置

// 使用JPA注解来配置映射关系
// @Entity注解:告诉JPA该类是一个实体类 是和数据表进行映射的类
@Entity
// @Table注解:主动指定和数据库中的哪个数据表进行映射 若省略 则默认表名为该类的类名小写
@Table(name = "tb_user")
public class User {

    // @Id注解:表明该属性是一个主键
    @Id
    // @GeneratedValue注解:指定该属性的主键生成策略 IDENTITY代表自增主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    // @Column注解:表明该属性是和数据表对应的一个列 还可指定列名和最大长度
    @Column(name = "last_name",length = 20)
    private String lastName;
    // 若不指定列名 则默认列名为该属性的属性名
    @Column
    private String email;

   getter()setter()方法省略...
}

最后 再在配置文件中进行一些简单的基本配置:

jpa:
  hibernate:
    # 数据表的生成策略:update代表更新或创建数据表 若无该数据表 则创建 若有该数据表 则更新
    ddl-auto: update
  # 显示每次执行的sql语句
  show-sql: true

JPA的属性都在JpaProperties这个类中 若不知有何属性可供配置 参照该类即可
至此 全部配置完毕

简单测试:

@RestController
public class UserController {

    @Autowired
    UserRepository userRepository;

    @GetMapping("/user/{id}")
    public User getUser(@PathVariable("id") Integer id)
    {
        // 在2.x的新版本的Spring Data JPA中 findById()返回值有可能是空值 须用orElse()进行判断
        return (User) userRepository.findById(id).orElse(null);
    }

    @GetMapping("/addUser")
    public User insertUser(User user)
    {
        // 返回该储存的对象
        return userRepository.save(user);
    }
}

结果:
在这里插入图片描述
测试成功 无需编写任何sql语句


发布了174 篇原创文章 · 获赞 5 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/Piconjo/article/details/105100031