Hibernate基础学习2

测试hibernate的一级缓存,事务以及查询语句

1)Hibernate的一些相关概念

hibernate的一级缓存
1)缓存是为了提高该框架对数据库的查询速度
2)一级缓存是将获取的结果放到了session中,再次查询直接从缓存中获取(提高查询效率)
3)缓存进阶之快照:将获取的一份结果放到session中,一份放到快照中,当修改时,对比快照与缓存,
如果数据没有发生变化,直接结束修改(避免不必要的修改)hibernate的事务
在业务开始之前打开事务,在业务结束时提交事务,如果出现异常则回滚事务1)事务的4大特性
A:原子性(Atomicity)事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
B:一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
C:隔离性(Isolation)一个事务的执行不能被其他事务干扰。
D:持续性/永久性(Durability)一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。2)事务并发存在的问题
1.丢失更新:撤消一个事务时,把其它事务已提交的更新的数据覆盖了。
2.脏读:一个事务读到另一个事务未提交的更新数据。
3.幻读:一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行。
4.不可重复读:一个事务两次读同一行数据,可是这两次读到的数据不一样。3)事务的隔离级别(处理事务并发问题)
1.Read uncommitted(读未提交)
顾名思义,就是一个事务可以读取另一个未提交事务的数据。事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,
按成3.9万/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,
发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,
将数字改成3.6万再提交。分析:实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是脏读。那怎么解决脏读呢?Read committed!读提交,能解决脏读问题。2.Read committed(读提交)
顾名思义,就是一个事务要等另一个事务提交后才能读取数据。事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),
收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。
当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。
程序员就会很郁闷,明明卡里是有钱的…分析:这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后
才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,
这就是不可重复读。那怎么解决可能的不可重复读问题?Repeatable read !3.Repeatable read(重复读)
就是在开始读取数据(事务开启)时,不再允许修改操作事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(事务开启,不允许其他事务的UPDATE修改操作),
收费系统事先检测到他的卡里有3.6万。这个时候他的妻子不能转出金额了。接下来收费系统就可以扣款了。分析:重复读可以解决不可重复读问题。写到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。
但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。什么时候会出现幻读?事例:程序员某一天去消费,花了2千元,然后他的妻子去查看他今天的消费记录(全表扫描FTS,妻子事务开启),
看到确实是花了2千元,就在这个时候,程序员花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。
当妻子打印程序员的消费记录清单时(妻子事务提交),发现花了1.2万元,似乎出现了幻觉,这就是幻读。那怎么解决幻读问题?Serializable!4.Serializable(序列化,串行化:排队执行)
Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。
但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

study

2)在主配置文件中添加如下配置对事务进行管理

<!-- 指定hibernate操作数据库时的隔离级别#hibernate.connection.isolation 1|2|4|80001    1    读未提交0010    2    读已提交0100    4    可重复读1000    8    串行化--><property name="hibernate.connection.isolation">4</property><!-- 指定session与当前线程绑定,事务中确保使用同一个session --><property name="hibernate.current_session_context_class">thread</property>

3)测试对象的3种状态

package com.hibernate.test;import com.hibernate.domain.Customer;
import com.hibernate.utils.HibernateUtils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;/*** @author: 肖德子裕* @date: 2018/11/15 11:41* @description: 测试hibernate框架*/
public class Test {/*** 添加客户信息*/@org.junit.Testpublic void addTest(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************///对象的3种状态体现(状态之间的转换)//瞬时状态:没有ID,没有与session关联Customer customer=new Customer();customer.setCust_name("xdzy");//持久化状态:有ID,与session有关联
        session.save(customer);/*******************************************************/tx.commit();//游离|托管状态,有ID,与sesssion无关联
        session.close();}/*** 删除客户信息*/@org.junit.Testpublic void deleteTest(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************///获取ID为1的客户Customer customer = session.get(Customer.class, 30L);//删除
        session.delete(customer);/*******************************************************/tx.commit();session.close();}/*** 修改客户信息*/@org.junit.Testpublic void updateTest(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************/Customer customer = session.get(Customer.class, 6L);customer.setCust_name("xdzy");session.update(customer);/*******************************************************/tx.commit();session.close();}/*** 查询客户信息*/@org.junit.Testpublic void selectTest(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************/Customer customer = session.get(Customer.class, 6L);System.out.println(customer);/*******************************************************/tx.commit();session.close();}
}

测试

4)测试事务中获取session的方法

package com.hibernate.test;import com.hibernate.utils.HibernateUtils;
import org.hibernate.Session;
import org.junit.Test;/*** @author: 肖德子裕* @date: 2018/11/16 10:00* @description: 测试事务中获取session的方法*/
public class Test2 {/*** 获取绑定的session是同一个,可以确保事务使用同一个session* 用该方法获取事务提交后会自动关闭,所以事务提交之后不能手动关闭,会引发异常*/@Testpublic void test(){Session session = HibernateUtils.getCurrentSession();Session session1 = HibernateUtils.getCurrentSession();System.out.println(session==session1);}/*** 获取新的session*/@Testpublic void test1(){Session session = HibernateUtils.openSession();Session session1 = HibernateUtils.openSession();System.out.println(session==session1);}
}

测试

5)测试HQL语句

package com.hibernate.test;import com.hibernate.domain.Customer;
import com.hibernate.utils.HibernateUtils;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;import java.util.List;/*** @author: 肖德子裕* @date: 2018/11/16 10:26* @description: 测试HQL语句(hibernate独有的面向对象的语法)(适合不复杂的多表查询)* HQL语句不能出现数据库相关字段,而是类的属性或类的名称*/
public class Test3 {/*** 查询所有*/@Testpublic void test(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************///1)书写HQL语句String hql="from Customer";//2)创建查询对象Query query = session.createQuery(hql);//3)执行查询List<Customer> list = query.list();System.out.println(list);/*******************************************************/tx.commit();session.close();}/*** 指定查询*/@Testpublic void test1(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************///1)书写HQL语句String hql="from Customer where cust_id=6";//2)创建查询对象Query query = session.createQuery(hql);//3)执行查询Customer customer = (Customer) query.uniqueResult();System.out.println(customer);/*******************************************************/tx.commit();session.close();}/*** 占位符*/@Testpublic void test2(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************///1)书写HQL语句String hql="from Customer where cust_id=?";//2)创建查询对象Query query = session.createQuery(hql);//3)设置参数//query.setLong(0,6L);query.setParameter(0,6L);//4)执行查询Customer customer = (Customer) query.uniqueResult();System.out.println(customer);/*******************************************************/tx.commit();session.close();}/*** 命名占位符*/@Testpublic void test3(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************///1)书写HQL语句String hql="from Customer where cust_id= :cust_id";//2)创建查询对象Query query = session.createQuery(hql);//3)设置参数//query.setLong(0,6L);query.setParameter("cust_id",6L);//4)执行查询Customer customer = (Customer) query.uniqueResult();System.out.println(customer);/*******************************************************/tx.commit();session.close();}/*** 分页查询所有*/@Testpublic void test4(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************///1)书写HQL语句String hql="from Customer";//2)创建查询对象Query query = session.createQuery(hql);//3)设置分页条件(从0开始查询1条)query.setFirstResult(0);query.setMaxResults(1);//4)执行查询List<Customer> list = query.list();System.out.println(list);/*******************************************************/tx.commit();session.close();}
}

测试

6)测试Criteria语句

package com.hibernate.test;import com.hibernate.domain.Customer;
import com.hibernate.utils.HibernateUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;import java.util.List;/*** @author: 肖德子裕* @date: 2018/11/16 10:26* @description: 测试criteria语句(hibernate独有的无语句的全面向对象的查询语法)(适合单表查询)* > (gt)* >= (ge)* < (lt)* <= (le)* == (eq)* != (ne)* in (in)* between and (between)* like (like)* is not null (isNotNull)* is null (isNull)* or (or)* and (and)*/
public class Test4 {/*** 查询所有*/@Testpublic void test(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************/Criteria criteria = session.createCriteria(Customer.class);List list = criteria.list();System.out.println(list);/*******************************************************/tx.commit();session.close();}/*** 指定查询*/@Testpublic void test1(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************/Criteria criteria = session.createCriteria(Customer.class);criteria.add(Restrictions.eq("cust_id",6L));Customer customer = (Customer) criteria.uniqueResult();System.out.println(customer);/*******************************************************/tx.commit();session.close();}/*** 分页查询所有*/@Testpublic void test2(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************/Criteria criteria = session.createCriteria(Customer.class);criteria.setFirstResult(0);criteria.setMaxResults(1);List list = criteria.list();System.out.println(list);/*******************************************************/tx.commit();session.close();}/*** 查询总记录数,分页总行数*/@Testpublic void test3(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************/Criteria criteria = session.createCriteria(Customer.class);criteria.setProjection(Projections.rowCount());Long count = (Long) criteria.uniqueResult();System.out.println(count);/*******************************************************/tx.commit();session.close();}
}

测试

7)测试原生SQL语句

package com.hibernate.test;import com.hibernate.domain.Customer;
import com.hibernate.utils.HibernateUtils;
import org.hibernate.*;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;/*** @author: 肖德子裕* @date: 2018/11/16 10:26* @description: 测试原生SQL语句查询(适合复杂多表查询)*/
public class Test5 {/*** 查询所有*/@Testpublic void test(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************/String sql="select * from cst_customer";SQLQuery query = session.createSQLQuery(sql);List<Object[]> list = query.list();for (Object[] customers:list){System.out.println(Arrays.toString(customers));}/*******************************************************/tx.commit();session.close();}/*** 查询所有并且封装到对象*/@Testpublic void test1(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************/String sql="select * from cst_customer";SQLQuery query = session.createSQLQuery(sql);query.addEntity(Customer.class);List<Customer> list = query.list();System.out.println(list);/*******************************************************/tx.commit();session.close();}/*** 占位符*/@Testpublic void test2(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************/String sql="select * from cst_customer where cust_id=?";SQLQuery query = session.createSQLQuery(sql);query.setParameter(0,6L);query.addEntity(Customer.class);Customer customer = (Customer) query.uniqueResult();System.out.println(customer);/*******************************************************/tx.commit();session.close();}/*** 分页查询*/@Testpublic void test3(){//创建Session对象Session session = HibernateUtils.openSession();//开启事务并获取事务对象Transaction tx = session.beginTransaction();/********************* 数据库操作 **********************/String sql="select * from cst_customer limit ?,?";SQLQuery query = session.createSQLQuery(sql);query.setParameter(0,0);query.setParameter(1,1);query.addEntity(Customer.class);List<Customer> list = query.list();System.out.println(list);/*******************************************************/tx.commit();session.close();}
}

测试

转载于:https://www.cnblogs.com/xdzy/p/9974922.html

Hibernate基础学习2相关推荐

  1. hibernate 基础学习

    2019独角兽企业重金招聘Python工程师标准>>> Hibernate 一.是什么: Hibernate是轻量级的ORM框架. 1.ORM(ORMapping) Object R ...

  2. Hibernate基础学习(二)—Hibernate相关API介绍

    一.Hibernate的核心接口 所有的Hibernate应用中都会访问Hibernate的5个核心接口. (1)Configuration接口: 配置Hibernate,启动Hibernate,创建 ...

  3. java基础知识点_零基础学习Java语言,各个阶段需要掌握的知识点

    随社会的脚步的不断发展,Java技术在不断的与时俱进,这也是Java一直长盛不衰的原因之一.Java技术的学习,永远没有早晚之分,技不压身,对于21世纪的我们80后,90后,甚至00后,尤其适用! 那 ...

  4. 8. SpringBoot基础学习笔记

    SpringBoot基础学习笔记 课程前置知识说明 1 SpringBoot基础篇 1.1 快速上手SpringBoot SpringBoot入门程序制作 1.2 SpringBoot简介 1.2.1 ...

  5. Hibernate基础之SessionFactory

    Hibernate基础之SessionFactory 在完成下面的一些基础之后我们就开始了下面的学习. 用eclipse使用hibernate 实现用户添加https://blog.csdn.net/ ...

  6. Linux基础学习(Ubuntu)

    Linux非常基础的知识学习和总结 内容参考: 1.man page: 2.鸟哥的Linux私房菜-基础学习篇. 本文章PDF版(我懒得在这上面排版了.都是为了学习,请支持原创): 链接: 百度云盘 ...

  7. 【转】oracle PLSQL基础学习

    [转]oracle PLSQL基础学习 --oracle 练习: /**************************************************PL/SQL编程基础****** ...

  8. python创建对象的格式为_Python入门基础学习(面向对象)

    python基础学习笔记(四) 面向对象的三个基本特征: 封装:把客观事物抽象并封装成对象,即将属性,方法和事件等集合在一个整体内 继承:允许使用现有类的功能并在无须重新改写原来的类情况下,对这些功能 ...

  9. 虚幻引擎虚拟现实开发基础学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.93 GB |时长:5h 15m 了 ...

最新文章

  1. [C# 网络编程系列]专题十:实现简单的邮件收发器
  2. 分数阶simulink工具箱_CCDC 2021特别专题:分数阶微积分与分数阶系统
  3. r语言直方图_R语言绘制频率直方图
  4. 《.NET应用架构设计:原则、模式与实践》新书博客--试读-1.1.2 架构师的职责
  5. 【技巧总结】Penetration Test Engineer[2]-Information gathering
  6. linux服务器 远程桌面,Linux 远程桌面的两种方式
  7. 手把手教你用R语言制作网络爬虫机器人(一)
  8. php ctype xdigit,PHP中的ctype_xdigit()函数
  9. 隧道管廊UWB定位系统解决方案
  10. /etc/login.defs配置文件详解
  11. 给硬件工程师的入门课-系统框图的设计
  12. 计算机无法识别新挂硬盘,windows10系统添加新硬盘识别不了如何解决
  13. BZOJ 3653 谈笑风生
  14. 机器学习之模型评估方法总结
  15. rk3288 linux烧录工具,Firefly-RK3288开发板烧写教程
  16. 苹果硬改技术好在哪里?
  17. Problem D 筛法求素数
  18. 咸鱼硬件—ZTMS开发板固件安装
  19. Java小游戏——飞机大战
  20. 图像处理——图像增强(1)

热门文章

  1. linux入门级知识回顾
  2. keras 模型简介
  3. exception is the version of xbean.jar correct
  4. NOIP 2017 提高组 K: 奶酪 (SPFA || 并查集)
  5. Java项目中读取properties文件,以及六种获取路径的方法
  6. toolkit,phonetextbox中实现用户按回车键会换行
  7. 一个关于重定向的问题研究,应该具有实用性
  8. 通过圆的颜色并结合霍夫变换检测目标圆的OpenCV代码
  9. MATLAB的size()函数的返回值是一个1*2的向量哦,即使参数是向量也是1*2的向量哦!
  10. java运行过程_Java执行过程