JPA乐观锁&悲观锁

Qpql书写规则

    (1)在jpql里面不能刚出现*和表名  只能出现对象别名或者 类名 关键字和sql里面一样
        (2).类名和属性名要区分大小写

     (3)简单的jpql语句 String jpql = "select o from 类名 o";

 一些简单的数据查询

 

定义实体类

建立关联

测试代码

//2.2.1.查询所有员工【查询实体类型】
@Test
public void testQuery1()throws Exception{
EntityManager entityManager = Util.getentityManager();
String spql = "select o from Employee o";
Query query = entityManager.createQuery(spql);
List<Employee> resultList = query.getResultList();
for (Employee o : resultList) {
System.out.println(o);
}
}
//2.2.2.查询所有员工的姓名和所属部门名称【查询特定属性】
@Test
public void testQuery2()throws Exception{
EntityManager entityManager = Util.getentityManager();
String spql = "select o.name,o.department.name from Employee o";
Query query = entityManager.createQuery(spql);
List<Object[]> resultList = query.getResultList();
for (Object[] o : resultList) {
System.out.println(Arrays.toString(o));
}
}
//2.2.3.查询出所有在成都和广州工作的员工【查询结果过滤】
@Test
public void testQuery3()throws Exception{
EntityManager entityManager = Util.getentityManager();
String spql = "select o from Employee o where o.department.city=? or o.department.city=?";
Query query = entityManager.createQuery(spql);
query.setParameter(1, "成都");
query.setParameter(2,"广州" );
List<Employee> resultList = query.getResultList();
for (Employee o : resultList) {
System.out.println(o);
}

}
//2.2.4.查询出所有员工信息,按照月薪排序【查询排序】
//oder by 需要排序的内容 排序的方式DESC asc
@Test
public void testQuery4()throws Exception{
EntityManager entityManager = Util.getentityManager();
String spql = "select o from Employee o order by o.salary DESC ";
Query query = entityManager.createQuery(spql);
List<Employee> resultList = query.getResultList();
for (Employee o : resultList) {
System.out.println(o);
}

}
//2.2.5.查询出所有员工信息,按照部门编号排序【使用关联对象属性排序】
@Test
public void testQuery5()throws Exception {
EntityManager entityManager = Util.getentityManager();
String spql = "select o from Employee o order by o.department.sn asc ";
Query query = entityManager.createQuery(spql);
List<Employee> resultList = query.getResultList();
for (Employee o : resultList) {
System.out.println(o);
}
}

//2.2.6.查询出在恩宁路和八宝街上班的员工信息【使用IN
@Test
public void testQuery6 ()throws Exception {
EntityManager entityManager = Util.getentityManager();
String spql = "select o from Employee o where o.department.street in(?,?)";
Query query = entityManager.createQuery(spql);
query.setParameter(1, "恩宁路" ).setParameter(2, "八宝街" );
List<Employee> resultList = query.getResultList();
for (Employee o : resultList) {
System.out.println(o);
}

}
//2.2.7.查询出工资在5000-6000的员工【使用BETWEEN..AND..
@Test
public void testQuery7()throws Exception {
EntityManager entityManager = Util.getentityManager();
String spql = "select o from Employee o where o.salary between 5000 and 6000";
Query query = entityManager.createQuery(spql);
List<Employee> resultList = query.getResultList();
for (Employee o : resultList) {
System.out.println(o);
}

}
//2.2.8.查询出姓名包含er或者en的员工【使用LIKE
@Test
public void testQuery8()throws Exception {
EntityManager entityManager = Util.getentityManager();
String spql = "select o from Employee o where o.name like ? or o.name like ?";
Query query = entityManager.createQuery(spql);
query.setParameter(1, "%er%" ).setParameter(2, "%en%" );
List<Employee> resultList = query.getResultList();
for (Employee o : resultList) {
System.out.println(o);
}

}
// 查询出有员工的部门【size
@Test
public void testQuery9()throws Exception {
EntityManager entityManager = Util.getentityManager();
String spql = "select o.name from Department o where o.employees.size>0";
Query query = entityManager.createQuery(spql);
List<String> resultList = query.getResultList();
for (String o : resultList) {
System.out.println(o);
}

}
//2.3.1.查询出有员工的部门【distinct
@Test
public void testQuery10()throws Exception {
EntityManager entityManager = Util.getentityManager();
String spql = "select distinct o.department.name from Employee o";
Query query = entityManager.createQuery(spql);
List<String> resultList = query.getResultList();
for (String o : resultList) {
System.out.println(o);
}

}

//2.4.2.查询出部门信息,按照部门的员工人数排序
@Test
public void testQuery11()throws Exception{
EntityManager entityManager = Util.getentityManager();
String spql = "select o from Department o order by o.employees.size asc ";
Query query = entityManager.createQuery(spql);
List<Department> resultList = query.getResultList();
for (Department o : resultList) {
System.out.println(o);
}
}
//2.4.3.查询出没有员工参与的项目【对集合使用size
@Test
public void testQuery12()throws Exception{
EntityManager entityManager = Util.getentityManager();
String spql = "select o.name from Project o where o.employees.size=0";
Query query = entityManager.createQuery(spql);
List<String> resultList = query.getResultList();
for (String o : resultList) {
System.out.println(o);
}
}
//2.5.1.查询出所有员工及部门名称【JOIN/LEFT JOIN
@Test
public void testQuery13()throws Exception{
EntityManager entityManager = Util.getentityManager();
String spql = "select o.name,d.name from Employee o join o.department d";
Query query = entityManager.createQuery(spql);
List<Object[]> resultList = query.getResultList();
for (Object[] o : resultList) {
System.out.println(Arrays.toString(o));
}
}
//2.5.2.查询出市场部员工信息及电话
@Test
public void testQuery14()throws Exception{
EntityManager entityManager = Util.getentityManager();
String spql = "select o.employee.name,o.number from Phone o ";
Query query = entityManager.createQuery(spql);
List<Object[]> resultList = query.getResultList();
for (Object[] o : resultList) {
System.out.println(Arrays.toString(o));
}
}
//2.6.1.查询出各个部门员工的平均工资和每个部门的最高工资【使用聚集函数】
@Test
public void testQuery15()throws Exception{
EntityManager entityManager = Util.getentityManager();
String sqpl = "select avg (o.salary),max(o.salary)from Employee o group by o.department";
Query query = entityManager.createQuery(sqpl);
List <Object[]>resultList = query.getResultList();
for (Object[] s : resultList) {
System.out.println(Arrays.toString(s));
}
//[工业制造ERP, 2]
//[服装ERP, 3]
//[蓝源EDP, 0]
//[蓝源OA, 2]
//[蓝源SAAS平台, 0]
//[装饰ERP, 3]
//[通用CRM, 4]

}
//2.6.2.查询出各个项目参与人数报表
@Test
public void testQuery16()throws Exception{
EntityManager entityManager = Util.getentityManager();
String sqpl = "select o.name,o.employees.size from Project o group by o.name";
/* String sqpl = "select o.name,o.employees.size from Project o where o.employees.size>0";*/
Query query = entityManager.createQuery(sqpl);
List <Object[]>resultList = query.getResultList();
for (Object[] s : resultList) {
System.out.println(Arrays.toString(s));
}
}
//2.7.查询出大于平均工资的员工信息
@Test
public void testQuery17()throws Exception{
EntityManager entityManager = Util.getentityManager();
String sqpl = "select o from Employee o where salary>(select avg(o.salary) from Employee o) ";
Query query = entityManager.createQuery(sqpl);
List <Object>resultList = query.getResultList();
for (Object s : resultList) {
System.out.println(s);
}

}
//分页查询
@Test
public void testQuery18()throws Exception{
EntityManager entityManager = Util.getentityManager();
String sqpl = "select o from Employee o";
Query query = entityManager.createQuery(sqpl);
query.setFirstResult(1).setMaxResults(5);
List<Employee> resultList = query.getResultList();
for (Employee employee : resultList) {
System.out.println(employee);
}
}
//3.3.获取记录总数,返回类型是Long
@Test
public void testQuery19()throws Exception{
EntityManager entityManager = Util.getentityManager();
String sqpl = "select count(o) from Employee o";
Query query = entityManager.createQuery(sqpl);
Long result = (Long) query.getSingleResult();
System.out.println(result);

}
//原生sql
@Test
public void testQuery20()throws Exception{
EntityManager entityManager = Util.getentityManager();
String sqpl = "select * from employee";
Query nativeQuery = entityManager.createNativeQuery(sqpl);
List <Object[]>resultList = nativeQuery.getResultList();
for (Object[] o : resultList) {
System.out.println(Arrays.toString(o));
}
}
@Test
//告诉createNativeQuery把查询出来的字段转换成Employee对象
public void testQuery21()throws Exception{
EntityManager entityManager = Util.getentityManager();
String sqpl = "select * from employee";
Query nativeQuery = entityManager.createNativeQuery(sqpl,Employee.class);
List <Employee>resultList = nativeQuery.getResultList();
for (Employee o : resultList) {
System.out.println(o);
}
}

 distinct去重size操作集合

jion  :连接
内连接  外连接    左外连接   右外连接

笛卡尔积:所谓笛卡尔积,通俗点说就是指包含两个集合中任意取出两个元素构成的组合的集合.

事务并发:

    什么是事务:事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)

      事务的特性:原子性(Atomicity) :事务单元是最小的单元 不能分割

           一致性(Consistency):事务执行的结果必须是使数据库数据从一个一致性状态变到另外一种一致性状态。当事务执行成功后就说数据库处于一致性状态
           隔离性(Isolation):一个事务的执行过程中不能影响到其他事务的执行,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行各个事务之间无不干扰。   

           持续性(Durability):即一个事务执一旦提交,它对数据库数据的改变是永久性的。之后的其它操作不应该对其执行结果有任何影响。

并发:通常为了获得更好的运行性能,各种数据库都允许多个事务同时运行,这就是事务并发

 

 事务并发带来的问题:

 

        第一类丢失更新 :  秒杀场景会出现问题
        第二类数据更新:  多个事务同时读取相同数据,并完成各自的事务提交,导致最后一个事务提交会覆盖前面所有事务对数据的改变
        脏读:一个更改的数据未提交 一个人查询更改过后并未提交的数据 头一个人 放弃或者撤销提交的事务  但是第二个人查询到的和真实的不一致
        虚度:A查询得到1条数据 B这时候添加了一条数据  A再次查询就变成了2条
        不可重复读:在一个事务中前后两次读取的结果并不致,导致了不可重复读。

 

悲观锁:JPQL语句加了一把锁  同事只能一个人进行操作  如果为放弃操作权 那么后面想要操作的人就得排队  效率低 但是很安全

乐观锁:给数据库加一个版本 每一操作数据就更新版本 就不会出现事务并发的情况

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/1999wang/p/11267134.html