Spring Data JPA 常用 CRUD 操作汇总 及 关联关系( 操作 h2 内存数据)
目录
JpaRepository 接口常用 API
环境准备 与 配置
实体 Entity 与 持久化层
Service 层接口与实现
控制器层 Controller 接口
JPA One to One
JpaRepository 接口常用 API
org.springframework.data.jpa.repository.JpaRepository 接口常用 API | |
List<T> findAll() | 查询所有数据。如果表中无数据,则返回一个空的 list。默认升序。 |
Optional<T> findById(ID var1) | 通过主键id查询,如果数据不存在,则 Optional.isPresent() 返回 false |
List<T> findAll(Sort sort) | 查询所有数据,同时指定排序字段。如 Sort.by(Sort.Direction.DESC, "tvId") 以 tvId 倒序查询。 |
T getOne(ID id) | 根据主键id查询。如果id对应的数据不存在,则抛异常:EntityNotFoundException。慎用 |
<S extends T> Optional<S> findOne(Example<S> example) | 条件查询单条数据。以实体中非null字段为条件,如果所有字段都为null,表示查询所有。结果多余1条时,抛出异常:NonUniqueResultException。慎用 |
<S extends T> List<S> findAll(Example<S> example) | 条件查询。通过 Example 中的指定的实体中的非 null 字段作为调节进行查询。不存在时,返回一个空list。如果实体的所有字段都为null,则默认查询所有。 |
<S extends T> List<S> findAll(Example<S> example, Sort sort) | 条件查询的同时加上排序。值不存在时,返回一个空列表。 |
Page<T> findAll(Pageable pageable) | 分页查询。Pageable 可以设置查询的页码以及每页的大小,同时还可以指定 Sort 排序。无数据时不影响,不会出现空指针异常。 |
<S extends T> Page<S> findAll(Example<S> example, Pageable pageable) | 条件查询 加 分页,Pageable 可以设置排序字段。 |
<S extends T> S save(S var1) | 添加与修改。如果实体的主键为null,直接新增数据;如果id不为null,则查询数据库是否有此id,有则修改,没果则新增(主键以主键生成策略进行生成) |
<S extends T> List<S> saveAll(Iterable<S> entities) | 同时 save 多条数据 |
void deleteById(ID var1) | 根据主键id删除数据。如果id不存在,则抛异常:EmptyResultDataAccessException |
void delete(T entity) | 根据实体的主键id删除数据(主键以外的属性无效)。实体对应的主键不存在时,不会抛异常。 |
void deleteAll(Iterable<? extends T> entities) | 根据多个实体的主键同时删除多条数据。值不存在时,不影响。 |
void deleteInBatch(Iterable<T> entities) | 根据实体主键id批量删除。值不存在时,不影响。 |
void deleteAllInBatch() | 批量删除表中所有数据。表中无数据时,不影响。 |
void deleteAll() | 删除表中所有数据。表中无数据时,也不会有影响 |
boolean existsById(ID var1) | 判断某个主键是否存在 |
long count() | 查询表中记录条数。表中无数据时,返回0 |
环境准备 与 配置
1、下面以 Spring boot 2.1.4 + Spring Data JPA 操作 h2 数据库为例进行说明,准备环境如下:
2、pom.xml 文件内容如下(在线源码):
<!-- Spring Data JPA 内部依赖会 jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!--h2 内存数据库,不用安装即可使用的数据库--><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency>
3、application.yml 配置文件内容如下(在线源码):
spring:
#数据源配置datasource:username: nasapassword: 123456url: jdbc:h2:~/test1 #数据库默认在当前用户目录下,数据库不存在时会自动新建driver-class-name: org.h2.Driver#JPA配置jpa:show-sql: truehibernate:ddl-auto: update
实体 Entity 与 持久化层
1、实体类在线源码:https://github.com/wangmaoxiong/h2Smil/blob/master/src/main/java/com/wmx/entity/Tv.java
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.Date;
/*** Created by Administrator on 2019/2/27 0027.* 1、电视机实体。应用启动时自动,配置文件中配置 ddl-auto: update:如果数据库不存在,则自动新建,否则不再新建。* 2、javax.persistence.Entity、javax.persistence.Id 注解必须要写,否则启动报错!*/
@Entity
public class TV {@Id//标识为主键@GeneratedValue(strategy = GenerationType.AUTO)//指定主键生成的方式,AUTO 指定 H2 数据库主键自动增长private Integer tvId;//电视id,主键/*** 下面没标识的属性都会以默认值和数据库表的字段进行映射对应* 如果修改默认值,又不属性的,可以参考:https://blog.csdn.net/wangmx1993328/article/details/82048775* 中的 "domain Area" 部分*/private String tvName;//电视名称private Float tvPrice;//电视价格private Date dateOfProduction;//生产日期//省略 getter、setter 方法未粘贴
}
2、持久化层接口继承 JpaRepository(在线源码):
import com.wmx.entity.TV;
import org.springframework.data.jpa.repository.JpaRepository;
/*** 继承 JpaRepository 即可,即可以获得其所有的 CRUD 方法,包括分页,排序等方法*/
public interface TVRepository extends JpaRepository<TV, Integer> {
}
Service 层接口与实现
1、业务层接口在线源码:https://github.com/wangmaoxiong/h2Smil/blob/master/src/main/java/com/wmx/service/TvService.java
2、业务层实现在线源码:https://github.com/wangmaoxiong/h2Smil/blob/master/src/main/java/com/wmx/service/impl/TvServiceImpl.java
3、其中包含了平时需要用到的常用 CRUD 方法。
控制器层 Controller 接口
1、在线源码: https://github.com/wangmaoxiong/h2Smil/blob/master/src/main/java/com/wmx/controller/TvController.java
JPA One to One
1、Jpa 中使用 @OneToOne 注解配置一对一关系,需要在哪方设置外键,则将其定义在哪方,下面以 学生(Student)与餐卡(MealCard)为例进行演示,一个学生一张餐卡。
2、实际生产中很少会有人使用 JPA 配置来自动建表,所以像里面的级联操作等配置其实并不需要太关心,只能配出关联关系即可。(完整源码)
/*** 学生餐卡实体类* 与 {@link Student} 是一对一关系,一个学生一张餐卡* <p>* * @Entity :告诉 JPA 本类是一个与数据库表进行映射的实体类,而不是普通的 Java Bean* * 1、当实体类名称是驼峰命名,且没有使用 @Table 指定表名,则默认表名为 meal_card** @author wangMaoXiong* @version 1.0* @date 2021/5/16 15:55*/
@Entity
public class MealCard {//定义主键及主键生成规则@Id@GeneratedValue(strategy = GenerationType.TABLE)private String mid;//参考卡号private Date createTime;//制卡日期//省略 getter、setter 方法等未粘贴
}
/*** 学生实体类* * @Entity :告诉 JPA 本类是一个与数据库表进行映射的实体类,而不是普通的 Java Bean** @author wangMaoXiong* @version 1.0* @date 2021/5/16 15:50*/
@Entity
public class Student {//定义主键及生成规则@Id@GeneratedValue(strategy = GenerationType.TABLE)private String sid;//学生ID@Column(nullable = false, length = 64)private String name;//姓名private Date birthday;//出生日期private Integer sexCode;//性别:1是男,0是女/*** 1、需要在哪一方建外键,则在哪一方设置 @OneToOne 注解* 2、cascade 属性表示级联操作选项,经过实测,这个属性似乎并没有生效,不过没有关系,可以自动手动去数据库修改即可。** @JoinColumn 表示关联字段,属性用途如下:* A)name:指定【meal_card】表中外键的名称,默认为"关联表名称_关联表字段名称",即默认为 "student_sid"* B)referencedColumnName:指定关联【student】表中的什么字段,默认为对方主键,即默认为 "sid"* C)nullable:外键值是否可以为空,默认为 true* D)@JoinColumn 注解可以省略不写,则默认会在【student】表中新建外键 meal_card_mid 并关联【MealCard】表的主键 mid*/@OneToOne(cascade = {CascadeType.ALL})@JoinColumn(name = "meal_card_mid", referencedColumnName = "mid", nullable = true)private MealCard meal_card;//省略 getter、setter 方法等未粘贴
}
Spring Data JPA 常用 CRUD 操作汇总 及 关联关系( 操作 h2 内存数据)相关推荐
- spring data jpa常用配置
spring.jpa.hibernate.ddl-auto 首次程序运行时对ddl的操作 create: 每次运行该程序,没有表格会新建表格,表内有数据会清空: create-drop: 每次程序结束 ...
- Spring Data JPA 常用注解
1. 创建表 @Entity声明该类对应一个数据表实体(万事万物皆为对象). @Table 设置表名 @Entity @Table(name = "user") public cl ...
- spring data JPA常用注解
常用注解 @Entity 作用:指定当前类是实体类. @Table 作用:指定实体类和表之间的对应关系. 属性: name:指定数据库表的名称 @ld 作用:指定当前字段是主键. @Generated ...
- Spring Data JPA Specification(规范)实现复杂查询
目录 持久化 API 接口概述 JpaSpecificationExecutor 常用 API JPA Specification 编码示例 持久化 API 接口概述 1.JPA 持久化 API 接口 ...
- Spring Data JPA问题汇总
刚进公司,发现都用的Spring Data JPA,一脸懵,知乎上遇到了一个大佬写的文章,非常详细,分享一下,我把大佬的文章整理了一下格式,比较好看了,原文链接:https://zhuanlan.zh ...
- Spring Data JPA 实战
课程介绍 <Spring Data JPA 实战>内容是基于作者学习和工作中实践的总结和升华,有一句经典的话:"现在的开发人员是站在巨人的肩上,弯道超车".因现在框架越 ...
- SpringBoot学习笔记:Spring Data Jpa的使用
更多请关注公众号 Spring Data Jpa 简介 JPA JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(JSR ...
- Spring Boot的Spring Data JPA示例
1.简介 在本文中,我们将演示如何利用功能强大的Spring Data JPA API与本课程中的数据库(内存中的H2数据库)进行交互. Spring Data JPA提供了一组非常强大且高度抽象的接 ...
- Spring Data JPA教程:简介
创建使用Java Persistence API的存储库是一个繁琐的过程,需要大量时间,并且需要大量样板代码. 通过执行以下步骤,我们可以消除一些样板代码: 创建一个抽象的基础存储库类,该类为实体提供 ...
- hql实例 jpa_SpringBoot学习笔记九:Spring Data Jpa的使用
Spring Data Jpa 简介 JPA JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(JSR 338,这些接口 ...
最新文章
- python学习随笔--web框架
- SVN使用之分支、合并
- 面试题总结(21-40)
- mac升级之后safari打不开网页,怎么办?
- 据调查95%以上的AI从业者不具备修改模型或者提出新模型的技术能力
- jQuery Css方法
- 测试人员如何使用浏览器的f12_测试过程中如何快速定位一个bug
- SAP UI5 resource servlet
- Linux 脚本文件中开头的#!/bin/bash和#!/bin/sh是什么意思
- 【必知必会】pro文件及常用配置
- [Unity] 在 3DsMax 中将骨骼调整为适应 Unity 的 Humanoid 的结构的记录
- js排序算法详解-计数排序
- dubbo和zookeper使用_Dubbox与Zookeeper简介及入门小案例
- Anaconda常用指令
- 浅谈URL生成方式的演变
- 其他综合-fdisk一键分区操作-无需脚本
- Sqoop导入导出基本操作
- API to UPDATE Oracle FND User
- 怎么在本地运行java项目,eclipse怎么运行java web项目?
- 九大免费自学编程网站,带你告别学习焦虑
热门文章
- 详测 Generics Collections: TObjectList、TObjectQueue、TObjectStack
- 白鸦:我印象中的Keso
- (转) 三袋米的故事
- bootstrap table 小计行_【2018/4/11】bootstrapTable添加一行
- 拓端tecdat|SAS用梯度提升回归树(GBDT)迁移学习预测抵押贷款拖欠风险和垃圾电子邮件数据
- (14)机器学习_f1,auc值
- 机器学习sklearn中决策树模型参数释义
- php 表单 sql,PHP表单发布到SQL后没有任何操作
- ui uview 安卓开发_HarmonyOS 2.0手机开发者Beta公测招募
- 如何让caffe读取多通道图片(=4)