zoukankan      html  css  js  c++  java
  • hibernate框架学习之核心API

    Configuration
    SessionFactory
    Session
    Transaction
    Query
    Criteria

    Configuration

    Configuration对象用于封装Hibernate的配置信息,在Hibernate框架启动后,需要装载对应的配置文件。Hibernate的配置文件有两种格式
    hibernate.properties文件(早期格式)
    hibernate.cfg.xml文件(常用格式)

    使用hibernate.properties加载配置
      Configuration conf = new Configuration ();//此方式无法配置资源文件,必须手动添加
    资源文件添加方式
      添加配置文件(非主流)
        conf. addResource(“cn/itcast/h3/user/vo/UserModel.hbm.xml”);
      添加持久化类(非主流)
        conf.addClass(UserModel.class);
        此方式Hibernate会自动读取当前类所在目录下同名的配置文件,UserModel.hbm.xml,所以在进行配置文件的命名时尽量保持两个文件名相同,不推荐使用不同名称的文件

    使用hibernate.cfg.xml加载配置
    Configuration conf = new Configuration.configure();
    此方式可以将资源文件通过XML配置的方式加入配置文件
    资源文件配置方式
    添加配置文件(主流)
      <mapping resource="cn/itcast/h3/user/vo/UserModel2.hbm.xml"/>
    添加持久化类(非主流)
      <mapping class="cn.itcast.h3.user.vo.UserModel"/>

    SessionFactory

    SessionFactory对象根据Configuration对象加载的配置信息创建得到,其中封装了配置信息中有关数据库的信息、所有的映射关系及预定义SQL语句
    SessionFactory对象是线程安全的
    SessionFactory对象可以通过Configuration对象获得
    Configuration conf = new Configuration().configure();
    SessionFactory sf = conf.buildSessionFactory();
    由于SessionFactory对象的创建需要基于所有的配置信息,因此创建此对象需要消耗大量的资源,通常一个应用程序中只初始化一个SessionFactory对象

    Session

    Session对象是Hibernate与应用程序APP进行交互的桥梁,应用程序与Hibernate之间通过Session进行数据交互,其功能相当于JDBC中的Connection
    Session对象描述的是一次Hibernate与APP的会话信息,因此Session对象是线程不安全的。在使用时要保障该对象只出现在方法内部运行,而不要共享
    Session对象位于应用程序与数据库之间,应用程序需要持久化的对象交由Session传递给数据库,应用程序需要获取数据库的信息也同样是从Session对象处获取,Session对象可以看做是一个数据调度中心

    应用程序添加、删除、修改数据
    应用程序在进行增删改操作时,将数据传递给Session对象,Session对象持有应用程序要进行操作的数据,此时数据并未执行对应的SQL语句。当Session对象执行关闭操作前,会将所持有的数据同步到数据库中,也可通过flush方法手动刷新session对象的数据存储空间,完成数据同步。但是这一切要基于事务开启的状态,否则即便执行SQL语句,不提交事务也将无意义。
    应用程序查询数据
    Hibernate查询得到的数据在Session未关闭前同样受Session的管理,满足上述规则。

    Session常用操作

    save(Object) / persist(Object)
    update(Object)
    saveOrUpdate(Object)
    delete(Object);
    get(Class, Serializable) / load(Class, Serializable)
    createQuery(String) / createSQLQuery(String)
    createCriteria(Class) 条件查询

    HibernateUtil工具类的制作

    package cn.itcast.util;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtil {
        private static Configuration conf = null;
        //静态的SessionFactory
        private static SessionFactory sf = null;
        static{
            conf = new Configuration().configure();
            sf = conf.buildSessionFactory();
        }
        public static SessionFactory getSf(){
            return sf;
        }
        /**
         * 获取Session对象
         * @return 全新的Session对象
         */
        public static Session getSession(){
            return sf.openSession();
        }
    }

    Transaction

    Transaction对象描述Hibernate执行过程中事务对象
    数据库操作中事务是保障数据操作成功的重要因素
    事务操作主要包含以下几种
    开启事务
    Transaction t = s.beginTransaction();
    提交事务
    t.commit();
    回滚事务
    t.rollback();

    Hibernate为了避免开发者在使用事务时未进行事务处理,在核心配置中添加了自动事务的解决方案,但是这种事务处理机制是针对Session的操作的,换言之每次进行Session操作都会为其提供一个独立的事务。详细内容到核心配置部分讲解。

    Query

    Query对象描述了用于进行查询操作的对象,Query对象执行查询操作需要使用HQL语言。Query对象通过Session对象获得
    Query q = s.createQuery("from UserModel");
    其中“from UserModel”使用的就是HQL语言的语法规则
    HQL语言是Hibernate框架中根据SQL语言发展得到的一种面向对象操作格式的查询语句,是Hibernate中主流的查询方式。

    使用Query进行查询
    步骤:
      获得Session对象
      编写HQL语句(字符串格式)
      由Session对象创建执行查询操作的Query对象,并传入HQL语句作为参数
        HQL语句编写时应满足预编译SQL的语法格式
        如果HQL语句中有参数,为Query对象指定操作的参数
        有关HQL语句中携带参数的查询后面详细讲解
        执行Query对象的数据列表方法获得查询结果
        q.list();
        q.uniqueResult();

    Query进行查询的结果
    Query对象获取查询结果的方式有两种
    使用list()获得查询结果
    使用uniqueResult()获得查询结果

    使用list()获得查询结果
    list方法用于获得查询数据结果为0到多条的情况
    list方法执行后得到List集合,其中封装了查询的结果,结果要根据具体的查询语句结构来进行解析,数据有两种格式
    对象模型(***Model)
    HQL格式:“from UserModel”
    HQL格式:“select um from UserModel um”
    对象数组(Object[])
    HQL格式:”select userName,age from UserModel“
    查询的内容超过一个,返回一个对象数组,封装查询结果

    投影

    投影是将返回Object[]的对象封装成对象模型的格式
    投影在使用时使用构造方法完成
    1)首先在模型类中声明投影需要的构造方法
    例如UserModel类中创建带有userName和age属性的构造方法
    2)然后查询时修改HQL语句,改为投影格式
    原始格式:select userName,age from UserModel
    投影格式:select new UserModel(userName,age) from UserModel
    3)最后从Query对象中获得的查询结果就是封装完成的对象
    List<UserModel> queryList = q.list();
    投影要求构造方法参数必须与HQL语句中参数顺序完全相同,并且要求大量的构造方法才能全兼容(不常用)。

    使用uniqueResult()获得查询结果
    uniqueResult方法用于获得查询数据结果为1条的情况
    uniqueResult方法执行后得到Object对象,其中封装查询的结果
    uniqueResult常用于获得聚合函数的查询结果
    查询数据总量:select count(uuid) from UserModel
    查询最大数据:select max(age) from UserModel

    Query进行分页查询

    1)Query对象可以对查询结果进行局部获取,也就是JEE中常用的“分页查询”结果
    2)Query对象进行查询数据局部获取
    设定查询的第一条数据编号
    q.setFirstResult(10);
    设置查询结果保留索引从第10条开始的数据
    设定查询的数据总量
    q.setMaxResults(20);
    设置查询结果保留共20条数据
    3)Query对象的分页查询结果可以根据数据库类型不同,自动生成对应的语句(与方言设置匹配)

    Query可变参数条件查询

    Criteria

    Cirteria对象描述了用于进行按条件查询操作的对象,它可以按照面向对象的格式传递查询条件。
    Cirteria对象通过Session对象获得,创建时需要
    Criteria c = s.createCriteria(UserModel.class);
    其中UserModel.class是要查询的数据模型类
    使用Criteria对象可以省去书写SQL或HQL的环节

    使用Criteria进行查询(简)
    步骤:
    1)获得Session对象
    2)由Session对象创建执行查询操作的Criteria对象
    Criteria c = s.createCriteria(UserModel.class);
    3)如果存在有查询条件,为查询添加查询条件(后面详细讲解)
    c.add(Restrictions.eq("userName", "jockme"));
    4)执行Criteria对象的数据列表方法获得查询结果
    c.list();
    c.uniqueResult();

  • 相关阅读:
    【原创】C# 文件操作详解(三)Directory类
    【原创】C# 文件操作详解(一)File类
    【原创】VS使用技巧——工欲善其事必先利其器
    【原创】C# 文件操作详解(四)DirectoryInfo类
    strpos用法
    调试跳转动态打印
    解决DIV超出样式长度自动换行
    PHP时间戳常用转换在(大、小月问题)
    懒人JS
    PHP 快速排序 与二维数组排序
  • 原文地址:https://www.cnblogs.com/xyhero/p/9348882.html
Copyright © 2011-2022 走看看