SpringBoot (四):JPA(多表关联查询)
Spring Boot Jpa 是 Spring 基于 ORM 框架、Jpa 规范的基础上封装的一套 Jpa 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data Jpa 可以极大提高开发效率。
(完全用面向对象的思想操作数据库----不要写sql语句,可以crud数据库)
jpa与mybatis的区别?
1.对象jdbc的封装程度不同。 orm 对象关系映射 object relationship mappingjpa完全用面向对象思想操作数据库的orm框架 mybatis轻量级的orm框架2.jpa适合功能需求变更不频繁的情况。---传统项目 OA ERP 银行mybatis-plus适合功能需求变更频繁的情况。---互联网项目3.jpa不适合复杂的数据库的操作----数据表行转列mybatis可以通过sql语句实现。4.jpa的sql优化要复杂,很难控制sql语句。mybatis很方便进行sql优化
我们就用一个员工部门的案例来实现一下多表查询
一、首先分析一下表之间的关系
1、一对一
2、多对一&一对多
3、多对多
就拿2来实现
employee:员工表idemp_nameemp_jobdept_iddepartment:部门表iddept_nameid dept_name1 市场部2 保洁部
员工表与部门表:多对一 多个员工属于一个部门
部门表与员工表:一对多 一个部门包含多个员工
1、导入依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
一、配置application.yml文件
spring: datasource:
url: jdbc:mysql://localhost:3306/nd-springboot?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
password: 123456
username: root jpa:
database: mysql
hibernate:
#数据库自动创建表 实际开发中要关闭
# ddl-auto 几种属性
# create: 每次运行程序时,都会重新创建表,故而数据会丢失
# create-drop: 每次运行程序时会先创建表结构,然后待程序结束时清空表
# upadte: 每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)
# validate: 运行程序会校验数据与数据库的字段类型是否相同,字段不同会报错
ddl-auto: update #在开发阶段使用
#在控制台显示sql语句
show-sql: true
这里url要注意时区,否则会报错
二、创建实体类employee和department,定义两个类用于关联查询,查询出员工的同时获取所在的部门信息
部门表:department
@Entity
@Table(name = "tb_dept")
@Data
//@Setter@Getter
public class Department {@Id@GeneratedValue(generator = "idGenerator")@GenericGenerator(name = "idGenerator", strategy = "uuid")private String id;private String deptName;@OneToMany(mappedBy = "department",cascade = {CascadeType.ALL},fetch = FetchType.EAGER)private Set<Employee> employees;
}
员工表:employee
@Entity
@Table(name="tb_emp")
//@Data
@Setter@Getter
public class Employee {@Id//主键字符串,通过程序自动生产主键值@GenericGenerator(name = "idGenerator", strategy = "uuid")@GeneratedValue(generator = "idGenerator")private String id;private String empName;private String empJob;@ManyToOne(targetEntity = Department.class,fetch = FetchType.EAGER)@JoinColumn(name="dept_id")private Department department;
}
注意: 级联查询,不要使用@Data,正确的做法:@Setter@Getter+自己生产toString
否则会导致StackOut…,栈溢出
稍微解释一下@ManyToOne和@OneToMany的参数
cascade:级联(一个犯法,满门cz)
CascadeType.MERGE级联更新:若User属性修改了那么中间表保存时同时修改items里的对象。对应EntityManager的merge方法CascadeType.PERSIST级联保存:对user对象保存时也对role里的对象也会保存。对应EntityManager的presist方法CascadeType.REFRESH级联刷新:获取user对象也同时也重新获取最新的role时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据CascadeType.REMOVE级联删除:对users对象删除也对中间表role里的对象也会删除。对应EntityManager的remove方法CascadeType.ALL包含所有;fetch:抓取策略fetch.lazy :懒加载 获取user对象信息时,不会马上去获取该用户对应的所有角色信息当我们通过user.getRoles是才会去获取该用户的所有角色的所有信息。fetch.EAGER 立即加载 获取user对象信息时,会立即获取该用户所对用的所有角色的所有信息。
三、 创建接口DepartmentRepository和EmployeeRepository集成JpaRespository:
接口:EmployeeRepository
@Repository
public interface EmployeeRepository extends JpaRepository<Employee,String> {}
接口:DepartmentRepository
@Repository
public interface DepartmentRepository extends JpaRepository<Department,String> {
}
四:编写NdspringbootJpa03ApplicationTests测试类
@SpringBootTest
class NdspringbootJpa03ApplicationTests {@Autowiredprivate DepartmentRepository departmentRepository;//一对多@Testvoid contextLoads() {//一.添加 2个新员工到1个新部门//1)创建2个员工对象和1个部门对象Department d1 = new Department();d1.setDeptName("保洁部");d1.setDeptName("市场部");Employee e1 = new Employee();e1.setEmpName("权哥");Employee e2 = new Employee();e2.setEmpName("兰输");// //2)相互认识
// //a.将2个员工添加到部门对象中Set<Employee> employs =new HashSet<>();employs.add(e1);employs.add(e2);d1.setEmployees(employs);// b.将部门对象添加到2个员工对象中e1.setDepartment(d1);e2.setDepartment(d1);//
// //3)保存部门对象departmentRepository.save(d1);}}
运行创建出需要使用的表以及数据
实际功能测试
我们来将一个新员工,添加到旧部门
@SpringBootTest
class NdspringbootJpa03ApplicationTests {@Autowiredprivate DepartmentRepository departmentRepository;//一对多@Testvoid contextLoads() {Employee e1 = new Employee();e1.setEmpName("兰输");Optional<Department> optional = departmentRepository.findById("40286a8176fab4a90176fab4aef60000");//企划部Set<Employee> employees = optional.get().getEmployees();employees.forEach(e->{System.out.println(e);});Department dept = optional.get();Set <Employee> employees1 = dept.getEmployees();//添加新员工到部门中employees.add(e1);//员工对象中添加部门对象e1.setDepartment(dept);//更新部门departmentRepository.save(dept);}
}
我们来看看数据库效果
新加的人物id属于保洁部,所以效果达到了
SpringBoot (四):JPA(多表关联查询)相关推荐
- SpringBoot使用JPA多表关联动态查询指定字段
SpringBoot使用JPA多表关联动态查询指定字段 目标需求 Maven依赖 项目结构 代码 运行结果 源码下载 目标需求 在SpringBoot中用JPA实现多表关联动态查询,并且只查询指定字段 ...
- jpa多表关联查询_JPA【关联查询篇】
摘要:本文主要介绍JPA的多表关联查询(一对一.一对多.双向关联.多对一.多对多)以及N+1查询的优化. 1. JPA多表关联查询 多表关联查询就是实现使用一个实体类对象操作或者查询多个表的数据. 配 ...
- Spring Data JPA 多表关联查询的实现
Spring Data JPA 多表关联查询的实现 多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询 ...
- jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询
上一篇文章已经介绍了自定义 mapper 实现自定义的方法,其实实现了通过自定义的mapper就可以做多表关联等复杂查询.但是很多朋友还是反馈说没有实现多表关联查询,所以,今天把文章又重新修改了,增加 ...
- Springboot整合JPA 多表关联操作 @Query
如果还没使用过JPA的可以去先看我这篇:https://blog.csdn.net/qq_35387940/article/details/102541311 这篇文章里我所采取的是使用Map来 替代 ...
- JPA多表关联查询,自定义实体类接收返回的结果集
在项目中使用jpa进行多表连接查询,基本上返回的都是多张表中的数据.那么问题来了,这关联返回的数据那么多,还是不同表当中的数据,数据库中也没有表和它对应啊,怎么处理呢?返回Object吗 1.教师类 ...
- Spring boot jpa 多表关联查询
效果图: 如图,根据条件查询主表信息,并关联获取详细数据,并实现简单的排序功能,不多说,上代码: model: /** * @author xj * @date 2017/5/3 13:31 */ @ ...
- jpa 多表关联查询
单向manyToOne manyToOne many方 @AllArgsConstructor @NoArgsConstructor @Entity @Builder @Getter @Setter ...
- 【SpringBoot Data JPA】多表关联查询
SpringBoot Data JPA 多表关联查询 前言 一.数据库架构设计 1.1 数据表结构 2.2 建立数据库表: 二.SpringBoot整合JPA多表查询 2.1 环境配置 2.2 建立数 ...
最新文章
- 大揭秘:程序员工作也可以成为享受!
- coremark 官网对各种单片机的测评评分
- 编译通过PCL1.5.1的第一个例子图解
- 如何在Github打造你的爆款开源项目
- 科学家研究:生女有撇步 多钙少碰香蕉
- 华强北耳机为啥老是有人翻车?
- Centos7安装图形桌面
- 2013下半年(11月)信息系统项目管理师考试题型分析(综合知识、案例分析、论文)...
- 第11月第18天 RACSequence
- MySQL语法一:数据定义语句
- Exchange 2010分层通讯薄(HAB)配置指南
- 分别使用御剑工具和dirsearch工具(需要在kali下进行安装)对http://159.75.16.25进行扫描, 扫描出敏感文件,敏感文件内有flag值
- idea 导出项目结构树
- 2011QQ搞笑个性签名:小弟不才,大名耶稣.小名上帝.法号如来
- unity build-in管线中的PBR材质Shader分析研究
- linux下刻录光盘读取不了_Linux下刻录光盘
- docker部署的mysql调整宿主机映射端口
- Java11实现X509TrustManager报错SSLHandshakeException分析及解决办法
- 病历管理系统代码android,医院病例管理系统下载
- 蚂蚁智能内容合规产品,提供一站式营销合规管控解决方案