Spring Data JPA 概述 与 快速入门(操作 mysql 数据)

目录

Spring Data 简介

Spring Data 特点

JPA(Java 持久化 API) 简介

Spring Data JPA 简介

Spring Data JPA 快速入门


Spring Data 简介

1、对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理。

2、Spring Boot 添加了大量自动配置,屏蔽了很多设置,引入各种 XxxTemplate,XxxRepository 来简化程序员对数据访问层的操作。对程序员来说只需要进行简单的配置即可使用

3、Spring Data 官网地址:Redirecting…

2、Spring Data 是一个用于简化数据库访问的开源框架,支持访问关系型数据库、非关系型数据库、map-reduce 框架、以及云计算服务等。

3、Spring Data 框架主要模块(Main modules)/子项目如下:

Spring Data 特点

1、Spring Data 提供使用统一的 API 来对数据访问层进行操作,这主要是 Spring Data Commons 项目来实现的。

2、Spring Data Commons 让程序员在使用关系型或者非关系型数据访问技术时都基于 Spring 提供的统一标准,而不用再关心底层到底是何种数据。

3、Spring Data Commons 提供的标准包含了常用的 CRUD(创建、获取、更新、删除)、查询、排序和分页等相关操作,对底层任意数据库都是使用一套 API 搞定,大大简化操作。

4、Spring Data 提供统一的 Repository(仓库) 接口:

1、Repository<T, ID extends Serializable>:统一接口,根接口
2、RevisionRepository<T, ID extends Serializable, N extends Number & Comparable<N>>:基于乐观锁机制
3、CrudRepository<T, ID extends Serializable>:通用 CRUD 操作接口
4、PagingAndSortingRepository<T, ID extends Serializable>:通用 CRUD 及分页、排序等操作操作
5、JpaRepository:操作关系型数据库时,只要继承此接口,则相当于有了 CRUD、分页、排序等常用的所有方法,程序员可以直接调用。

5、提供数据访问模板类 xxxTemplate,如:MongoTemplate、RedisTemplate 等 

JPA(Java 持久化 API) 简介

1、JPA 全称 Java Persistence API(Java 持久化 API),是 Java 官方提出的 Java 持久化规范,为开发人员提供了一种对象/关系映射工具来管理 Java 应用中的关系数据,从 Java EE 5 开始发布。

2、JPA (Java 持久化 API) 为对象关系映射提供POJO持久性模型,由 JESR 220 的 EJB 3 软件专家组开发,但它的使用不限于EJB 软件组件。它也可以直接由 Web 应用程序和应用程序客户端使用,甚至可以在Java EE平台之外,例如,在Java SE应用程序中使用。

Java Persistence API

The Java Persistence API provides a POJO persistence model for object-relational mapping. The Java Persistence API was developed by the EJB 3.0 software expert group as part of JSR 220, but its use is not limited to EJB software components. It can also be used directly by web applications and application clients, and even outside the Java EE platform, for example, in Java SE applications. See JSR 220.

3、目前比较成熟的 JPA 框架主要包括 Jboss 的 Hibernate EntityManager、Oracle 捐献给 Eclipse 社区的 EclipseLink、Apache 的 OpenJPA ,以及 Spring 的 Spring Data JPA 等。

4、Oracle JPA 官网地址:Java Persistence API

5、官方 Java Persistence API  2.0 文档百度网盘 请输入提取码 密码:ycv1

Spring Data JPA 简介

1、Spring Data JPA 是 Spring Data 框架下的一个子项目目的是专门用于简化关系型数据库的操作。同理还有简化 Redis 操作的 Spring Data Redis 、简化 Solr 操作的 Spring Data for Apache Solr 、简化 MongoDB 操作的 Spring Data MongoDB 等

2、Spring Data JPA 官网:Redirecting…

3、Spring Data JPA 2.1.0 官方文档:Spring Data JPA - Reference Documentation

4、项目开发中程序员面向 Spring Data 编程,只需要实现对应的接口重写其中的方法即可操作数据库

5、如上图所示操作关系型数据库时引入 Sping Data JPA 模块,然后实现接口重写方法即可操作,同理操作 Resid 时引入 Spring Data Redis,操作 MongoDB 时引入 Spring Data MongDB。

6、Sping Data JPA 底层默认由 Hibernate 实现,但操作比 Hibernate 更简单,以前 Hibernate 还要自己封装 BaseDao 层,而 Spring Data JPA 连这一步都省略了,实现接口之后,就可以直接调用其中的 CRUD 方法以及排序、分页等方法,更加简洁。

Spring Data JPA 快速入门

常用注解

@Entity

标注在实体类上,告诉 JPA 本类是一个与数据库表进行映射的实体类,而不是普通的 Java Bean。name 属性值可以指定映射的表名,默认对应的表名为实体类名驼峰转下划线,比如 BasTv -> bas_tv。

使用 JPA 的实体,javax.persistence.Entity、javax.persistence.Id 注解必须要写,否则启动报错!

@Table

标注在实体类上(可选),表示实体对应的数据库表的信息,如 name、索引、约束、schema、catalog 等等。

name 属性: 可选,定义表的名称,默认表名和实体名称一致,首字母小写。

@id

标注在主键属性上,一个实体只能有一个属性被映射为主键,@id通常要与主键生成策略的注解一起使用!

@GeneratedValue

(strategy=GenerationType.xxx,generator='主键生成器名称')

标注在类上(可选)。

strategy:表示主键生成策略::
AUTO:由JPA自动生成;
INDENTITY:使用数据库的自增长字段,需要数据库的支持(如SQL Server、MySQL、DB2、Derby等)。
SEQUENCE :使用数据库的序列号,需要数据库的支持(如Oracle)。
TABLE :使用指定的数据库表记录ID的增长 需要定义一个TableGenerator,在@GeneratedValue中引用。

generator(可选):用于关联自定义主键生成器。

@GenericGenerator(name = "主键生成器名称", strategy = "自定义的主键生成器")

自定义的主键生成器。

配合上面的 @GeneratedValue 使用,

主键是String类型,设置为 @GeneratedValue(strategy = GenerationType.AUTO) 时,在调用 jpa 的 save 方法时会报错:JpaSystemException: Unknown integral data type for ids : java.lang.String

解决办法1:去掉自动生成,自己手动设置主键。
解决办法2:自定义主键生成器

@Column(可选)

描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用,属性如下:
name:表示数据库表中该字段的名称,默认与属性名称一致;
nullable:表示该字段是否允许为null,默认为true;
unique:表示该字段是否是唯一约束,默认为false;
length:表示该字段的大小,仅对String类型的字段有效 。
insertable:表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为true;
updateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用如对于birthday字段;

columnDefinition:(可选)为列生成DDL时使用的SQL片段。默认为生成的SQL,以创建推断类型的列。

@Transient(可选)

表示该属性并非一个到数据库表的字段映射,ORM框架将忽略该属性。

比如根据出生日期自动计算出来的年龄(age)属性数据库实际并不存储.

1、Sping Data JPA 底层默认由 Hibernate 实现,同样基于 ORM(对象关系型映射),但操作比 Hibernate 更简单,以前 Hibernate 还需要程序员封装 BaseDao 层,而 Spring Data JPA 连这一步都省略了,实现接口之后,就可以直接调用其中的 CRUD 方法以及排序、分页等方法,更加简洁。

2、本文环境 Java JDK 1.8 + Spring Boot 2.1.3 + Mysql 数据库 V8.0.21,web 应用的 pom.xml 文件导入 (https://gitee.com/wangmx1993/red-door/blob/master/pom.xml):

        <!-- 引入 Spring Data JPA,JPA 组件内部会依赖 JDBC 组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!-- Mysql 数据库驱动,spring boot 2.1.3 时,mysql 驱动版本为 8.0.15 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

一:数据源配置(在线源码)

1、本文直接使用默认 Spring Boot 2.0.4 提供的 默认数据源 HikariDataSource ,如果需要使用 DruidDataSource 的可以参考《 Spring Boot 自定义数据源 DruidDataSource

spring:
  datasource:
    username: root
    password: root
    #高版本的 spring boot 搭配的 mysql 驱动版本通常也较高,如 mysql-connector-java:8.0.X
    #此时 url 的值要带时区 serverTimezone、driver-class-name 的值要带 cj
    url: jdbc:mysql://127.0.0.1:3306/wang?characterEncoding=UTF-8&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver

低版本的 mysql 驱动时,配置如下:
url: jdbc:mysql://127.0.0.1:3306/wang?characterEncoding=UTF-8   
driver-class-name: com.mysql.jdbc.Driver

2、可以自己获取 javax.sql.DataSource 打印,测试一下获取数据源是否成功,在线源码:https://gitee.com/wangmx1993/red-door/blob/master/src/test/java/com/wmx/reddoor/DataSourceTest.java

二:POJO 实体对象(在线源码

1、提供封装数据库表的 POJO 对象,以及配置与数据库表的映射关系.

2、因为 Spring Data JPA 也是基于 ORM 思想,而且底层又是 Hibernate 实现,所以 POJO 与数据库表的映射关系写法与以前写 Hibernate 时基本无异

3、可以自己在数据库中手动建表,也可以通过 Hibernate 根据映射关系自动建表,本文演示后者。

4、使用 JPA 的实体中的 javax.persistence.Entity、javax.persistence.Id 注解必须要写,否则启动报错!

三:自定义 Dao 持久化接口(在线源码)

1、编写一个 Dao 接口(Repository)来操作实体类对应的数据表,实现了如下的接口,就拥有了其对应的方法。

2、因为使用的是 Spring Data JPA,所以直接继承 JpaRepository 接口,之后便可以直接从 service 层或者 Controller 层调用其方法。

四:Spring data JPA 配置(在线源码

1、Spring Boot 提供了 JPA 配置,如以前 Hibernate 时期的是否显示 sql 语句,对表策略等,如下所示只是写法略有不同,意义与以前 Hibernate 时完全一样。

2、如果是自己在数据库中手动建表,则省略 "ddl-auto" 的对表策略配置即可。

spring:
  #JPA 配置,可以参考官网:https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#common-application-properties
  jpa:
    #    hibernate:
    #       ddl‐auto: update # 更新或者创建数据库表结构,省略时将不会自动生成数据库表
    #       show‐sql: true # 控制台是否显示SQL
    generate-ddl: true # 是否根据实体(@Entity)自动建表,默认为 false。
    show-sql: true # 是否显示 sql 语句

3、完整配置选项可以参考官网:Spring Boot Reference Guide,内容如下所示:

# JPA (JpaBaseConfiguration, HibernateJpaAutoConfiguration)
spring.data.jpa.repositories.enabled=true # Whether to enable JPA repositories.
spring.jpa.database= # Target database to operate on, auto-detected by default. Can be alternatively set using the "databasePlatform" property.
spring.jpa.database-platform= # Name of the target database to operate on, auto-detected by default. Can be alternatively set using the "Database" enum.
spring.jpa.generate-ddl=false # Whether to initialize the schema on startup.
spring.jpa.hibernate.ddl-auto= # DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto" property. Defaults to "create-drop" when using an embedded database and no schema manager was detected. Otherwise, defaults to "none".
spring.jpa.hibernate.naming.implicit-strategy= # Fully qualified name of the implicit naming strategy.
spring.jpa.hibernate.naming.physical-strategy= # Fully qualified name of the physical naming strategy.
spring.jpa.hibernate.use-new-id-generator-mappings= # Whether to use Hibernate's newer IdentifierGenerator for AUTO, TABLE and SEQUENCE.
spring.jpa.mapping-resources= # Mapping resources (equivalent to "mapping-file" entries in persistence.xml).
spring.jpa.open-in-view=true # Register OpenEntityManagerInViewInterceptor. Binds a JPA EntityManager to the thread for the entire processing of the request.
spring.jpa.properties.*= # Additional native properties to set on the JPA provider.
spring.jpa.show-sql=false # Whether to enable logging of SQL statements.

五:测试生成表

1、如果开启了自动建表配置,则启动应用,可以看到控制台会打印建表的 sql 信息。

六:Spring Data JPA 进行 CRUD(在线源码)

1、直接浏览器访问控制层,然后进行 CRUD 操作,操作结果返回给页面,省去 service 层。

2、本文的重点是 Spring Data JPA 入门,详细的 CRUD 方法使用可以参考《Spring Data JPA 常用 CRUD 操作汇总

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚩尤后裔-汪茂雄

芝兰生于深林,不以无人而不芳。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值