1.什么是jpql

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

2.jpql和sql的区别

(1)jpql操作对象的是对象里面的属性而sql操作的是数据表和表里面的列
	(2)在jpql里面不能出现 * ,不能出现表名

3.jpql的语法

基本查询
	select(对象属性)from 类join o where 条件
	
	聚集函数(使用方法和sql一样)
	count 求记录数 max 求最大值 sum 求和 min 求最小 avg 求平均
	
	子查询(使用方法和sql一样)
	eg:	select p from Employee p where p.salary > (select avg(o.salary) from Employee o)
	
	jpql集合的使用
	可以使用size 判断有没有值
	eg:	select o from Project o where o.employees.size = 0

4.jpa对SQL的支持

使用createNativeQuery方法
eg:

String sql = "select p.* from employee p ";
    Query query = entityManager.createNativeQuery(sql);

5.事务

事务:一组逻辑操作 要么都成功,要么都时候 (同生共死)
事务的特性(ACID)
A原子性:
		事务这个操作 它已经是最小单元,不能再去分割
	
	C一致性:
		数据一致性 金额一致,操作之前,总金额10000,操作完之后,总金额 10000 
	
	I隔离性:
		体现2个事务以上的操作,事务之间应该具备隔离性,你的事务,不能操作我的事务,如果出现你事务 操作我的事务,就会带来 事务并发的问题
	
	D持久性:
	    当我们事务commit提交的时候,数据就永久的存在下来
事务并发
多个事务(2个或者2个以上的事务),同时在操作同一个数据的时候,这个现象就叫事务并发
事务并发带来的问题
出现第一类丢失更新  --程序处理

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

    脏读   -- 数据库有隔离机制

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

   	不可重复读 -- 数据库有隔离机制
第一类和第二类丢失更新

锁机制:(不会用,有更好的方法)

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

	乐观锁:不用等待,底层需要版本号控制  第一个修改之后,版本号会变更,第二人对这个产品就无法操作
数据库隔离机制
READ UNCOMMITTED:(读未提交) 幻想读(虚读)、不可重复读和脏读都允许。

	READ COMMITTED:允许幻想读,不可重复读,不允许脏读
	
	REPEATABLE READ:允许幻想读,不允许 不可重复读和脏读
	
	SERIALIZABLE:幻想读、不可重复读和脏读都不允许--性能会变低

6.JPA的使用规则或者经验

1. 使用双向一对多关联,不使用单向一对多--效率高一点
	
	2. 灵活使用单向多对一关联 --多方来维护外键效率高一点
	
	3. 不用一对一,用多对一取代(不要使用共享主键一对一,使用唯一外键一对一)
	
	4. 没有查询条件才使用查询缓存(如果有条件命中是很低)
	
	查询缓存:同一个EntityManagerFactory 不同entityManager 发送jpql相同和条件值相同

	5. 组合关系集合使用list(顺序,重复),多对多集合使用set
	
	6. 设计表的时候,表字段要少,表关联不要怕多,有二级缓存撑腰,设计表尽量达到第三范式(外键)

数据库范式:数据库规则

1NF:设计的时候,尽量保证 表里面列不能存放多个值,列最小单元,不能分割(列的原子性 )
	
	2NF:表里面每一行数据都应该有一个唯一能够区分的值(创建主键)
	
	3NF:表里面不应该存放另外一个表非主键的信息