Spring Data JPA 大纲归纳
第一天:
1 springdatajpa 2 day1:orm思想和hibernate以及jpa的概述和jpa的基本操作 3 day2:springdatajpa的运行原理以及基本操作 4 day3:多表操作,复杂查询 5 6 第一 orm思想 7 主要目的:操作实体类就相当于操作数据库表 8 建立两个映射关系: 9 实体类和表的映射关系 10 实体类中属性和表中字段的映射关系 11 不再重点关注:sql语句 12 13 实现了ORM思想的框架:mybatis,hibernate 14 15 第二 hibernate框架介绍 16 Hibernate是一个开放源代码的对象关系映射框架, 17 它对JDBC进行了非常轻量级的对象封装, 18 它将POJO与数据库表建立映射关系,是一个全自动的orm框架 19 20 第三 JPA规范 21 jpa规范,实现jpa规范,内部是由接口和抽象类组成 22 23 第四 jpa的基本操作 24 案例:是客户的相关操作(增删改查) 25 客户:就是一家公司 26 客户表: 27 28 jpa操作的操作步骤 29 1.加载配置文件创建实体管理器工厂 30 Persisitence:静态方法(根据持久化单元名称创建实体管理器工厂) 31 createEntityMnagerFactory(持久化单元名称) 32 作用:创建实体管理器工厂 33 34 2.根据实体管理器工厂,创建实体管理器 35 EntityManagerFactory :获取EntityManager对象 36 方法:createEntityManager 37 * 内部维护的很多的内容 38 内部维护了数据库信息, 39 维护了缓存信息 40 维护了所有的实体管理器对象 41 再创建EntityManagerFactory的过程中会根据配置创建数据库表 42 * EntityManagerFactory的创建过程比较浪费资源 43 特点:线程安全的对象 44 多个线程访问同一个EntityManagerFactory不会有线程安全问题 45 * 如何解决EntityManagerFactory的创建过程浪费资源(耗时)的问题? 46 思路:创建一个公共的EntityManagerFactory的对象 47 * 静态代码块的形式创建EntityManagerFactory 48 49 3.创建事务对象,开启事务 50 EntityManager对象:实体类管理器 51 beginTransaction : 创建事务对象 52 presist : 保存 53 merge : 更新 54 remove : 删除 55 find/getRefrence : 根据id查询 56 57 Transaction 对象 : 事务 58 begin:开启事务 59 commit:提交事务 60 rollback:回滚 61 4.增删改查操作 62 5.提交事务 63 6.释放资源 64 65 i.搭建环境的过程 66 1.创建maven工程导入坐标 67 2.需要配置jpa的核心配置文件 68 *位置:配置到类路径下的一个叫做 META-INF 的文件夹下 69 *命名:persistence.xml 70 3.编写客户的实体类 71 4.配置实体类和表,类中属性和表中字段的映射关系 72 5.保存客户到数据库中 73 ii.完成基本CRUD案例 74 persist : 保存 75 merge : 更新 76 remove : 删除 77 find/getRefrence : 根据id查询 78 79 iii.jpql查询 80 sql:查询的是表和表中的字段 81 jpql:查询的是实体类和类中的属性 82 * jpql和sql语句的语法相似 83 84 1.查询全部 85 2.分页查询 86 3.统计查询 87 4.条件查询 88 5.排序
回顾jdbc操作以及引入orm
jpa
第二天
1 orm思想,hibernate,JPA的相关操作 2 3 * SpringDataJpa 4 5 第一 springDataJpa的概述 6 7 第二 springDataJpa的入门操作 8 案例:客户的基本CRUD 9 i.搭建环境 10 创建工程导入坐标 11 配置spring的配置文件(配置spring Data jpa的整合) 12 编写实体类(Customer),使用jpa注解配置映射关系 13 ii.编写一个符合springDataJpa的dao层接口 14 * 只需要编写dao层接口,不需要编写dao层接口的实现类 15 * dao层接口规范 16 1.需要继承两个接口(JpaRepository,JpaSpecificationExecutor) 17 2.需要提供响应的泛型 18 19 * 20 findOne(id) :根据id查询 21 save(customer):保存或者更新(依据:传递的实体类对象中,是否包含id属性) 22 delete(id) :根据id删除 23 findAll() : 查询全部 24 25 第三 springDataJpa的运行过程和原理剖析 26 1.通过JdkDynamicAopProxy的invoke方法创建了一个动态代理对象 27 2.SimpleJpaRepository当中封装了JPA的操作(借助JPA的api完成数据库的CRUD) 28 3.通过hibernate完成数据库操作(封装了jdbc) 29 30 31 第四 复杂查询 32 i.借助接口中的定义好的方法完成查询 33 findOne(id):根据id查询 34 ii.jpql的查询方式 35 jpql : jpa query language (jpq查询语言) 36 特点:语法或关键字和sql语句类似 37 查询的是类和类中的属性 38 39 * 需要将JPQL语句配置到接口方法上 40 1.特有的查询:需要在dao接口上配置方法 41 2.在新添加的方法上,使用注解的形式配置jpql查询语句 42 3.注解 : @Query 43 44 iii.sql语句的查询 45 1.特有的查询:需要在dao接口上配置方法 46 2.在新添加的方法上,使用注解的形式配置sql查询语句 47 3.注解 : @Query 48 value :jpql语句 | sql语句 49 nativeQuery :false(使用jpql查询) | true(使用本地查询:sql查询) 50 是否使用本地查询 51 52 iiii.方法名称规则查询
springDataJpa,jpa,hibernate关系
动态分析
springdatajpa的运行过程
第三天
1 回顾
2 i.springDatajpa,jpa规范,hibernate三者之间的关系
3 code -- > springDatajpa --> jpa规范的API --> hibernate
4 ii.符合springDataJpa规范的dao层接口的编写规则
5 1.需要实现两个接口(JpaRepository,JapSpecificationExecutor)
6 2.提供响应的泛型
7 iii.运行过程
8 * 动态代理的方式:动态代理对象
9 iiii.查询
10
11 第一 Specifications动态查询
12
13 JpaSpecificationExecutor 方法列表
14
15 T findOne(Specification<T> spec); //查询单个对象
16
17 List<T> findAll(Specification<T> spec); //查询列表
18
19 //查询全部,分页
20 //pageable:分页参数
21 //返回值:分页pageBean(page:是springdatajpa提供的)
22 Page<T> findAll(Specification<T> spec, Pageable pageable);
23
24 //查询列表
25 //Sort:排序参数
26 List<T> findAll(Specification<T> spec, Sort sort);
27
28 long count(Specification<T> spec);//统计查询
29
30 * Specification :查询条件
31 自定义我们自己的Specification实现类
32 实现
33 //root:查询的根对象(查询的任何属性都可以从根对象中获取)
34 //CriteriaQuery:顶层查询对象,自定义查询方式(了解:一般不用)
35 //CriteriaBuilder:查询的构造器,封装了很多的查询条件
36 Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb); //封装查询条件
37
38 第二 多表之间的关系和操作多表的操作步骤
39
40 表关系
41 一对一
42 一对多:
43 一的一方:主表
44 多的一方:从表
45 外键:需要再从表上新建一列作为外键,他的取值来源于主表的主键
46 多对多:
47 中间表:中间表中最少应该由两个字段组成,这两个字段做为外键指向两张表的主键,又组成了联合主键
48
49 讲师对学员:一对多关系
50
51 实体类中的关系
52 包含关系:可以通过实体类中的包含关系描述表关系
53 继承关系
54
55 分析步骤
56 1.明确表关系
57 2.确定表关系(描述 外键|中间表)
58 3.编写实体类,再实体类中描述表关系(包含关系)
59 4.配置映射关系
60
61 第三 完成多表操作
62
63 i.一对多操作
64 案例:客户和联系人的案例(一对多关系)
65 客户:一家公司
66 联系人:这家公司的员工
67
68 一个客户可以具有多个联系人
69 一个联系人从属于一家公司
70
71 分析步骤
72 1.明确表关系
73 一对多关系
74 2.确定表关系(描述 外键|中间表)
75 主表:客户表
76 从表:联系人表
77 * 再从表上添加外键
78 3.编写实体类,再实体类中描述表关系(包含关系)
79 客户:再客户的实体类中包含一个联系人的集合
80 联系人:在联系人的实体类中包含一个客户的对象
81 4.配置映射关系
82 * 使用jpa注解配置一对多映射关系
83
84 级联:
85 操作一个对象的同时操作他的关联对象
86
87 级联操作:
88 1.需要区分操作主体
89 2.需要在操作主体的实体类上,添加级联属性(需要添加到多表映射关系的注解上)
90 3.cascade(配置级联)
91
92 级联添加,
93 案例:当我保存一个客户的同时保存联系人
94 级联删除
95 案例:当我删除一个客户的同时删除此客户的所有联系人
96
97 ii.多对多操作
98 案例:用户和角色(多对多关系)
99 用户:
100 角色:
101
102 分析步骤
103 1.明确表关系
104 多对多关系
105 2.确定表关系(描述 外键|中间表)
106 中间间表
107 3.编写实体类,再实体类中描述表关系(包含关系)
108 用户:包含角色的集合
109 角色:包含用户的集合
110 4.配置映射关系
111
112 iii.多表的查询
113 1.对象导航查询
114 查询一个对象的同时,通过此对象查询他的关联对象
115
116 案例:客户和联系人
117
118 从一方查询多方
119 * 默认:使用延迟加载(****)
120
121 从多方查询一方
122 * 默认:使用立即加载