热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringDataJPA学习笔记

SpringData一.概述Spring的一个子项目。用于简化数据库访问,支持NoSQL和关系数据存储。其主要目标是使数据库的访问变得方便快
Spring Data    
一.概述
Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。其主要目标是使数据库的访问变得方便快捷。SpringData 项目所支持 
NoSQL 存储:MongoDB (文档数据库)
                      Neo4j(图形数据库)    
                      Redis(键/值存储)
                      Hbase(列族数据库)
SpringData 项目所支持的关系数据存储技术:JDBC/JPA
    JPA Spring Data : 致力于减少数据访问层 (DAO) 的开发量. 开发者唯一要做的,就 只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成!框架怎么可能代替开发者实现业务逻辑呢?比如:当有一个                        UserDao.findUserById()  这样一个方法声明,大致应该能判断出这是根据给定条件的 ID 查询出满足条件的 User  对象。Spring Data JPA 做的便是规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑。

二.所需jar包
    

三.配置文件
    
四.Entity
    
    表:
        person(通过SpringData自动生成的表会自动生成主键和外键)                      address
          
五.Repository
    
     5.1 如何声明一个Repository
     Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法     public interface Repository { } 第一个泛型为        model的class
     第二个为id的class Spring Data可以让我们只定义接口,只要遵循 Spring Data的规范,就无需写实现类。  与继承 Repository 等价的一种方式,就是在持久层接口上使用 @RepositoryDefinition 注        解,并为其指定 domainClass 和 idClass 属性。如下两种方式是完全等价的
      也可集成repository的子接口

     5.2 Repository查询方法的关键字
        
    5.3 查询方法解析流程
            假如创建如下的查询:findByUserDepUuid(),框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,假设查询实体为Doc
  1. 先判断 userDepUuid (根据 POJO 规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步    
  2. 从右往左截取第一个大写字母开头的字符串(此处为Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user 为查询实体的一个属性;       
  3. 接着处理剩下部分(DepUuid),先判断 user 所对应的类型是否有depUuid属性,如果有,则表示该方法最终是根据 “ Doc.user.depUuid” 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 “Doc.user.dep.uuid” 的值进行查询。
  4. 可能会存在一种特殊情况,比如 Doc包含一个 user 的属性,也有一个 userDep 属性,此时会存在混淆。可以明确在属性之间加上 "_" 以显式表达意图,比如 "findByUser_DepUuid()" 或者 "findByUserDep_uuid()"
  5. 特殊的参数: 还可以直接在方法的参数上加入分页或排序的参数,  比如:Page findByName(String name, Pageable pageable);  List findByName(String name, Sort sort);     
     5.4 查询@Query注解
            这种查询可以声明在 Repository 方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是 Spring data 的特有实现。
            
         
        占位符绑定参数:
  •     索引参数如下所示,索引值从1开始,查询中 ”?X” 个数需要与方法定义的参数个数相一致,并且顺序也要一致  
  •     命名参数(推荐使用这种方式):可以定义好参数名,赋值时采用@Param("参数名"),而不用管顺序。 
                             
  • 如果是 @Query 中有 LIKE 关键字,后面的参数需要前面或者后面加 %,这样在传递参数值的时候就可以不加 %:  
                         @Query("select o from UserModel o where o.name like ?1%")     public List findByUuidOrAge(String name);
                        @Query("select o from UserModel o where o.name like %?1")    public List findByUuidOrAge(String name);
                        @Query("select o from UserModel o where o.name like %?1%")    public List findByUuidOrAge(String name);
  • @Query 本地查询 
                        设置nativeQuery为true,
                        比如:@Query(value="select * from tbl_user where name like %?1" ,nativeQuery=true)    public List                 findByUuidOrAge(String name);  
            
        5.5@Modifying注解和事务
  • @Query 与 @Modifying 这两个 annotation一起声明,可定义个性化更新操作,例如只涉及某些字段更新时最为常用,示例如下:                    
                注意:
                        1.方法的返回值应该是 int,表示更新语句所影响的行数在调用的地方必须加事务,
                        2.可以通过自定义的 JPQL 完成 UPDATE 和 DELETE 操作. 注意: JPQL 不支持使用 INSERT
                        3.在 @Query 注解中编写 JPQL 语句, 但必须使用 @Modifying 进行修饰. 以通知 SpringData, 这是一个 UPDATE 或 DELETE 操作
                        4.UPDATE 或 DELETE 操作需要使用事务, 此时需要定义 Service 层. 在 Service 层的方法上添加事务操作.
                        5.默认情况下, SpringData 的每个方法上有事务, 但都是一个只读事务. 他们不能完成修改操作!
                        
                        没有事务不能正常执行 
                        会报:
                        org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an                                                       
update/delete query
 
六.SpringData的事务
  • Spring Data 提供了默认的事务处理方式,即 所有的查询均声明为只读事务
  • 对于自定义的方法,如需改变 Spring Data 提供的事务默认方式,可以在方法上注解 @Transactional 声明 
  • 进行多个 Repository 操作时,也应该使它们在同一个事务中处理,按照分层架构的思想,这部分属于业务逻辑层,因此, 需要在 Service 层实现对多个 Repository 的调用,并在相应的方法上声明事务。

七.Repository子类 以及其他类
        
        7.1 CrudRepository 接口
            自带一些方法 
                保存/删除(单个与集合)
                根据id查询 查询所有 查询条数 是否存在该id....
            
            注:保存时id可以不填写 如果id有注解( @Id  @GeneratedValue )
     
        7.2PagingAndSortingRepository接口
             实现了分页和排序的功能
             是  CrudRepository 接口的子接口  
            
            
            分页使用:  PageRequest 类即可
            测试代码:  
                分页       
@Test
public void getByPage (){
//pageNo 0 开始 .
int pageNo = 6 - 1 ;
int pageSize = 5 ;
//Pageable 接口通常使用的其 PageRequest 实现类 . 其中封装了需要分页的信息
// 排序相关的 . Sort 封装了排序的信息
//Order 是具体针对于某一个属性进行升序还是降序 .
PageRequest pageable = new PageRequest(pageNo , pageSize) ;
Page page = personRepository .findAll(pageable) ;

System. out .println( " 总记录数 : " + page.getTotalElements()) ;
System. out .println( " 当前第几页 : " + (page.getNumber() + 1 )) ;
System. out .println( " 总页数 : " + page.getTotalPages()) ;
System. out .println( " 当前页面的 List: " + page.getContent()) ;
System. out .println( " 当前页面的记录数 : " + page.getNumberOfElements()) ;
}

               
      分页+排序
@Test
public void getByPageAndOrder (){
//pageNo 0 开始 .
推荐阅读
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • Redis API
    安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
author-avatar
qinqin20082602898705
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有