1 jpql
1.1 jpql是jpa提供的一种查询语言,类似sql。
1.2 jpql和sql的区别
(1)jpql操作对象和对象里面的属性,sql操作数据库,区分大小写
(2)在jpql里面 不能出现 * ,不能出现表名
(3)jpql和sql关键字相同且不区分大小写
1.3 jpql的语法
select o from Employee o join o.department d
给类名加别名o ,操作属性的时候用o.属性名
1.4链接查询
外连接 :分为左外连接(左边表数据全部必须包含 .和 右边表的交集部分)和 右外连接(反之) left join right join
内连接 :取交集部分的数据 join
1.5 聚集函数 --和sql一样
count记录数
max最大值
min最小值
avg平均值
sum总数
1.6 子查询 --和sql一样
子查询:嵌套查询
把一个查询的结果 作为另外一个查询的条件或者表来使用
1.7 jpql集合
使用size 判断有没有值(select o from Project o where o.employees.size = 0)
1.8分页
query.setFirstResult(5).setMaxResults(5);
setFirstResult 起始条数
setMaxResults 每页条数
2 SQL的支持
使用createNativeQuery方法(Query query = entityManager.createNativeQuery(sql);)
3 事务并发
3.1事务(transaction):一组逻辑操作 要么都成功,要么都失败 (同生共死)
3.2 事务的特性
原子性:事务已经是最小单元,不能再去分割
一致性:数据一致性
隔离性:体现2个事务以上的操作,事务之间应该具备隔离性
持久性:事务提交(commit)的时候,数据就永久的存在下来
3.3 事务并发:多个事务(2个或者2个以上的事务)同时操作同一个数据
事务并发会带来以下问题
第一类丢失更新,第二类丢失更新, 脏读,虚读(幻读),不可重复读
3.4数据库隔离机制
READ UNCOMMITTED(读未提交) 幻想读(虚读)、不可重复读和脏读都允许。
READ COMMITTED 允许幻想读,不可重复读,不允许脏读
REPEATABLE READ 允许幻想读,不允许 不可重复读和脏读
SERIALIZABLE 幻想读、不可重复读和脏读都不允许--性能肯定会变低
3.5 第一类和第二类丢失更新
锁机制
悲观锁:需要等待锁释放,才能操作数据,性能不高
乐观锁:不用等待,底层需要版本号控制 第一个修改之后,版本号会变更,第二人对这个产品就无法操作