Jpql语句 乐观锁 悲观锁 数据库的三范式 事务并发 jpa经验

1 jpql

1.1 什么是jpql

jpql:就是jpa提供的一种查询语言,类似sql。

1.2 jpql和sql有区别

(1)jpql操作对象和对象里面的属性 sql操作 表 和表里面的列 区分大小写

(2)在jpql里面 不能出现 * ,不能出现表名

(3) jpql和sql 他们关键字是相同 ,关键字不区分大小写

1.3 jpql的语法

sql语法:

​ select *

from table

​ where 过滤条件

​ group by 分组条件

​ having 分组之后的过滤 avg(score) > 98

​ order by 排序

jpql 类似

select o.name,o(对象属性)

from 类 o join o.类里面属性名 p

where o.属性名

group by o.属性名

order by

1.4 jpql里面join

sql:链接查询

​ 外连接 :分为左外连接(左边表数据全部必须包含 .和 右边表的交集部分)和 右外连接(反之) left join right join

​ 内连接 :取交集部分的数据 join

jpql:

select o from Employee o join o.department d

1.5 聚集函数 --和sql一样

sql: 对一组数据 求下面的这些值

​ count 求记录数 max 求最大值 sum 求和 min 求最小 avg 求平均

1 5 6 8 2 -->count 5 max 8 min 1 sum 22 avg 22/5

伴随着分组使用 group by

1.6 子查询 --和sql一样

子查询:

​ 把一个查询的结果 作为另外一个查询的条件或者表来使用

子查询:嵌套查询

select p from Employee p where p.salary > (select avg(o.salary) from Employee o)

1.7 jpql集合的使用

可以使用size 判断有没有值

select o from Project o where o.employees.size = 0

1.8分页

sql语法:

​ select * from table where limit beginIndex,pageSize

currentPage:当前页

pageSize: 每页的条数

beginIndex:起始的位置 beginIndex = (currentPage-1)* pageSize

pageSize:每页的条数

​ select * from table where limit 0,5

​ select * from table where limit 5,5

2 SQL的支持

对sql

使用该方法

createNativeQuery

3 事务并发

3.1 什么是事务

transaction

事务:一组逻辑操作 要么都成功,要么都失败 (同生共死)

3.2 事务的特性有哪些(ACID)

原子性:A

​ 事务这个操作 它已经是最小单元,不能再去分割

一致性:C

​ 数据一致性 金额一致,操作之前,总金额10000,操作完之后,总金额 10000

隔离性:(今天)I

​ 体现2个事务以上的操作,事务之间应该具备隔离性,你的事务,不能操作我的事务,如果出现你事务 操作我的事务,就会带来 事务并发的问题

持久性:D

​ 当我们事务commit提交的时候,数据就永久的存在下来

3.3 事务并发

事务并发:

​ 多个事务(2个或者2个以上的事务),同时在操作同一个数据的时候,这个现象就叫事务并发

事务并发会带来一些问题: – 通过数据库隔离机制解决

​ 出现第一类丢失更新 --程序处理

​ 第二类丢失更新 --程序处理

​ 脏读 – 数据库有隔离机制

​ 虚度 (幻度) – 数据库有隔离机制

​ 不可重复读 – 数据库有隔离机制

3.4数据库隔离机制

四种

READ UNCOMMITTED(读未提交) 幻想读(虚读)、不可重复读和脏读都允许。

READ COMMITTED 允许幻想读,不可重复读,不允许脏读

REPEATABLE READ 允许幻想读,不允许 不可重复读和脏读

SERIALIZABLE 幻想读、不可重复读和脏读都不允许–性能肯定会变低

3.5 第一类和第二类丢失更新

锁机制

​ 悲观锁:很悲观的一把锁 需要等待锁释放,才能操作数据,性能不高

​ 乐观锁:不用等待,底层需要版本号控制 第一个修改之后,版本号会变更,第二人对这个产品就无法操作

4JPA的使用规则 或者经验

\1. 使用双向一对多关联,不使用单向一对多–效率高一点

\2. 灵活使用单向多对一关联 --多方来维护外键效率高一点

\3. 不用一对一,用多对一取代(不要使用共享主键一对一,使用唯一外键一对一)

\4. 配置对象二级缓存(配置 Cacheable),查询缓存(jpql查询),

​ 没有查询条件才使用查询缓存(如果有条件命中是很低)

​ 查询缓存:

​ 同一个EntityManagerFactory 不同entityManager 发送jpql相同和条件值相同

\5. 组合关系集合使用list(顺序,重复)–第二个项目 单据模块,多对多集合使用set

\6. 设计表的时候,表字段要少,表关联不要怕多,有二级缓存撑腰,设计表尽量达到第三范式(外键)

​ 数据库范式:数据库规则

​ 1NF:设计的时候,尽量保证 表里面列不能存放多个值,列最小单元,不能分割 --体系列原子性

​ 2NF:表里面每一行数据都应该有一个唯一能够区分的值,建议你都创建主键

​ 3NF:表里面不应该存放另外一个表非主键的信息 --建议你一个外键

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值