zoukankan      html  css  js  c++  java
  • Hibernate中的常用API

    1.Configuration

      1.1 加载核心配置文件,

      加载hibernate.properties时:Configuration configuration = new Configuration();

      加载hibernate.cfg.xml时:Configuration configuration = new Configuration().configure();

      1.2  加载映射文件(不过,一般映射文件都配置在核心配置文件中,该方法用少)

      configuration.addResource("com/itheima/hibernate/domain/Customer.hbm.xml");

      configuration.addClass(Customer.class);//实体类必须和映射文件在同一个包中才行

    2.SessionFactory

      SessionFactory负责管理Session,管理连接池,管理Hibernate二级缓存。是一个重量级的, 线程安全的对象.

    3.session

      Session是Hibernate程序与数据库之间的桥梁。完成CRUD的操作。Session是一个单线程的对象,内部维护了Hibernate的一级缓存。

    hibernate的一级缓存--->session级别的缓存

      一级缓存是session级别的缓存, 同session的声明周期一直. 一级缓存实际上是由session中的一组集合构成的.

      一级缓存的主要作用: 减少对数据库的访问次数

      执行原理: 在session中执行查询操作时,首先会从缓存中获取结果, 如果缓存中没有, 则去数据库中查询, 并将查询结果往缓存中存放一份; 如果缓存中有, 则直接从缓存中获取.

      一级缓存快照区: 在存放在缓存中的数据会在session一级缓存的快照区存放一份, 当数据发生变更时, 缓存中的数据会被修改, 而快照区的数据还是原来的数据, 在事务提交时, 会对比一级缓存和快照区, 如果数据不一致, 则会发送sql语句更改数据库中数据; 如果数据一致,  则不对数据库进行更新操作. 因此, 对于持久态的对象,  即使没有显示的添加update语句, 如果数据发生变化, 在提交事务时, 会自动更新数据库.

      session保存一个对象: session.save(entity);

      session修改对象:session.update(entity);

      session删除对象session.delete(entity);

      session查询对象:session.get()和session.load();

    get()方法和load()方法的区别

      1.   加载机制不同. get方法采用的是立即加载,执行到代码的时候,立即发送SQL语句进行查询;  而load方法采用的延迟加载(Lazy)机制, 执行该代码的  时候不会马上发送SQL语句,只有真正使用该对象的时候才会发送SQL语句查询.

      2.    查询结果不同. get方法查询得到的是对象本生,  而load方法查询返回的一个代理对象;

      3.      查询没有找到时的处理应答不同, get方法返回的是null;  而load方法则会抛出异常ObjectNotFoundException;

    4. Query:支持HQL查询

    获得Query接口可以通过session.createQuery(String hql);获得。

    HQL:Hibernate Query Language。Hibernate查询语言。语法与SQL是类似的。HQL中查询的是对象。

    public void demo2(){

      //HibernateUtils为编写的获取创建sessionFactory和获取session的工具类

            Session session = HibernateUtils.getCurrentSession();

            Transaction tx = session.beginTransaction();

            // HQL的基本查询

            Query query = session.createQuery("from Customer");

            List<Customer> list = query.list();

           

            for (Customer customer : list) {

               System.out.println(customer);

            }

           

            tx.commit();

        }

    5.Criteria:支持QBC查询

    获得Criteria接口可以通过session.createCriteria();获得。

    QBC:Query By Criteria。条件查询。一种更加面向对象的方式.

      统计查询

          Criteria criteria = session.createCriteria(Customer.class);

          criteria.setProjection(Projections.rowCount());

                     Long count = (Long) criteria.uniqueResult();

    5.1 离线条件查询 DetachedCriteria.

       DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);

            detachedCriteria.add(Restrictions.like("cust_name", "%强%"));

           

            Session session = HibernateUtils.getCurrentSession();

            Transaction tx = session.beginTransaction();

           

            Criteria criteria = detachedCriteria.getExecutableCriteria(session);

            List<Customer> list = criteria.list();

            for (Customer customer : list) {

               System.out.println(customer);

            }

            tx.commit();

        }

    6.SQLQuery:支持SQL查询

    获得SQLQuery接口可以通过session.createSQLQuery();获得。

    SQLQuery:通过SQL语句进行查询。

  • 相关阅读:
    程序员创业第二步:五个角度打造企业世界级竞争力
    开源题材征集 + MVC&EF Core 完整教程小结
    MVC+EF Core 完整教程20--tag helper详解
    MVC5+EF6 入门完整教程13 -- 动态生成多级菜单
    加载驱动三种的方法
    Caused by: javax.el.PropertyNotFoundException: Property [userName] not found on type [java.lang.String]
    Eclipse 中的 insert spaces for tabs 设置方法
    Windows中mysql的配置文件,解决字符集编码问题,统一使用utf8字符集
    ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated ......问题报错解决办法!
    Java中的类三种类加载器+双气委派模型
  • 原文地址:https://www.cnblogs.com/rodge-run/p/6415594.html
Copyright © 2011-2022 走看看