JAVAEE学习——hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示
一、hibernate中的实体规则
实体类创建的注意事项
1.持久化类提供无参数构造
2.成员变量私有,提供共有get/set方法访问.需提供属性
3.持久化类中的属性,应尽量使用包装类型
4.持久化类需要提供oid.与数据库中的主键列对应
5.不要用final修饰class
主键类型
自然主键(少见)
表的业务列中,有某业务列符合,必须有,并且不重复的特征时,该列可以作为主键使用.
代理主键(常见)
表的业务列中,没有某业务列符合,必须有,并且不重复的特征时,创建一个没有业务意义的列作为主键
主键生成策略
代理主键:
identity : 主键自增.由数据库来维护主键值.录入时不需要指定主键.
sequence: Oracle中的主键生成策略.
increment(了解): 主键自增.由hibernate来维护.每次插入前会先查询表中id最大值.+1作为新主键值.(如果10个人同时并发,查询就会出现问题)
hilo(了解): 高低位算法.主键自增.由hibernate来维护.开发时不使用.
native:hilo+sequence+identity 自动三选一策略.
uuid: 产生随机字符串作为主键. 主键类型必须为string 类型.
自然主键:
assigned:自然主键生成策略. hibernate不会管理主键值.由开发人员自己录入.
二、hibernate中的对象状态
对象分为三种状态
- //测试对象的三种状态
- public class Demo {
- @Test
- //查看三种状态
- public void fun1(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- Customer c = new Customer(); // 没有id, 没有与session关联 => 瞬时状态
- c.setCust_name("联想"); // 瞬时状态
- session.save(c); // 持久化状态, 有id,有关联
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- @Test
- //三种状态特点
- //save方法: 其实不能理解成保存.理解成将瞬时状态转换成持久状态的方法
- //主键自增 : 执行save方法时,为了将对象转换为持久化状态.必须生成id值.所以需要执行insert语句生成.
- //increment: 执行save方法,为了生成id.会执行查询id最大值的sql语句.
- public void fun2(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- Customer c = new Customer(); // 没有id, 没有与session关联 => 瞬时状态
- c.setCust_name("联想"); // 瞬时状态
- session.save(c); // 持久化状态, 有id,有关联
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- @Test
- //三种状态特点
- // 持久化状态特点: 持久化状态对象的任何变化都会自动同步到数据库中.
- public void fun3(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- Customer c = session.get(Customer.class, 1l);//持久化状态对象
- c.setCust_name("微软公司");
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- }
三种状态的转换图
三、hibernate进阶-一级缓存
缓存:提高效率.hibernate中的一级缓存也是为了提高操作数据库的效率.
提高效率手段1:提高查询效率
提高效率手段2:减少不必要的修改语句发送
四、hibernate中的事务
知识点:如何在hibernate中指定数据库的隔离级别
- <!-- 指定hibernate操作数据库时的隔离级别
- #hibernate.connection.isolation 1|2|4|8
- 0001 1 读未提交
- 0010 2 读已提交
- 0100 4 可重复读
- 1000 8 串行化
- -->
- <property name="hibernate.connection.isolation">4</property>
知识点2:在项目中如何管理事务
业务开始之前打开事务,业务执行之后提交事务. 执行过程中出现异常.回滚事务.
在dao层操作数据库需要用到session对象.在service控制事务也是使用session对象完成. 我们要确保dao层和service层使用的使用同一个session对象
在hibernate中,确保使用同一个session的问题,hibernate已经帮我们解决了. 我们开发人员只需要调用sf.getCurrentSession()方法即可获得与当前线程绑定的session对象
注意1: 调用getCurrentSession方法必须配合主配置中的一段配置
- <!-- 指定session与当前线程绑定 -->
- <property name="hibernate.current_session_context_class">thread</property>
注意2:通过getCurrentSession方法获得的session对象.当事务提交时,session会自动关闭.不要手动调用close关闭.
crm项目中:
Service层
- public void save(Customer c) {
- Session session = HibernateUtils.getCurrentSession();
- //打开事务
- Transaction tx = session.beginTransaction();
- //调用Dao保存客户
- try {
- customerDao .save(c);
- } catch (Exception e) {
- e.printStackTrace();
- tx.rollback();
- }
- //关闭事务
- tx.commit();
- }
Dao层
- public void save(Customer c) {
- //1 获得session
- Session session = HibernateUtils.getCurrentSession();
- //3 执行保存
- session.save(c);
- }
五、hibernate中的批量查询(概述)
HQL查询-hibernate Query Language(多表查询,但不复杂时使用)
Hibernate独家查询语言,属于面向对象的查询语言
- //测试HQL语句
- public class Demo {
- @Test
- //基本查询
- public void fun1(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- //-------------------------------------------
- //1> 书写HQL语句
- // String hql = " from cn.itheima.domain.Customer ";
- String hql = " from Customer "; // 查询所有Customer对象
- //2> 根据HQL语句创建查询对象
- Query query = session.createQuery(hql);
- //3> 根据查询对象获得查询结果
- List<Customer> list = query.list(); // 返回list结果
- //query.uniqueResult();//接收唯一的查询结果
- System.out.println(list);
- //-------------------------------------------
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- @Test
- //条件查询
- //HQL语句中,不可能出现任何数据库相关的信息的
- public void fun2(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- //-------------------------------------------
- //1> 书写HQL语句
- String hql = " from Customer where cust_id = 1 "; // 查询所有Customer对象
- //2> 根据HQL语句创建查询对象
- Query query = session.createQuery(hql);
- //3> 根据查询对象获得查询结果
- Customer c = (Customer) query.uniqueResult();
- System.out.println(c);
- //-------------------------------------------
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- @Test
- //条件查询
- //问号占位符
- public void fun3(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- //-------------------------------------------
- //1> 书写HQL语句
- String hql = " from Customer where cust_id = ? "; // 查询所有Customer对象
- //2> 根据HQL语句创建查询对象
- Query query = session.createQuery(hql);
- //设置参数
- //query.setLong(0, 1l);
- query.setParameter(0, 1l);
- //3> 根据查询对象获得查询结果
- Customer c = (Customer) query.uniqueResult();
- System.out.println(c);
- //-------------------------------------------
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- @Test
- //条件查询
- //命名占位符
- public void fun4(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- //-------------------------------------------
- //1> 书写HQL语句
- String hql = " from Customer where cust_id = :cust_id "; // 查询所有Customer对象
- //2> 根据HQL语句创建查询对象
- Query query = session.createQuery(hql);
- //设置参数
- query.setParameter("cust_id", 1l);
- //3> 根据查询对象获得查询结果
- Customer c = (Customer) query.uniqueResult();
- System.out.println(c);
- //-------------------------------------------
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- @Test
- //分页查询
- public void fun5(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- //-------------------------------------------
- //1> 书写HQL语句
- String hql = " from Customer "; // 查询所有Customer对象
- //2> 根据HQL语句创建查询对象
- Query query = session.createQuery(hql);
- //设置分页信息 limit ?,?
- query.setFirstResult(1);
- query.setMaxResults(1);
- //3> 根据查询对象获得查询结果
- List<Customer> list = query.list();
- System.out.println(list);
- //-------------------------------------------
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- }
Criteria查询(单表条件查询)
Hibernate自创的无语句面向对象查询
- //测试Criteria查询
- public class Demo {
- @Test
- //基本查询
- public void fun1(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- //-------------------------------------------
- //查询所有的Customer对象
- Criteria criteria = session.createCriteria(Customer.class);
- List<Customer> list = criteria.list();
- System.out.println(list);
- // Customer c = (Customer) criteria.uniqueResult();
- //-------------------------------------------
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- @Test
- //条件查询
- //HQL语句中,不可能出现任何数据库相关的信息的
- // > 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 void fun2(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- //-------------------------------------------
- //创建criteria查询对象
- Criteria criteria = session.createCriteria(Customer.class);
- //添加查询参数 => 查询cust_id为1的Customer对象
- criteria.add(Restrictions.eq("cust_id", 1l));
- //执行查询获得结果
- Customer c = (Customer) criteria.uniqueResult();
- System.out.println(c);
- //-------------------------------------------
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- @Test
- //分页查询
- public void fun3(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- //-------------------------------------------
- //创建criteria查询对象
- Criteria criteria = session.createCriteria(Customer.class);
- //设置分页信息 limit ?,?
- criteria.setFirstResult(1);
- criteria.setMaxResults(2);
- //执行查询
- List<Customer> list = criteria.list();
- System.out.println(list);
- //-------------------------------------------
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- @Test
- //查询总记录数
- public void fun4(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- //-------------------------------------------
- //创建criteria查询对象
- Criteria criteria = session.createCriteria(Customer.class);
- //设置查询的聚合函数 => 总行数
- criteria.setProjection(Projections.rowCount());
- //执行查询
- Long count = (Long) criteria.uniqueResult();
- System.out.println(count);
- //-------------------------------------------
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- }
原生SQL查询(复杂的业务查询)
- //测试原生SQL查询
- public class Demo {
- @Test
- //基本查询
- public void fun1(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- //-------------------------------------------
- //1 书写sql语句
- String sql = "select * from cst_customer";
- //2 创建sql查询对象
- SQLQuery query = session.createSQLQuery(sql);
- //3 调用方法查询结果
- List<Object[]> list = query.list();
- //query.uniqueResult();
- for(Object[] objs : list){
- System.out.println(Arrays.toString(objs));
- }
- //-------------------------------------------
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- @Test
- //基本查询
- public void fun2(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- //-------------------------------------------
- //1 书写sql语句
- String sql = "select * from cst_customer";
- //2 创建sql查询对象
- SQLQuery query = session.createSQLQuery(sql);
- //指定将结果集封装到哪个对象中
- query.addEntity(Customer.class);
- //3 调用方法查询结果
- List<Customer> list = query.list();
- System.out.println(list);
- //-------------------------------------------
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- @Test
- //条件查询
- public void fun3(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- //-------------------------------------------
- //1 书写sql语句
- String sql = "select * from cst_customer where cust_id = ? ";
- //2 创建sql查询对象
- SQLQuery query = session.createSQLQuery(sql);
- query.setParameter(0, 1l);
- //指定将结果集封装到哪个对象中
- query.addEntity(Customer.class);
- //3 调用方法查询结果
- List<Customer> list = query.list();
- System.out.println(list);
- //-------------------------------------------
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- @Test
- //分页查询
- public void fun4(){
- //1 获得session
- Session session = HibernateUtils.openSession();
- //2 控制事务
- Transaction tx = session.beginTransaction();
- //3执行操作
- //-------------------------------------------
- //1 书写sql语句
- String sql = "select * from cst_customer limit ?,? ";
- //2 创建sql查询对象
- SQLQuery query = session.createSQLQuery(sql);
- query.setParameter(0, 0);
- query.setParameter(1, 1);
- //指定将结果集封装到哪个对象中
- query.addEntity(Customer.class);
- //3 调用方法查询结果
- List<Customer> list = query.list();
- System.out.println(list);
- //-------------------------------------------
- //4提交事务.关闭资源
- tx.commit();
- session.close();// 游离|托管 状态, 有id , 没有关联
- }
- }
五、练习:客户列表
案例比较简单,可以按照上面笔记的知识点完成
servlet:
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- //1 调用Service查询所有客户
- List<Customer> list = cs.getAll();
- //2 将客户列表放入request域
- request.setAttribute("list", list);
- //3 转发到list.jsp显示
- request.getRequestDispatcher("/jsp/customer/list.jsp").forward(request, response);
- }
service:
- public List<Customer> getAll() {
- Session session = HibernateUtils.getCurrentSession();
- //打开事务
- Transaction tx = session.beginTransaction();
- List<Customer> list = customerDao.getAll();
- //关闭事务
- tx.commit();
- return list;
- }
dao:
- public List<Customer> getAll() {
- //1 获得session
- Session session = HibernateUtils.getCurrentSession();
- //2 创建Criteria对象
- Criteria c = session.createCriteria(Customer.class);
- return c.list();
- }
JAVAEE学习——hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示的更多相关文章
- 【JAVAEE学习笔记】hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示
一.hibernate中的实体规则 实体类创建的注意事项 1.持久化类提供无参数构造 2.成员变量私有,提供共有get/set方法访问.需提供属性 3.持久化类中的属性,应尽量使用包装类型 4.持久化 ...
- Hibernate_day02--课程安排_主键生成策略_对实体类crud操作_实体类对象状态
Hibernate_day02 上节内容 今天内容 实体类编写规则 Hibernate主键生成策略 实体类操作 对实体类crud操作 添加操作 根据id查询 修改操作 删除操作 实体类对象状态(概念) ...
- Hibernate学习笔记(二)—— 实体规则&对象的状态&一级缓存
一.持久化类 1.1 什么是持久化类? Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓的持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么是持久化,什么又是持 ...
- Hibernate框架学习(三)——实体规则、对象状态、一级缓存
一.Hibernate中的实体规则 1.实体类创建的注意事项 1)持久化类提供无参数构造,因为在Hibernate的底层需要使用反射生成类的实例. 2)成员变量私有,提供公有的get和set方法,需提 ...
- hibernate学习(5)——对象状态与一级缓存
1.对象状态 1.1 状态介绍 hibernate 规定三种状态:瞬时态.持久态.脱管态 瞬时态:transient,session没有缓存对象,数据库也没有对应记录.没有与hibernate关联 ...
- Hibernate中的实体规则、对象状态和进阶-一级缓存
一.hibernate中的实体规则 1.实体类创建的注意事项 2.主键类型 3.主键生成策略 (1)代理主键 (2)自然主键 二.hibernate中的对象状态 1.对象分为三种状态 2.三种状态的转 ...
- Hibernate的实体规则、主键生成策略、对象状态
一. hibernate的实体类有一定的规则,类似于mybatis的逆向工程导出的实体类.具体的规则以及原因如下: 1.持久化类需要提供无参的构造方法. 因为hibernate底层采用反射机制创建对象 ...
- hibernate框架学习第三天:对象状态、一级缓存、快照等
对象的状态 瞬时状态: 瞬时对象(TO) 应用程序创建出来的对象,不受H3控制 注意:TO对象不具有OID,一旦为TO赋值OID,那么此时就不是TO 持久化状态:持久化对象(PO) 受H3控制的对象, ...
- Hibernate-实体-对象状态-一级缓存-事务-查询
一 hibernate中的实体规则 1.1 实体类创建的注意事项 持久化类提供无参数构造 --在调用instance()方法时默认调用空参构造 成员变量私有,提供共有get/set方法 ...
随机推荐
- fastjson的@JSONField注解的一点问题
@JSONField 看源码它可以作用于字段和方法上. 引用网上说的, 一.作用Field @JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称. 但是 ...
- JAVA Thread Dumps 三部曲
一.windows环境下方法 1:cmd下找到运行服务器容器的PID jps -v 例: C:\Users\Administrator>jps -v4856 Bootstrap -Djdk.tl ...
- poi对excel的操作(二)
二.进阶的对象 1.CellType 枚举类 单元格类型 CellType.STRING---文本型 等 如何是指单元格类型:cell.setCellType(CellType.STRING) 2.C ...
- [SDOI2005]区间
题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...
- 2015/11/2用Python写游戏,pygame入门(2):游戏中的事件和显示
pygame是一个比较大的库,以我这点弱小的实力是没办法详解的.所以我只讲我懂得那些部分,其他部分由大家慢慢查找了解. ------------------------------- 我用pygame ...
- Packet Tracer 5.0 构建CCNA实验(3)—— 路由器实现vlan间通信
--交换机配置 --交换机和路由器连接的接口 switchport mode trunk --路由器配置 enable conf t int fa0/0.1 --路由器接口的子接口 encapsula ...
- 【BZOJ】1251: 序列终结者
[题意]给定含有n个0的的数列. 1.区间加值 2.区间翻转 3.区间求最大值 [算法]平衡树(fhq-treap) 需要特别注意的是: 1.使0点对全局无影响并全程保持(例如求max,t[0].mx ...
- 2017ACM暑期多校联合训练 - Team 2 1009 HDU 60563 TrickGCD (容斥公式)
题目链接 Problem Description You are given an array A , and Zhu wants to know there are how many differe ...
- HDU 2050 折线分割平面 (数学)
题目链接 Problem Description我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可 ...
- script标签中type为<script type="text/x-template">是个啥
写过一点前端的都会碰到需要使用JS字符串拼接HTML元素然后append到页面DOM树上的情况,一般的写法都是使用+号以字符串的形式拼接,如果是短点的还好,如果很长很长的话就会拼接到令人崩溃了. 比如 ...