第7讲:实体关系映射与高级查询_第1页
第7讲:实体关系映射与高级查询_第2页
第7讲:实体关系映射与高级查询_第3页
第7讲:实体关系映射与高级查询_第4页
第7讲:实体关系映射与高级查询_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

07实体关系映射与高级查询深度解析关联映射模型系统梳理一对一、一对多及多对多的关联配置策略,掌握级联操作与双向绑定的最佳实践,构建稳健的实体数据关系网。解锁高效数据检索能力探索方法名查询、@Query注解的灵活运用,结合分页、排序与动态条件构建,大幅提升复杂业务场景下的数据获取效率。从基础映射规则到复杂查询优化,全面掌握JPA核心能力,为企业级数据持久层开发奠定坚实基础。本讲目标掌握一对多、多对多关系映射深入理解实体间关联关系,熟练运用`@OneToMany`、`@ManyToOne`、`@ManyToMany`等核心注解配置对象关系映射,从容处理复杂业务场景中的数据关联与级联操作。掌握方法名推导查询遵循SpringDataJPA的方法命名约定,让框架自动解析方法名并生成对应的SQL查询语句,无需编写SQL即可快速构建基础的数据检索接口,提升开发效率。掌握@Query自定义查询针对复杂业务场景,通过`@Query`注解编写JPQL语句或原生SQL,灵活定制检索逻辑,突破方法名推导的局限性,精准实现复杂条件的聚合、关联与过滤查询。掌握分页与排序结合Web应用需求,熟练使用`Pageable`和`Sort`对象实现查询结果的分页展示与动态排序,有效控制数据加载量,优化系统性能并提升用户浏览体验。关联关系映射01.一对一(One-to-One)使用@OneToOne注解。关系可由任意一方维护,需在其中一方指定mappedBy属性,以另一方作为关系的主控方。02.一对多(One-to-Many)使用@OneToMany注解。逻辑上由“一”方关联“多”方,但物理外键关系必须由“多”的一方负责维护,是关系的主控端。03.多对一(Many-to-One)使用@ManyToOne注解。通常与@OneToMany成对出现,“多”的一方持有外键,负责实际的关系管理和存储操作。04.多对多(Many-to-Many)使用@ManyToMany注解。需通过@JoinTable定义中间关联表来维护双方关系,表中存储两个实体的外键组合。核心概念:维护方—即拥有数据库外键的实体一方,负责关系的创建、更新和删除操作,是关联关系的实际管理者。一对多/多对一示例在关系型数据库映射中,一对多与多对一是典型的双向关联关系。以用户与订单场景为例,一个用户可关联多个订单,而每个订单仅属于一个用户,双方通过注解配合维护这一关系,实现数据的双向映射。一的一方:User实体(主导方)@OneToMany(mappedBy="user")

privateList<Order>orders;通过mappedBy="user"指定关系由多的一方(Order类的user字段)负责维护,避免生成冗余的中间关联表,是双向关联的被动配置方。多的一方:Order实体(维护方)@ManyToOne@JoinColumn(name="user_id")

privateUseruser;使用@JoinColumn指定数据库外键列名,是实际控制关联关系的主动方,负责将外键写入数据库,确保数据的物理关联。核心关键点:mappedBy表明User是被动关联方,不控制外键生成;Order通过@JoinColumn主动维护与User的关联关系,这种设计保证了双向关联的数据一致性,同时避免了数据库表结构的冗余。多对多示例(用户-角色)多对多关系的核心在于引入中间表来维护两个实体间的关联。在用户与角色的场景中,一个用户可拥有多个角色,一个角色也可被多个用户共享,通过JPA注解能高效定义并自动管理这张中间关联表,实现实体间的双向映射。01.User实体类(关系维护端)@EntitypublicclassUser{@IdprivateLongid;@ManyToMany@JoinTable(name="user_role",joinColumns=@JoinColumn(name="user_id"),inverseJoinColumns=@JoinColumn(name="role_id"))privateSet<Role>roles;}02.Role实体类(被关联端)@EntitypublicclassRole{@IdprivateStringname;@ManyToMany(mappedBy="roles")privateSet<User>users;//中间表user_role由JPA自动生成维护,无需额外定义}核心注解解析:使用@JoinTable注解可以自定义中间表的名称及外键列名,明确当前实体与关联实体在中间表中的映射关系,让多对多关联更具可控性;而mappedBy属性则指定了关系的维护端在对方实体中,避免了重复定义关联,简化了双向绑定的配置。级联与加载策略01/级联操作(CascadeType)定义操作主实体时,是否对其关联实体执行相同操作,是管理对象图关系的核心配置,直接决定关联数据的生命周期管理方式。核心类型:ALL/PERSIST负责保存与全量操作;MERGE/REMOVE负责关联数据的更新与级联删除,需谨慎使用以防数据误删。示例:@OneToMany(mappedBy="user",cascade=CascadeType.ALL)—对用户实体的所有持久化操作,将自动级联应用到其关联的订单集合中。02/加载策略(FetchType)决定获取主实体时关联数据的加载时机,是平衡数据库查询次数与内存开销的关键,直接影响应用的运行性能。EAGER(立即加载)获取主实体时即刻查询所有关联数据,是@ManyToOne默认策略,适用于关联数据量小且必然使用的场景。LAZY(延迟加载)访问关联属性时才执行查询,是@OneToMany默认策略,可大幅减少无效查询,显著提升大数据集下的性能。总结:合理配置级联避免数据不一致,选择延迟加载优化性能,需根据业务场景灵活组合使用。方法名查询规则SpringDataJPA最核心的特性之一,通过遵循特定的命名规范定义方法名,框架即可自动解析语义并生成对应的JPQL查询语句,极大简化了数据访问层的开发,无需手动编写繁琐的SQL。findBy+属性查询基础的属性匹配查询,例如findByUsername,框架会自动生成`whereusername=?1`的条件语句。And/Or+多条件组合组合多字段逻辑查询,如findByUsernameAndAge,实现多条件的“且/或”关联筛选。Containing+模糊匹配实现关键字的模糊查询,例如findByUsernameContaining,自动生成`like%?1%`的模糊检索条件。Between+范围查询用于数值或日期的区间筛选,如findByAgeBetween,自动拼接`between?1and?2`的范围条件。OrderBy+结果排序对查询结果进行排序,支持Asc(升序)和Desc(降序),如findByOrderByUsernameDesc。@Query注解当方法名查询无法满足复杂的业务逻辑需求时,SpringDataJPA提供了`@Query`注解,允许开发者直接在接口方法上自定义查询语句,从而实现更灵活、更强大的数据检索能力。使用JPQL面向对象查询@Query("SELECTuFROMUseruWHEREu.emailLIKE%:email%")

List<User>searchByEmail(@Param("email")Stringemail);基于实体类和属性名编写查询,与具体数据库无关,具备良好的可移植性。使用原生SQL查询@Query(value="SELECT*FROMusersWHEREage>?1",nativeQuery=true)

List<User>findAdultUsers(intage);直接使用数据库原生SQL语法,适用于利用数据库特有函数或复杂查询的场景。灵活的参数绑定方式命名参数vs位置参数:

推荐使用`@Param`注解绑定命名参数,代码可读性更高;简单场景也可使用?1、?2等按位置绑定。参数绑定让动态数据查询更加安全,有效避免SQL注入风险,提升代码维护性。核心优势:在接口层直接定义复杂查询逻辑,无需编写额外的DAO实现类,极大简化数据访问层开发。分页与排序SpringDataJPA内置了对分页和排序的完整支持,通过简洁的API即可实现数据的分页查询与结果排序,无需编写复杂的SQL语句,极大简化了开发流程,让开发者能更专注于业务逻辑实现。//1.构建分页与排序条件(页码从0开始,按id降序)

Pageablepageable=PageRequest.of(page,size,Sort.by("id").descending());

//2.调用Repository方法执行分页查询,返回Page结果载体

Page<User>pageResult=userRepository.findAll(pageable);

//3.轻松提取当前页数据、总记录数等关键元数据

List<User>content=pageResult.getContent();longtotal=pageResult.getTotalElements();核心参数:Pageable分页查询的入口参数,封装了页码、每页条数和排序规则(Sort),是连接业务层与数据层的标准分页载体。结果载体:Page不仅包含当前页数据列表,还提供总记录数、总页数、是否有下一页等完整的分页元数据,便于前端直接渲染分页控件。开发避坑:前端传入页码通常从1开始,而Pageable接口页码从0开始计数。务必在业务层执行转换(page=pageNum-1),防止首页数据丢失。动态查询(Specification)当查询条件动态变化(如用户多选筛选)时,使用`Specification`可灵活拼接复杂逻辑,以编程方式动态构建WHERE子句,是实现高级搜索、多条件组合查询的优选方案,能有效提升代码的灵活性与可维护性。01.继承核心执行器Repository接口需同时继承`JpaSpecificationExecutor`,从而获取动态查询的核心执行能力。publicinterfaceUserRepoextendsJpaRepository<User,Long>,JpaSpecificationExecutor<User>{}02.动态拼接谓词条件实现`Specification`接口,根据入参动态添加模糊、范围等查询条件,最后通过CriteriaBuilder组合为AND/OR逻辑。spec=(root,cb)->{List<Predicate>preds=newArrayList<>();preds.add(cb.like(root.get("name"),"%"+name+"%"));returncb.and(preds.toArray(newPredicate[0]));};03.执行并获取结果将构建好的`Specification`对象传入`findAll`方法,框架会自动解析并生成对应的SQL语句,执行查询并返回结果集。//执行查询List<User>users=userRepository.findAll(spec);核心优势:完美解耦查询逻辑与业务代码,支持任意复杂、动态的组合查询场景,避免了大量冗余的查询方法定义,极大提升了系统的可维护性与未来的功能扩展性。课后作业核心任务:实现学生与课程的多对多关系映射

基于ORM框架,完成关联实体的设计与配置,掌握多对多关系的双向维护,理解中间表的作用与生成规则,为后续复杂查询打下基础。01.实体关系构建创建Student和Course两个核心实体类,通过注解配置建立完整的多对多双向关联关系,并合理设置级联操作属性,确保数据一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论