• Hibernate API、对象状态、HQL、Criteria


    一、Hibernate中对象状态

    学习Hibernate API之前要知道Hibernate中对象的几种状态,这样对API的学习会更加深入。

    对象状态:

    瞬时(transient):刚new出的对象,没有跟Session关联。数据库中没有此条记录。

    持久(persistent):此对象跟Session有关联,Session没有关闭,事务没有提交。数据库中已有此数据。

                                对象发生变化 时Hibernate还会检测到。

    脱管(detached):跟Session已经没有关联,数据库中有此数据。对象发生变化时Hibernate不会检测到。也叫游离。

    二、介绍一下Hibernate中主要的API:

    1、org.hibernate.cfg.Configuration类

    作用:配置并启动Hibernate。读取配置文件、读取映射文件。创建单实例的SessionFactory。

    configure():读取"/hibernate.cfg.xml"配置文件。

    buildSessionFactory():创建SessionFactory

    setProperty(String key,Object value):通过代码给Hibernate设置属性值

    2、org.hibernate.SessionFactory接口

    作用:初始化Hibernate,负责创建Session。使用了工厂模式。

    SessionFactory是线程安全的,一个数据库对应一个SessionFactory,生命周期长,一般在整个生命周期中有效;SessionFactory保存着和数据库连接的相关信息(url,user,password)和映射信息,以及Hibernate运行时要用到的一些信息。

    openSession():创建数据库连接,并且返回一个Session。

    getCurrentSession():获得当前线程的Session。在使用此方法时需要在配置文件中配置:current_session_context_class,其值为thread或jta。

    3、org.hibernate.Session接口

    作用:执行对持久化对象的CRUD操作。包含了很多常见的SQL语句。

    Session是非线程安全的,生命周期短,代表一个和数据库的连接,在B/S系统中一般不会超过一个请求;内部维护一级缓存和数据库连接,如果session长时间打开,会长时间占用内存和数据库连接。

    (1)、beginTransaction():开始一个事务,并且返回一个事务的实例。

    (2)、save(Object):创建一条记录。

    (3)、persist(Object) :同save(Object)方法类似。

    (4)、saveOrUpdate(Object):创建或更新一条记录。

    (5)、merge(Object):

    (6)、get(Class, Serializable):根据id查询。

    (7)、load(Object, Serializable):根据id查询 。查询返回的是代理对象,不会立刻访问数据库,是懒加载的。当真正去使用对象的时候才会访问数据库。

    用load的时候会发现不会打印出查询语句,而使用get的时候会打印出查询语句。

    使用load时如果在session关闭之后在查询此对象,会报异常:could not initialize proxy - no Session。处理办法:在session关闭之前初始化一下查询出来的对象:Hibernate.initialize(user);

    使用load可以提高效率,因为刚开始的时候并没有查询数据库。但很少使用。

    (8)、delete(Object) :删除一条记录

    (9)、flush():把一级缓存和数据库同步一次。

    (10)、clear():清空一级缓存

    (11)、createSQLQuery("select * from user"):执行纯sql语句的查询。Hibernate中不建议使用sql查询。

    (12)、getNamedQuery(""):命名查询,查询语句配置在.hbm.xml配置文件中。

    4、org.hibernate.Transaction接口

    作用:负责事务的操作。

    commit():事务提交

    rollback():事务回滚

    5、org.hibernate.Query接口

    hibernate除了提供标准查询API之外,还提供了非常强大的查询功能,那就是HQL。全程为“Hibernate Query language”,即hibernate查询语言。HQL在语法上和SQL非常类似,但是HQL是面向对象的,所操作的是持久化对象,而不是数据库表。

    作用:Query可以使用HQL语言来查询数据库。

    list():返回查询结果集。返回结果是List。

    uniqueResult() :查询唯一的结果。返回结果是Object。

    setXXX():给参数设置值

    executeUpdate():批量更新

    分页:

    setFirstResult(int):设置分页时开始的位置。不论哪个数据库都通用

    setMaxResult(int):设置分页时返回的结果数。不论哪个数据库都通用

    6、org.hibernate.Criteria接口

    作用:条件查询,比Query更加面向对象。

    /*
     * 思考为甚要引用标准查询API?
     * 使用Session接口的load方法或者个get方法来装载持久化对象,在查询的时候
     * 需要知道对象的持久化标识,否则就无法进行查询。然而hibernate提供了强大的
     * 查询,包括标准查询API,和HQL。
     * 1.要使用标准查询API完成查询操作,需要使用org.hibernate.Criteria接口。
     * 2.通过session的方法createCriteria创建一个 Criteria实例对象
     * 3.Criteria中有一个list方法可以返回查询到的所有记录
     * 4.标准查询API提供了两种方式来完成模糊查询:一种是使用通配符,一种是使用使用MatchMode。

     * 5.在标准的API中可以使用org.hibernate.Criterion.Order类对查询结果进行排序。Order类中包含两个静态方法,分别为asc,desc

    *  通配符:l使用ike方法和ilike方法 crit.add(Restrictions.like("name", "%i%"));//表示名称包含“i”字的所有记录

      * MatchMode完成模糊查询: crit.add(Restrictions.like("name", "i",MatchMode.END));//表示查询以“i”结尾的所有记录   

        *   MatchMode类中有四个静态常量分别指定四个不同的匹配策略:

      * MatchMode.ANYWHERE:相当于“%查询关键字%”

      * MatchMode.END:相当于“关键字%”

      *  MatchMode.EXACT:精确匹配,相当于“查询关键字”
     */

      对结果进行排序:  crit.addOrder(Order.desc("id"));//按id进行降序排序

      add(Criterion):添加约束条件

     

    7、org.hibernate.criterion.Restrictions类

    作用:

    8、org.hibernate.StatelessSession接口

    作用:无状态Session,不和一级缓存、二级缓存打交道。通过使用该接口会把数据立刻写入到数据库。

    StatelessSession s = sessionFactory.openStatelessSession();

    三、HQL语言(Hibernate Query Language)

    HQL是面向对象的查询语言。HQL查询的是对象而不是表。

    HQL主要通过org.hibernate.Query来操作。Query的创建方式:

    Query q = session.createQuery(hql);

    String hql = "from User as user where user.name=?"; 

    q.setString(0,"zhangsan");

    List<User> list = q.list();

    Object o = q.uniqueResult();

    命名参数方式:

    String hql = "from User as user where user.name=:n"; //冒号加上变量的名字

    q.setString("u","zhangsan");

    四、Criteria查询方式(条件查询)

    Criteria是一种比HQL更加面向对象的查询方式。

    Criteria c = session.createCriteria(User.class);  //参数是要查询的类

    c.add(Restrictions.eq("name",n));  //添加约束条件。第一个参数是类的字段名,第二个参数是匹配的值

    List<User> list = q.list();

    Object o = q.uniqueResult();

    Face your past without regret. Handle your present with confidence.Prepare for future without fear. keep the faith and drop the fear. 面对过去无怨无悔,把握现在充满信心,备战未来无所畏惧。保持信念,克服恐惧!一点一滴的积累,一点一滴的沉淀,学技术需要不断的积淀!
  • 相关阅读:
    【洛谷P6178】【模板】Matrix-Tree 定理
    【洛谷P4336】黑暗前的幻想乡
    【洛谷P3332】K大数查询
    分布式存储系统大数据同步方面的两个问题
    Vector和ArrayList的比较
    HDU 3172 Virtual Friends (并查集)
    uva 12260
    uva-1427 Parade (单调队列优化dp)
    英语学习20130816 -> 这些很重要的英语句子
    新浪微博SDK授权后无法返回应用解决方案
  • 原文地址:https://www.cnblogs.com/200911/p/2615222.html
Copyright © 2020-2023  润新知