关于jpa源码的初步了解

jpa简介

Spring data JPA是Spring在ORM框架,以及JPA规范的基础上,封装的一套JPA应用框架,并提供了一整套的数据访问层解决方案。底层还是使用了 Hibernate 的 JPA 技术实现。
Hibernate是一个具体的ORM的持久层框架

引入jpa

pom文件:
依赖
配置文件
配置文件
建表策略简介:ddl-auto
create-drop --> 先删除表,再创建表,再删除表(必须保存关闭EntityManagerFactory) 【开发一般不用】
create --> 先删除表,再创建表,不会再删除表。每次加载hiberna的时候都会先删除再创建,个人认为很危险,慎用【测试中需要清空表的时候使用】
update --> 修改(如果没有表会创建,如果表里面没有属性,映射信息存在,会增加这个列) 【测试和web项目中使用】
validate --> 验证(只验证domain中有的部分) 表不存在,会抛出异常(不会创建新表),bean类映射信息少属性,表比映射定义的列要多,不会报错,反之抛出异常 【用在系统已经上线或者客户给定了数据库的情况下】

基本概念

四大对象
Persistence : 工具类,创建EntityManagerFactory(解析xml)
EntityManagerFactory : 创建EntityManager,( 重:连接池,sql,二级缓存,domain关系等,线程安全)
EntityManager : 实体管理对象 ( 轻:连接,一级缓存,线程不安全,一个请求[线程]一个EntityManager)
一级缓存命中:同一个EntityManagerFactory,同一个EntityManager,同一个OID(OID是对象的全限定名#id的值 )
Transaction : 事务对象(EntityManager拿到的事务是同一个)
主键生成策略 注解:@GeneratedValue
identity:自增(类型必需是数字类型,数据库必需支持自增策略) MySQL, SQL Server, DB2, Derby, Sybase, PostgreSQL
sequence:序列(类型必需是数字类型,数据库必需支持序列策略) Oracle、PostgreSQL、DB2
auto:根据方言自动识别是自增还是序列 [@GeneratedValue默认是auto]
table:使用表模拟序列(性能有点差,因为兼容各种数据库)
主键生成注解
查询方式
几种 不同的查询方法
普通查询:继承jpaRepository后就可以直接使用提供的一些方法,不需要sql,复杂的查询可通过继承JpaSpecificationExecutor后可以通过创建specification对象动态查询
自定义方法查询:根据api 提供的语法,自定义方法进行查询,也不需要写sql
自定义sql:通过@query注解可自定义sql进行查询

specification具体实现:
specification
自定义方法查询的基本语法
基本语法

源码

1.单测debug可以看到userRepository实际上是被注入了动态代理,然后进入相应的代理类中的invoke方法可看到target是一个simpleJpaRepository类,进入该类可发现该类实现的类和我们自定义的dao继承的类是一样的,所以是调用该类的相应方法
动态代理类
2.继续debug可进入到拦截链,初始化RepositoryFactorySupport时已经扫描所有repository,并选择了query策略(getQuery()),这里自定义方法用的是PartTreeJpaQuery。自定义sql用的是NativeJpaQuery,最后执行excute方法
repository
进入到该Repository 类看实现
在这里插入图片描述
拦截链中可看到执行的查询策略
在这里插入图片描述
查询策略:
SimpleJpaQuery 适用方法:使用@Query注解,但nativeQuery为隐式或显示声明为false,即使用JPQL语法解析。
NativeJpaQuery 适用方法:使用@Query注解,且nativeQuery显示声明为true,即使用原生sql语法解析。
NamedQuery 适用方法:在entity上声明@NamedQuery注解,并在repository中使用该方法。
PartTreeJpaQuery 适用方法:未使用@Query注解的方法,即根据方法名反射entity字段获取sql。
在这里插入图片描述
PartTreeJpaQuery.execute方法,获取执行器,可看到获取的是集合的query执行器
进入execute,里面是具体会执行哪个查询的实现
在这里插入图片描述
execute 中创建一个Query然后getResultList获取结果
在这里插入图片描述
在query执行类中的createQuery 中可看到,创建了一个CriteriaQuery,丢进重载方法createQuery方法中,返回一个Query,CriteriaQuery就这么生成了。最后一步在重载方法里看到了entityManager.createQuery()
在这里插入图片描述

debug总结

自动配置扫描包内所有继承了Repository接口的接口,为每一个接口实例一个代理类(SimpleJpaRepository),并为每个方法确定一个query策略,以及其他所需的bean,
使用自定的repository时,是使用的代理类,经过一些列的拦截器后,选取一个query执行器JpaQueryExecution,然后创建Query对象,拼接sql,组装参数等DB操作,
最后返回Query.getResultList()。

扩展

mybatis ,mybatis-plus 和 hibernate比较

mybatis :
半自动ORM
Mybatis需要维护SQL和结果映射。
MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
单个语句执行效率更高。
与代码实现解耦,不对应用程序产生影响
hibernate:
全自动ORM
Hibernate的DAO层开发简单,代码量少
Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
Hibernate数据库移植性很好,Hibernate有更好的二级缓存机制,可以使用第三方缓存。
封装的程度高导致单个语句执行性能会低一些。
修改sql需要在代码里
mybatis-plus:
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生
导入相应依赖然后继承 BaseMapper 接口即可。有强大的代码生成器,简化了代码开发。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值