一、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中的对象状态

对象分为三种状态

  1. //测试对象的三种状态
  2. public class Demo {
  3.  
  4. @Test
  5. //查看三种状态
  6. public void fun1(){
  7. //1 获得session
  8. Session session = HibernateUtils.openSession();
  9. //2 控制事务
  10. Transaction tx = session.beginTransaction();
  11. //3执行操作
  12. Customer c = new Customer(); // 没有id, 没有与session关联 => 瞬时状态
  13.  
  14. c.setCust_name("联想"); // 瞬时状态
  15.  
  16. session.save(c); // 持久化状态, 有id,有关联
  17.  
  18. //4提交事务.关闭资源
  19. tx.commit();
  20. session.close();// 游离|托管 状态, 有id , 没有关联
  21.  
  22. }
  23.  
  24. @Test
  25. //三种状态特点
  26. //save方法: 其实不能理解成保存.理解成将瞬时状态转换成持久状态的方法
  27. //主键自增 : 执行save方法时,为了将对象转换为持久化状态.必须生成id值.所以需要执行insert语句生成.
  28. //increment: 执行save方法,为了生成id.会执行查询id最大值的sql语句.
  29. public void fun2(){
  30. //1 获得session
  31. Session session = HibernateUtils.openSession();
  32. //2 控制事务
  33. Transaction tx = session.beginTransaction();
  34. //3执行操作
  35. Customer c = new Customer(); // 没有id, 没有与session关联 => 瞬时状态
  36.  
  37. c.setCust_name("联想"); // 瞬时状态
  38.  
  39. session.save(c); // 持久化状态, 有id,有关联
  40.  
  41. //4提交事务.关闭资源
  42. tx.commit();
  43. session.close();// 游离|托管 状态, 有id , 没有关联
  44.  
  45. }
  46.  
  47. @Test
  48. //三种状态特点
  49. // 持久化状态特点: 持久化状态对象的任何变化都会自动同步到数据库中.
  50. public void fun3(){
  51. //1 获得session
  52. Session session = HibernateUtils.openSession();
  53. //2 控制事务
  54. Transaction tx = session.beginTransaction();
  55. //3执行操作
  56.  
  57. Customer c = session.get(Customer.class, 1l);//持久化状态对象
  58.  
  59. c.setCust_name("微软公司");
  60.  
  61. //4提交事务.关闭资源
  62. tx.commit();
  63. session.close();// 游离|托管 状态, 有id , 没有关联
  64.  
  65. }
  66. }

三种状态的转换图

三、hibernate进阶-一级缓存

缓存:提高效率.hibernate中的一级缓存也是为了提高操作数据库的效率.

 提高效率手段1:提高查询效率

提高效率手段2:减少不必要的修改语句发送

四、hibernate中的事务

 知识点:如何在hibernate中指定数据库的隔离级别

  1. <!-- 指定hibernate操作数据库时的隔离级别
  2. #hibernate.connection.isolation 1|2|4|8
  3. 0001 1 读未提交
  4. 0010 2 读已提交
  5. 0100 4 可重复读
  6. 1000 8 串行化
  7. -->
  8. <property name="hibernate.connection.isolation">4</property>

知识点2:在项目中如何管理事务

  业务开始之前打开事务,业务执行之后提交事务. 执行过程中出现异常.回滚事务.

  在dao层操作数据库需要用到session对象.在service控制事务也是使用session对象完成. 我们要确保dao层和service层使用的使用同一个session对象

  在hibernate中,确保使用同一个session的问题,hibernate已经帮我们解决了. 我们开发人员只需要调用sf.getCurrentSession()方法即可获得与当前线程绑定的session对象

  注意1: 调用getCurrentSession方法必须配合主配置中的一段配置

  1. <!-- 指定session与当前线程绑定 -->
  2. <property name="hibernate.current_session_context_class">thread</property>

  注意2:通过getCurrentSession方法获得的session对象.当事务提交时,session会自动关闭.不要手动调用close关闭.

crm项目中:

  Service层

  1. public void save(Customer c) {
  2. Session session = HibernateUtils.getCurrentSession();
  3. //打开事务
  4. Transaction tx = session.beginTransaction();
  5. //调用Dao保存客户
  6. try {
  7. customerDao .save(c);
  8. } catch (Exception e) {
  9. e.printStackTrace();
  10. tx.rollback();
  11. }
  12. //关闭事务
  13. tx.commit();
  14. }

  Dao层

  1. public void save(Customer c) {
  2. //1 获得session
  3. Session session = HibernateUtils.getCurrentSession();
  4. //3 执行保存
  5. session.save(c);
  6. }

五、hibernate中的批量查询(概述)

HQL查询-hibernate Query Language(多表查询,但不复杂时使用)

Hibernate独家查询语言,属于面向对象的查询语言

  1. //测试HQL语句
  2. public class Demo {
  3.  
  4. @Test
  5. //基本查询
  6. public void fun1(){
  7. //1 获得session
  8. Session session = HibernateUtils.openSession();
  9. //2 控制事务
  10. Transaction tx = session.beginTransaction();
  11. //3执行操作
  12. //-------------------------------------------
  13. //1> 书写HQL语句
  14. // String hql = " from cn.itheima.domain.Customer ";
  15. String hql = " from Customer "; // 查询所有Customer对象
  16. //2> 根据HQL语句创建查询对象
  17. Query query = session.createQuery(hql);
  18. //3> 根据查询对象获得查询结果
  19. List<Customer> list = query.list(); // 返回list结果
  20. //query.uniqueResult();//接收唯一的查询结果
  21.  
  22. System.out.println(list);
  23. //-------------------------------------------
  24. //4提交事务.关闭资源
  25. tx.commit();
  26. session.close();// 游离|托管 状态, 有id , 没有关联
  27.  
  28. }
  29.  
  30. @Test
  31. //条件查询
  32. //HQL语句中,不可能出现任何数据库相关的信息的
  33. public void fun2(){
  34. //1 获得session
  35. Session session = HibernateUtils.openSession();
  36. //2 控制事务
  37. Transaction tx = session.beginTransaction();
  38. //3执行操作
  39. //-------------------------------------------
  40. //1> 书写HQL语句
  41. String hql = " from Customer where cust_id = 1 "; // 查询所有Customer对象
  42. //2> 根据HQL语句创建查询对象
  43. Query query = session.createQuery(hql);
  44. //3> 根据查询对象获得查询结果
  45. Customer c = (Customer) query.uniqueResult();
  46.  
  47. System.out.println(c);
  48. //-------------------------------------------
  49. //4提交事务.关闭资源
  50. tx.commit();
  51. session.close();// 游离|托管 状态, 有id , 没有关联
  52.  
  53. }
  54.  
  55. @Test
  56. //条件查询
  57. //问号占位符
  58. public void fun3(){
  59. //1 获得session
  60. Session session = HibernateUtils.openSession();
  61. //2 控制事务
  62. Transaction tx = session.beginTransaction();
  63. //3执行操作
  64. //-------------------------------------------
  65. //1> 书写HQL语句
  66. String hql = " from Customer where cust_id = ? "; // 查询所有Customer对象
  67. //2> 根据HQL语句创建查询对象
  68. Query query = session.createQuery(hql);
  69. //设置参数
  70. //query.setLong(0, 1l);
  71. query.setParameter(0, 1l);
  72. //3> 根据查询对象获得查询结果
  73. Customer c = (Customer) query.uniqueResult();
  74.  
  75. System.out.println(c);
  76. //-------------------------------------------
  77. //4提交事务.关闭资源
  78. tx.commit();
  79. session.close();// 游离|托管 状态, 有id , 没有关联
  80.  
  81. }
  82.  
  83. @Test
  84. //条件查询
  85. //命名占位符
  86. public void fun4(){
  87. //1 获得session
  88. Session session = HibernateUtils.openSession();
  89. //2 控制事务
  90. Transaction tx = session.beginTransaction();
  91. //3执行操作
  92. //-------------------------------------------
  93. //1> 书写HQL语句
  94. String hql = " from Customer where cust_id = :cust_id "; // 查询所有Customer对象
  95. //2> 根据HQL语句创建查询对象
  96. Query query = session.createQuery(hql);
  97. //设置参数
  98. query.setParameter("cust_id", 1l);
  99. //3> 根据查询对象获得查询结果
  100. Customer c = (Customer) query.uniqueResult();
  101.  
  102. System.out.println(c);
  103. //-------------------------------------------
  104. //4提交事务.关闭资源
  105. tx.commit();
  106. session.close();// 游离|托管 状态, 有id , 没有关联
  107.  
  108. }
  109.  
  110. @Test
  111. //分页查询
  112. public void fun5(){
  113. //1 获得session
  114. Session session = HibernateUtils.openSession();
  115. //2 控制事务
  116. Transaction tx = session.beginTransaction();
  117. //3执行操作
  118. //-------------------------------------------
  119. //1> 书写HQL语句
  120. String hql = " from Customer "; // 查询所有Customer对象
  121. //2> 根据HQL语句创建查询对象
  122. Query query = session.createQuery(hql);
  123. //设置分页信息 limit ?,?
  124. query.setFirstResult(1);
  125. query.setMaxResults(1);
  126. //3> 根据查询对象获得查询结果
  127. List<Customer> list = query.list();
  128.  
  129. System.out.println(list);
  130. //-------------------------------------------
  131. //4提交事务.关闭资源
  132. tx.commit();
  133. session.close();// 游离|托管 状态, 有id , 没有关联
  134. }
  135. }

Criteria查询(单表条件查询)

Hibernate自创的无语句面向对象查询

  1. //测试Criteria查询
  2. public class Demo {
  3.  
  4. @Test
  5. //基本查询
  6. public void fun1(){
  7. //1 获得session
  8. Session session = HibernateUtils.openSession();
  9. //2 控制事务
  10. Transaction tx = session.beginTransaction();
  11. //3执行操作
  12. //-------------------------------------------
  13.  
  14. //查询所有的Customer对象
  15. Criteria criteria = session.createCriteria(Customer.class);
  16.  
  17. List<Customer> list = criteria.list();
  18.  
  19. System.out.println(list);
  20.  
  21. // Customer c = (Customer) criteria.uniqueResult();
  22.  
  23. //-------------------------------------------
  24. //4提交事务.关闭资源
  25. tx.commit();
  26. session.close();// 游离|托管 状态, 有id , 没有关联
  27.  
  28. }
  29.  
  30. @Test
  31. //条件查询
  32. //HQL语句中,不可能出现任何数据库相关的信息的
  33. // > gt
  34. // >= ge
  35. // < lt
  36. // <= le
  37. // == eq
  38. // != ne
  39. // in in
  40. // between and between
  41. // like like
  42. // is not null isNotNull
  43. // is null isNull
  44. // or or
  45. // and and
  46. public void fun2(){
  47. //1 获得session
  48. Session session = HibernateUtils.openSession();
  49. //2 控制事务
  50. Transaction tx = session.beginTransaction();
  51. //3执行操作
  52. //-------------------------------------------
  53. //创建criteria查询对象
  54. Criteria criteria = session.createCriteria(Customer.class);
  55. //添加查询参数 => 查询cust_id为1的Customer对象
  56. criteria.add(Restrictions.eq("cust_id", 1l));
  57. //执行查询获得结果
  58. Customer c = (Customer) criteria.uniqueResult();
  59. System.out.println(c);
  60. //-------------------------------------------
  61. //4提交事务.关闭资源
  62. tx.commit();
  63. session.close();// 游离|托管 状态, 有id , 没有关联
  64.  
  65. }
  66.  
  67. @Test
  68. //分页查询
  69. public void fun3(){
  70. //1 获得session
  71. Session session = HibernateUtils.openSession();
  72. //2 控制事务
  73. Transaction tx = session.beginTransaction();
  74. //3执行操作
  75. //-------------------------------------------
  76. //创建criteria查询对象
  77. Criteria criteria = session.createCriteria(Customer.class);
  78. //设置分页信息 limit ?,?
  79. criteria.setFirstResult(1);
  80. criteria.setMaxResults(2);
  81. //执行查询
  82. List<Customer> list = criteria.list();
  83.  
  84. System.out.println(list);
  85. //-------------------------------------------
  86. //4提交事务.关闭资源
  87. tx.commit();
  88. session.close();// 游离|托管 状态, 有id , 没有关联
  89.  
  90. }
  91.  
  92. @Test
  93. //查询总记录数
  94. public void fun4(){
  95. //1 获得session
  96. Session session = HibernateUtils.openSession();
  97. //2 控制事务
  98. Transaction tx = session.beginTransaction();
  99. //3执行操作
  100. //-------------------------------------------
  101. //创建criteria查询对象
  102. Criteria criteria = session.createCriteria(Customer.class);
  103. //设置查询的聚合函数 => 总行数
  104. criteria.setProjection(Projections.rowCount());
  105. //执行查询
  106. Long count = (Long) criteria.uniqueResult();
  107.  
  108. System.out.println(count);
  109. //-------------------------------------------
  110. //4提交事务.关闭资源
  111. tx.commit();
  112. session.close();// 游离|托管 状态, 有id , 没有关联
  113.  
  114. }
  115. }

原生SQL查询(复杂的业务查询)

  1. //测试原生SQL查询
  2. public class Demo {
  3.  
  4. @Test
  5. //基本查询
  6. public void fun1(){
  7. //1 获得session
  8. Session session = HibernateUtils.openSession();
  9. //2 控制事务
  10. Transaction tx = session.beginTransaction();
  11. //3执行操作
  12. //-------------------------------------------
  13. //1 书写sql语句
  14. String sql = "select * from cst_customer";
  15.  
  16. //2 创建sql查询对象
  17. SQLQuery query = session.createSQLQuery(sql);
  18.  
  19. //3 调用方法查询结果
  20. List<Object[]> list = query.list();
  21. //query.uniqueResult();
  22.  
  23. for(Object[] objs : list){
  24. System.out.println(Arrays.toString(objs));
  25. }
  26.  
  27. //-------------------------------------------
  28. //4提交事务.关闭资源
  29. tx.commit();
  30. session.close();// 游离|托管 状态, 有id , 没有关联
  31.  
  32. }
  33.  
  34. @Test
  35. //基本查询
  36. public void fun2(){
  37. //1 获得session
  38. Session session = HibernateUtils.openSession();
  39. //2 控制事务
  40. Transaction tx = session.beginTransaction();
  41. //3执行操作
  42. //-------------------------------------------
  43. //1 书写sql语句
  44. String sql = "select * from cst_customer";
  45.  
  46. //2 创建sql查询对象
  47. SQLQuery query = session.createSQLQuery(sql);
  48. //指定将结果集封装到哪个对象中
  49. query.addEntity(Customer.class);
  50.  
  51. //3 调用方法查询结果
  52. List<Customer> list = query.list();
  53.  
  54. System.out.println(list);
  55. //-------------------------------------------
  56. //4提交事务.关闭资源
  57. tx.commit();
  58. session.close();// 游离|托管 状态, 有id , 没有关联
  59.  
  60. }
  61.  
  62. @Test
  63. //条件查询
  64. public void fun3(){
  65. //1 获得session
  66. Session session = HibernateUtils.openSession();
  67. //2 控制事务
  68. Transaction tx = session.beginTransaction();
  69. //3执行操作
  70. //-------------------------------------------
  71. //1 书写sql语句
  72. String sql = "select * from cst_customer where cust_id = ? ";
  73.  
  74. //2 创建sql查询对象
  75. SQLQuery query = session.createSQLQuery(sql);
  76.  
  77. query.setParameter(0, 1l);
  78. //指定将结果集封装到哪个对象中
  79. query.addEntity(Customer.class);
  80.  
  81. //3 调用方法查询结果
  82. List<Customer> list = query.list();
  83.  
  84. System.out.println(list);
  85. //-------------------------------------------
  86. //4提交事务.关闭资源
  87. tx.commit();
  88. session.close();// 游离|托管 状态, 有id , 没有关联
  89.  
  90. }
  91.  
  92. @Test
  93. //分页查询
  94. public void fun4(){
  95. //1 获得session
  96. Session session = HibernateUtils.openSession();
  97. //2 控制事务
  98. Transaction tx = session.beginTransaction();
  99. //3执行操作
  100. //-------------------------------------------
  101. //1 书写sql语句
  102. String sql = "select * from cst_customer limit ?,? ";
  103.  
  104. //2 创建sql查询对象
  105. SQLQuery query = session.createSQLQuery(sql);
  106.  
  107. query.setParameter(0, 0);
  108. query.setParameter(1, 1);
  109. //指定将结果集封装到哪个对象中
  110. query.addEntity(Customer.class);
  111.  
  112. //3 调用方法查询结果
  113. List<Customer> list = query.list();
  114.  
  115. System.out.println(list);
  116. //-------------------------------------------
  117. //4提交事务.关闭资源
  118. tx.commit();
  119. session.close();// 游离|托管 状态, 有id , 没有关联
  120.  
  121. }
  122. }

五、练习:客户列表

案例比较简单,可以按照上面笔记的知识点完成

servlet:

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. //1 调用Service查询所有客户
  3. List<Customer> list = cs.getAll();
  4. //2 将客户列表放入request域
  5. request.setAttribute("list", list);
  6. //3 转发到list.jsp显示
  7. request.getRequestDispatcher("/jsp/customer/list.jsp").forward(request, response);
  8.  
  9. }

service:

  1. public List<Customer> getAll() {
  2. Session session = HibernateUtils.getCurrentSession();
  3. //打开事务
  4. Transaction tx = session.beginTransaction();
  5.  
  6. List<Customer> list = customerDao.getAll();
  7.  
  8. //关闭事务
  9. tx.commit();
  10. return list;
  11. }

dao:

  1. public List<Customer> getAll() {
  2. //1 获得session
  3. Session session = HibernateUtils.getCurrentSession();
  4. //2 创建Criteria对象
  5. Criteria c = session.createCriteria(Customer.class);
  6. return c.list();
  7. }

JAVAEE学习——hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示的更多相关文章

  1. 【JAVAEE学习笔记】hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示

    一.hibernate中的实体规则 实体类创建的注意事项 1.持久化类提供无参数构造 2.成员变量私有,提供共有get/set方法访问.需提供属性 3.持久化类中的属性,应尽量使用包装类型 4.持久化 ...

  2. Hibernate_day02--课程安排_主键生成策略_对实体类crud操作_实体类对象状态

    Hibernate_day02 上节内容 今天内容 实体类编写规则 Hibernate主键生成策略 实体类操作 对实体类crud操作 添加操作 根据id查询 修改操作 删除操作 实体类对象状态(概念) ...

  3. Hibernate学习笔记(二)—— 实体规则&对象的状态&一级缓存

    一.持久化类 1.1 什么是持久化类? Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓的持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么是持久化,什么又是持 ...

  4. Hibernate框架学习(三)——实体规则、对象状态、一级缓存

    一.Hibernate中的实体规则 1.实体类创建的注意事项 1)持久化类提供无参数构造,因为在Hibernate的底层需要使用反射生成类的实例. 2)成员变量私有,提供公有的get和set方法,需提 ...

  5. hibernate学习(5)——对象状态与一级缓存

    1.对象状态 1.1   状态介绍 hibernate 规定三种状态:瞬时态.持久态.脱管态 瞬时态:transient,session没有缓存对象,数据库也没有对应记录.没有与hibernate关联 ...

  6. Hibernate中的实体规则、对象状态和进阶-一级缓存

    一.hibernate中的实体规则 1.实体类创建的注意事项 2.主键类型 3.主键生成策略 (1)代理主键 (2)自然主键 二.hibernate中的对象状态 1.对象分为三种状态 2.三种状态的转 ...

  7. Hibernate的实体规则、主键生成策略、对象状态

    一. hibernate的实体类有一定的规则,类似于mybatis的逆向工程导出的实体类.具体的规则以及原因如下: 1.持久化类需要提供无参的构造方法. 因为hibernate底层采用反射机制创建对象 ...

  8. hibernate框架学习第三天:对象状态、一级缓存、快照等

    对象的状态 瞬时状态: 瞬时对象(TO) 应用程序创建出来的对象,不受H3控制 注意:TO对象不具有OID,一旦为TO赋值OID,那么此时就不是TO 持久化状态:持久化对象(PO) 受H3控制的对象, ...

  9. Hibernate-实体-对象状态-一级缓存-事务-查询

    一 hibernate中的实体规则 1.1 实体类创建的注意事项 持久化类提供无参数构造         --在调用instance()方法时默认调用空参构造 成员变量私有,提供共有get/set方法 ...

随机推荐

  1. fastjson的@JSONField注解的一点问题

    @JSONField 看源码它可以作用于字段和方法上. 引用网上说的, 一.作用Field @JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称. 但是 ...

  2. JAVA Thread Dumps 三部曲

    一.windows环境下方法 1:cmd下找到运行服务器容器的PID jps -v 例: C:\Users\Administrator>jps -v4856 Bootstrap -Djdk.tl ...

  3. poi对excel的操作(二)

    二.进阶的对象 1.CellType 枚举类 单元格类型 CellType.STRING---文本型 等 如何是指单元格类型:cell.setCellType(CellType.STRING) 2.C ...

  4. [SDOI2005]区间

    题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...

  5. 2015/11/2用Python写游戏,pygame入门(2):游戏中的事件和显示

    pygame是一个比较大的库,以我这点弱小的实力是没办法详解的.所以我只讲我懂得那些部分,其他部分由大家慢慢查找了解. ------------------------------- 我用pygame ...

  6. Packet Tracer 5.0 构建CCNA实验(3)—— 路由器实现vlan间通信

    --交换机配置 --交换机和路由器连接的接口 switchport mode trunk --路由器配置 enable conf t int fa0/0.1 --路由器接口的子接口 encapsula ...

  7. 【BZOJ】1251: 序列终结者

    [题意]给定含有n个0的的数列. 1.区间加值 2.区间翻转 3.区间求最大值 [算法]平衡树(fhq-treap) 需要特别注意的是: 1.使0点对全局无影响并全程保持(例如求max,t[0].mx ...

  8. 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 ...

  9. HDU 2050 折线分割平面 (数学)

    题目链接 Problem Description我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可 ...

  10. script标签中type为<script type="text/x-template">是个啥

    写过一点前端的都会碰到需要使用JS字符串拼接HTML元素然后append到页面DOM树上的情况,一般的写法都是使用+号以字符串的形式拼接,如果是短点的还好,如果很长很长的话就会拼接到令人崩溃了. 比如 ...