JPQL写法
1、jpql的语法
jpql操作对象和对象里面的属性 sql操作 表 和表里面的列 区分大小写
在jpql里面 不能出现 * ,不能出现表名
jpql和sql 他们关键字是相同 ,关键字不区分大
基本查询
select o from Employee o
查询实体类型
select o.name,o.department.name from Employee o
select new Employee(o.name,o.department.name)from Employee o
查询特定属性
select o from Employee o where o.department.city=? or o.department.city=?
jpql集合的使用 可以使用size 判断有没有值
select o from Project o where o.employees.size = 0
select o from Department o where o.employees.size>0
过滤查询
select *
from table
where 过滤条件
group by 分组条件
having 分组之后的过滤 avg(score) > 98
order by 排序
去重
distinct
select distinct o.department from Employee o
排序查询
查询排序
select o from Employee o order by o.salary desc
使用关联对象属性排序
select o from Employee o order by o.department.id desc
使用IN
select o from Employee o where o.department.street in(?0,?1)
使用BETWEEN..AND..
select o from Employee o where o.salary between:min and :max
使用LIKE
select o from Employee o where o.name like ? or o.name like ?
聚集查询
平均值和最大值
select o.department.name,avg(o.salary),
max(o.salary) from Employee o GROUP BY o.department.name
各个项目参与人数报表
select p.name,p.employees.size from Project p
分页–了解
sql语法:
select * from table where limit beginIndex,pageSize
currentPage:当前页
pageSize: 每页的条数
beginIndex:起始的位置 beginIndex = (currentPage-1)* pageSize
pageSize:每页的条数
select * from table where limit 0,5 查询1-5
select * from table where limit 5,5 查询5-5
子查询
把一个查询的结果 作为另外一个查询的条件或者表来使用
子查询:嵌套查询
select p from Employee p where p.salary > (select avg(o.salary) from Employee o)
join查询
1.不写on子句
2.模型 模型的别名 join 写前面模型别名.出来的对象属性
select o.name,d.name from Employee o join o.department d
2、SQL的支持
对sql 使用该方法 createNativeQuery
3、事务并发
什么是事务:
一组逻辑操作 要么都成功,要么都时候 (同生共死)
事务的特性有哪些(ACID)
原子性:A
事务这个操作 它已经是最小单元,不能再去分割
一致性:C
数据一致性 金额一致,操作之前,总金额10000,操作完之后,总金额 10000
隔离性:
体现2个事务以上的操作,事务之间应该具备隔离性,你的事务,不能操作我的事务,如果出现你事务 操作我的事务,就会带来 事务并发的问题
持久性:D
当我们事务commit提交的时候,数据就永久的存在下来
事务并发
多个事务(2个或者2个以上的事务),同时在操作同一个数据的时候,这个现象就叫事务并发
事务并发会带来一些问题: – 通过数据库隔离机制解决
出现第一类丢失更新 --程序处理
第二类丢失更新 --程序处理
脏读 – 数据库有隔离机制
虚度 (幻度) – 数据库有隔离机制
不可重复读 – 数据库有隔离机制
数据库隔离机制
READ UNCOMMITTED(读未提交) 幻想读(虚读)、不可重复读和脏读都允许。
READ COMMITTED 允许幻想读,不可重复读,不允许脏读
REPEATABLE READ 允许幻想读,不允许 不可重复读和脏读
SERIALIZABLE 幻想读、不可重复读和脏读都不允许–性能肯定会变低
第一类和第二类丢失更新
锁机制
悲观锁:很悲观的一把锁 需要等待锁释放,才能操作数据,性能不高
乐观锁:不用等待,底层需要版本号控制 第一个修改之后,版本号会变更,第二人对这个产品就无法操作
JPA的使用规则 或者经验
- 使用双向一对多关联,不使用单向一对多–效率高一点
- 灵活使用单向多对一关联 --多方来维护外键效率高一点
- 不用一对一,用多对一取代(不要使用共享主键一对一,使用唯一外键一对一)
- 配置对象二级缓存(配置 Cacheable),查询缓存(jpql查询),没有查询条件才使用查询缓存(如果有条件命中是很低)
查询缓存:
同一个EntityManagerFactory 不同entityManager 发送jpql相同和条件值相同 - .组合关系集合使用list(顺序,重复)–第二个项目 单据模块,多对多集合使用set
- 设计表的时候,表字段要少,表关联不要怕多,有二级缓存撑腰,设计表尽量达到第三范式(外键)
数据库范式:数据库规则
1NF:设计的时候,尽量保证 表里面列不能存放多个值,列最小单元,不能分割 --体系列原子性
2NF:表里面每一行数据都应该有一个唯一能够区分的值,建议你都创建主键
3NF:表里面不应该存放另外一个表非主键的信息 --建议你一个外键