jpaday4

配置查询对象的模型

E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型
在这里插入图片描述在这里插入图片描述

模型映射

Department
在这里插入图片描述Employee
在这里插入图片描述Phone
在这里插入图片描述Project
在这里插入图片描述

JPQL

最基本的JPQL的格式
使用JPQL 只能写类名和属性名

SELECT o[o.property,o.property] FROM Entity o
[WHERE conditions]
[GROUP BY conditions]
[HAVING conditions]
[ORDER BY o.property[ASC|DESC]]
JPQL本质是JPA通过antlr-2.7.7.jar翻译成sql并且封装执行的。
*

学JPQL记住两个点

1.JPQL和SQL很像,查询关键字都是一样的
2.唯一的区别是:JPQL是面向对象的

JPQL书写规则

JPA的查询语言,类似于sql
1.里面不能出现表名,列名,只能出现java的类名,属性名,区分大小写
2.出现的sql关键字是一样的意思,不区分大小写
3.不能写select * 要写select 别名

各类查询示例

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

原生SQL查询

jpa 还可以对原生sql进行支持在这里插入图片描述

在这里插入图片描述在这里插入图片描述

事务并发(乐观锁)

事务4个特性ACID
原子性(atomic),事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行
一致性(consistent),事务在完成时,必须使所有的数据都保持一致状态。
隔离性(insulation),由事务并发所作的修改必须与任何其它并发事务所作的修改隔离。
持久性(Duration),事务完成之后,它对于系统的影响是永久性的。

事务并发
通常为了获得更好的运行性能,各种数据库都允许多个事务同时运行,这就是事务并发。

隔离机制
当并发的事务访问或修改数据库中相同的数据(同一行同一列)时,通常需要采取必要的隔离机制。
解决并发问题的途径是什么?答案是:采取有效的隔离机制。
怎样实现事务的隔离呢?隔离机制的实现必须使用锁

事务并发带来的问题

以下事务都是发生在毫秒级的时间差
JPA只能处理第一、二类丢失更新,其他3种必须由数据库自己处理
第一类丢失更新:(在秒杀场景会出现问题)
库存是1件
当事务A和事务B同时修改某行的值,
1.事务A将数值改为0并提交,购买了一件
2.事务B将数值改为0并提交,也购买了一件。这时数据的值为0,事务A所做的更新将会丢失。(相当于就卖出去2件商品)
解决办法:对行加锁,只允许并发一个更新事务。(JPA中的悲观锁,乐观锁)

脏读
1.张三的原工资为4000, 财务人员将张三的工资改为了8000(但未提交事务)
2.张三读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!(在缓存中读取)
3.而财务发现操作有误,回滚了事务,张三的工资又变为了4000 像这样,张三记取的工资数8000是一个脏数据。
解决办法:如果在第一个事务提交前,任何其他事务不可读取其修改过的值,则可以避免该问题。

虚读(幻读)
目前工资为4000的员工有10人。
1.事务1,读取所有工资为4000的员工。
2.这时事务2向employee表插入了一条员工记录,工资也为4000
3.事务1再次读取所有工资为4000的员工共读取到了11条记录,
解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题。

不可重复读
在一个事务中前后两次读取的结果并不致,导致了不可重复读。
1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成
2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.
3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。

第二类丢失更新
多个事务同时读取相同数据,并完成各自的事务提交,导致最后一个事务提交会覆盖前面所有事务对数据的改变

数据库事务隔离级别(使用数据库默认的隔离级别就可以了)

SERIALIZABLE隔离级别最高,效率最低
一般都不修改隔离级别,如果要改,问dba(数据库管理员)
在这里插入图片描述

悲观锁(处理的是同一张表的同一行同一列记录),用户体验非常差

如果使用了悲观锁(加了一个行锁),如果事务没有被释放,就会造成其他事务处于等待
不用,不用哦!!!!
使用数据库提供的锁机制实现悲观锁。
如果数据库不支持设置的锁机制,JPA会使用该数据库提供的合适的锁机制来完成,而不会报错。
使用entityManager.find(class,id,LockModeType);加悲观锁,相当于发送SELECT … FOR UPDATE(加了一个行锁)
使用entityManager.lock(object,LockModeType);加悲观锁,相当于发送SELECT id FROM … FOR UPDATE(加了一个行锁)

乐观锁(处理的还是同一张表的同一行同一列记录)

Version方式(整数,存储空间小)
// 添加一个私有字段Integer version,不由程序员维护,由JPA自己维护
@Version
private Integer version;

在这里插入图片描述
模拟有两人同时操作

在这里插入图片描述这时候就会报错提示,再数据库中就只进行了一次处理
在这里插入图片描述

如何优化JPA

1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向多对一关联
3.不用一对一,用多对一取代(不要使用共享主键一对一,使用唯一外键一对一)
4.配置对象二级缓存,查询缓存(jpql查询),没有查询条件才使用查询缓存
5.组合关系集合使用list(顺序,重复),多对多集合使用set
6.表字段要少,表关联不要怕多,有二级缓存撑腰,设计表尽量达到第三范式
JPA难在什么地方 -> 细节(练,思考)太多了,性能太难控制了(经验)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值