JPA-day04
一.JPQL的认识与使用
把18个题都写
- JPA的查询语句(面向对象的)
- 关键字和SQL是一样的
- 使用的类和属性(区分大小写)
- 如果获取的是多个值 List<Object[]>
- 关连的法则(1.不写on 2.前面对象的别名.属性)
- 模糊查询JPQL中写? , 设置值 %name%
2 JPA的分页
支持所有数据库(根据方言)
- 设置从第几条数据开始 query.setFirstResult(0)
- 设置每页条数 query.setMaxResults(5)
EntityManager entityManager = JpaUtil.getEntityManager();
//query:查询对象
Query query = entityManager.createQuery("from Employee");
//query.setFirstResult(5);
//query.setMaxResults(5);
query.setFirstResult(15).setMaxResults(5);
List<Employee> list = query.getResultList();
list.forEach(e -> System.out.println(e));
entityManager.close();
拿出到总条数
- 如果确定有且只有一个数据,使用 getSingleResult
- 类型是Long(hibernate3.X是Integer)
EntityManager entityManager = JpaUtil.getEntityManager();
//query:查询对象
// 这条SQL百之百确认只会查到一个数据
Query query = entityManager.createQuery("select count(o) from Employee o");
//Single:单个 这里拿到的是Long类型
// hibernate3.X的版本都使用的Integer
Long count = (Long)query.getSingleResult();
System.out.println(count);
entityManager.close();
3 原生SQL的操作
- 执行SQL,但是需要手动封装对象
- entityManager.createNativeQuery(sql)
String sql = "select * from employee";
EntityManager entityManager = JpaUtil.getEntityManager();
//query:查询对象 Native:原生
Query query = entityManager.createNativeQuery(sql);
List<Object[]> list = query.getResultList();
list.forEach(objs -> {
System.out.println(Arrays.asList(objs));
});
entityManager.close();
- 执行SQL,但是需要自动封装对象
- entityManager.createNativeQuery(sql,Employee.class);
String sql = "select * from employee";
EntityManager entityManager = JpaUtil.getEntityManager();
//query:查询对象 Native:原生
Query query = entityManager.createNativeQuery(sql,Employee.class);
List<Employee> list = query.getResultList();
list.forEach(e -> System.out.println(e));
entityManager.close();
4 事务隔离与锁
4.1 事务的四大特性(ACID)
- 原子性(atomic),事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全- 都不执行
- 一致性(consistent),事务在完成时,必须使所有的数据都保持一致状态。
- 隔离性(insulation),由事务并发所作的修改必须与任何其它并发事务所作的修改隔离。
- 持久性(Duration),事务完成之后,它对于系统的影响是永久性的。
4.2 事务并发会产生哪些问题
- 脏读,虚读,不可重复读,第一类丢失更新,第二类丢失更新
- 脏读,虚读,不可重复读是有事务隔离级别解决(数据库自带)
- 两个丢失更新需要我们自己加锁(乐观(版本号:version),悲观)
4.3 事务隔离级别
- MySql默认隔离级别为:Repeatable Read(可能会出现虚读)
- Oracle 支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别 默认隔离级别为READ COMMITTED
- READ UNCOMMITTED 幻想读、不可重复读和脏读都允许。
- READ COMMITTED 允许幻想读,不a可重复读,不允许脏读
- REPEATABLE READ 允许幻想读,不允许不可重复读和脏读
- SERIALIZABLE 幻想读、不可重复读和脏读都不允许
4.4 怎么完成乐观锁
JPA解决乐观锁
//搞定乐观锁
@Version
private Integer version;