Hibernate学习笔记(二)

Hibernate学习笔记

    hibernate实体类编写规则

    1. 实体类里面的属性是私有的
    2. 私有属性使用公开的set和get方法
    3. 要求实体类有属性作为唯一值
    4. 实体类属性建议不使用基本数据类型,建议使用包装类。具体应该考虑null值是否有意义,比如一个学生的分数为0,和他没有参加考试,没有参加考试可将值赋值为null,而分数为0,就是属性值,因此只有int的包装类Integer才能表示null值

    hibernate主键生成策略

    1. hibernate要求实体类有一个唯一属性对应表的主键,主键的自动生成有不同策略

      <generator class="native"></generator>

    2. class属性中有多个值
      (1) native:表示根据本地的数据库来选择主键的自动生长策略
      (2) uuid:hibernate会自动生成一个uuid作为主键,此时表里面的id类型应为String
     常用的就是以上两类

    hibernate中实体类的三种状态

    1. 瞬时态:对象里面没有id值,对象与session没有关联。也叫自由态,只存在于内存中,而在数据库中没有相应数据。用new创建的对象,它没有持久化,没有处于Session中。
    2. 持久态:对象里面有id值,对象与session有关联。与session关联并且在数据库中有相应数据。已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象。
    3. 托管态:对象有id值,对象与session没有关系。持久化对象脱离了Session的对象。如Session缓存被清空的对象。特点:已经持久化,但不在Session缓存中。

    Hibernate的缓存

    1. Hibernate一级缓存
      (1) Hibernate的一级缓存默认打开
      (2) Hibernate的使用范围是session范围,从session创建到关闭
      (3) Hibernate的一级缓存中,存储数据必须持久态数据
    2. Hibernate二级缓存
      (1) 目前使用redis去替代
      (2) 默认不打开,需要配置
      (3) 二级缓存的范围是sessionFactory的范围
    3. Hibernate一级缓存的执行过程

    hibernate一级缓存特性

    1. 持久态自动更新数据库
    2. 原理图

     当对象为持久态时,其实会存储到一级缓存和一个快照区,当修改后,会与修改之前的数据进行比较,只有修改的值与未修改前的值不同时才会进行数据库的修改,极大的提高了数据库操作的效率

    hibernate绑定session

    1. session类似于jdbc的connection,通过ThreadLocal可以进行绑定
    2. Hibernate会实现session与本地线程进行绑定
    3. 获取与本地线程session
      (1) 在Hibernate的核心配置文件中配置

<property name="hibernate.current_session_context_class">thread</property>

      (2) 对用sessionFactory的getCurrentSession()方法
    4. 与本地线程绑定的session,关闭session资源会报错,那是因为它与线程绑定了,线程结束,那么session结束

Hibernate的查询对象的简单使用

    Query对象

    1. 使用query对象不需要写sql语句,但是要写hql语句
      (1) sql语句是操作表和表字段,hql语句是操作实体类和属性
    2. 查询所有的hql语句 ‘from 实体类名称’

    Query query = session.createQuery("from User");
    List<User> list = query.list();
    for (User user : list) {
        System.out.println(user);
    }

    Criteria对象

    1. 使用这个对象进行查询操作,不需要写语句,直接调用里面的API

    Criteria criteria = session.createCriteria(User.class);
    List<User> list = criteria.list();
    for (User user : list) {
        System.out.println(user);
    }

    SQLQuery

    1. 普通的sql语句查询
    2. 应该注意这个时候默认返回的Lsit集合中,每一部分是数组

    SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
    List<Object []> list = sqlQuery.list();
    for (Object[] objects : list) {
        System.out.println(Arrays.toString(objects));
    }

    3. 设置返回list对象每一部分的类型

   SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
   //设置数据返回时封装到那一个实体类
   sqlQuery.addEntity(User.class);
   List<Object []> list = sqlQuery.list();
   for (Object[] objects : list) {
     System.out.println(Arrays.toString(objects));
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值