Spring Data JPA
什么是ORM思想
orm的思想:ORM,即Object Relational Mapping,它是对象关系模型的简称。即对象关系映射)框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。
关键是建立实体类和表的关系和建立实体类中属性和表中字段的关系。
JPA概述
JPA:Java持久化的API,可以理解由sun公司给厂商就是一套规范:对生产厂商的一套规范,由一些类接口和抽象类组成,厂商根据自己的业务实现功能,常见的有hibernate,toplink
JPA和mybatis的对比
-
jpa是对象与对象之间的映射,而mybatis是对象和结果集的映射。
-
jpa移植性比较好,不用关心用什么数据库,因为mybatis自由写sql语句,所以当项目移植的时候还需要改sql。(及时判断数据库类型,不嫌累么)。
-
当需要修改字段的时候mybatis改起来特别费事,而jpa就相对简单。
-
如果用hibernate学习起来比较费时间,而mybatis相对来说比较简单,也可以用springdata,但个人觉得springdata只适合单表。(缓存方面暂不考虑)
JPA的优势
- 标准化
JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问 API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
- 对容器级特性的支持
JPA 框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。
- 简单易用,集成方便
JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释;JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的 掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。
- 可媲美JDBC的查询能力
JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成 是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
- 支持面向对象的高级特性
JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。
具体操作
导入依赖
创建springboot项目,导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Data JPA依赖启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 阿里巴巴的Druid数据源依赖启动器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!-- MySQL数据库连接驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
配置文件
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mytestdb?serverTimezone=UTC&useSSL=false
username: root
password: 123456
jpa:
generate-ddl: true
#create:设置为create,每次运行程序都会将原来的数据表删除,然后重新创建一个表
#create-drop: 每次创建一个数据表,数据表使用完毕之后,将数据表再次删除
#none 将功能不生效
#update如果你设定的实体类发生了改变,数据表会更新
# 如果数据库当中有数据表,就会使用原来的表。没有数据表,就会创建一个数据表,
#validate 实体类和数据表进行校验,如果属性或者个数不一致,就会抛出异常。
hibernate:
ddl-auto: update # update表示实体类改变,数据表更新(常用)
show-sql: true #展示sql语句
database-platform: org.hibernate.dialect.MySQL55Dialect #表示数据库类型
编写实体类
domain
package com.pei.springbootdemo.domain;
import lombok.Data;
import javax.persistence.*;
@Data
@Entity(name="t_pet")
public class Pet {
/**主键字段*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
/**@Column指定持久属性栏属性。*/
@Column
private String pname;
@Column
private String color;
}
repository层
package com.pei.springbootdemo.repository;
import com.pei.springbootdemo.domain.Pet;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* JpaRepository<T, ID> T为实现类,主键id(实体类带有id的属性)
* @program: springbootdemo
* @description
* @author: zhangpei
* @create: 2021-11-03 14:40
**/
@Repository
public interface PetRepository extends JpaRepository<Pet, Integer> {
}
测试代码
@Autowired
PetRepository petRepository;
@Test
void addPet(){
Pet pet=new Pet();
pet.setPname("小黄狗");
pet.setColor("黄色");
petRepository.save(pet);//保存
System.out.println("SpringbootdemoApplicationTests.addPet.over");
}
SpringBoot JPA提供的核心接口
1、Repository接口
2、CrudRepository接口
3、PagingAndSortingRepository接口
4、JpaRepository接口
5、JPASpecificationExecutor接口
继承关系
自定义查询
当Repository不能满足我们的需求,需要自定义查询
public interface PetRepository extends JpaRepository<Pet, Integer> {
/**根据属性查找
* 方法名findBy 属性1 and 属性2 and ···*/
List<Pet> findByColorAndAndPname(String color,String pname);
}
JPQL
要从 Java 代码内发出 JPQL 查询,您需要利用 EntityManager API 和 Query API 的相应方法,执行以下一般步骤:
-
使用注入或通过 EntityManagerFactory 实例获取一个 EntityManager 实例。
-
通过调用相应 EntityManager 的方法(如 createQuery),创建一个 Query 实例。
-
如果有查询参数,使用相应 Query 的 setParameter 方法进行设置。
-
如果需要,使用 setMaxResults 和/或 setFirstResult Query 的方法设置要检索的实例的最大数量和/或指定检索的起始实例位置。
-
如果需要,使用 setHint Query 的方法设置供应商特定的提示。
-
如果需要,使用 setFlushMode Query 的方法设置查询执行的刷新模式,覆盖实体管理器的刷新模式。
-
使用相应 Query 的方法 getSingleResult 或 getResultList 执行查询。如果进行更新或删除操作,您必须使用 executeUpdate 方法,它返回已更新或删除的实体实例的数量。
参考:
原文链接:https://blog.youkuaiyun.com/qq_32953079/article/details/79494955
语法实例:
@Repository
public interface PetRepository extends JpaRepository<Pet, Integer> {
/**根据属性查找
* 方法名findBy 属性1 and 属性2 and ···*/
List<Pet> findByColorAndAndPname(String color,String pname);
/**
* sql:select * from 表名
* jsql语法基本操作;select 对象别名 for 对象名(加全路径) 对象别名
* */
@Query(value = "SELECT pet FROM com.pei.springbootdemo.domain.Pet pet")
List<Pet> loadPetlist();
/**
* sql:select 字段1,字段2 for 表名
* jsql:select 对象属性1,对象属性2 for 对象名 对象别名
*查询属性名称,返回的是对象数组
* @return
*/
@Query(value = "select id,pname,color from com.pei.springbootdemo.domain.Pet pet")
List<Object[]>loadPetlist2();
/**
* sql:select 字段1,字段2 for 表名
* sql:select new 对象(对象属性1,对象属性2) for 对象名 对象别名
*查询属性名称,需要重新new一个对象,返回的是封装好的对象
* @return
*/
@Query(value = "select new com.pei.springbootdemo.domain.Pet(id,pname,color) from com.pei.springbootdemo.domain.Pet pet")
List<Pet>loadPetlist3();
}