zoukankan      html  css  js  c++  java
  • Hibernate核心技术简介

    Hibernate核心技术简介

    1Hibernate映射文件开发

        Hibernate映射文件就是项目中*.hbm.xml文件,其主要是完成各元素的配置,包括根元素、类元素、定义主键、设置主键生成方法、定义属性以及关联映射。下面一一单独说明:

    (1)根元素<hibernate-mapping>

        映射文件的根元素是<hibernate-mapping>,每一个*.hbm.xml文件都有唯一的一个根元素。该元素包含以下属性:package、schema、catalog、default-cascade、default-access、default-lazy、auto-import等。

        <hibernate-mapping>元素允许嵌套多个<class>映射。但是最好的做法是一个持久化类对应一个映射文件。例如,一个持久化类名称是User,则命名为User.hbm.xml。

    (2)类元素<class>

        <class>是<hibernate>的子元素,用以定义一个持久化类与数据表的映射关系。该元素包以下属 性:name、table、discriminator-value、mutable、schema、catalog、proxy、dynamic-update、dynamic-insert、select-before-update、polymorphism、where、persister、batch-size、optimistic-lock、lazy、entity-name、check、rowid、subselect、abstract。

    (3)定义主键

        在关系数据库表中,主键用来识别记录,并保证每条记录的唯一性。在Java语言中,通过比较两个变量所引用对象的内存地址是相同,或者比较两个对象引用的对象值是否相同来判断两个对象是否相等。Hibernate为了解决两者之间的不同,使用对象标识符(OID)来标识对象的唯一性。OID是关系数据库中主键在Java对象模型中的等价物。在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系。

        一般使用数据库表中主键属性id来定义Java类中的主键,两者是一一对应关系。

    (4)设置主键生成方法

          一般使用<generator>元素来指定相应的主键,例如如下示例代码中id便是主键:

    <hibernate-mapping package="com.demo.hibernate.beans">
    
        <class name="User" table="user">
            <id name="id" column="ID" type="integer">
                <generator class="native"/>
            </id>
     
            <property name="username" column="username" type="string" />
            <property name="password" column="password" type="string" />
            <property name="email" column="email" type="string" />
        </class>
        
    </hibernate-mapping>

    (5)定义属性

        在数据库表中,每一个属性都会对应一个相应的数据类型,那么进行ORM关联映射生成的Java类,每一个成员变量也会有一个相应的数据类型。例如,int、long、String

    、char、date、text等,其中date和text等在Java代码中不是数据类型,但在此处是作为hibernate映射的内置映射类型属性。

        一般可以使用<property>元素来定义非主键属性。

    (6)关联映射

        关联映射类似关系数据库中实体之间的对应关系,不过此处表示的映射后生成的持久化类之间的关系,包含以下几种类型:<many-to-one>、<one-to-one>、<one-to-many>、<many-to-many>。

     

    2Hibernate核心编程

        用Hibernate开发基于持久层的应用时,第一件事情应当是熟悉它的编程接口。主要包含以下四个核心类的使用:

          Configuration装载配置类

          SessionFactory创建Session类

          Session数据库操作类

          Transcation事务操作类

        常用的核心接口包含以下六个:Session、SessionFactory、Configuration、Transaction、Query和Criteria。其具体关系如下图一所示:

     

    图一:接口类的产生关系

        下面简要说明一下四个核心类的作用:

    (1)Configuration装载配置类

        Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。在Hibernate启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。

    (2)SessionFactory创建Session类

        SessionFactory在Hibernate中实际起到了一个缓冲区的作用,它缓冲了Hibernate自动生成的SQL语句以及其他的映射数据,还缓冲了一些将来有可能重复利用的数据。

    (3)Session数据库操作类

        Session的主要功能是提供对映射的实体类实例的创建、读取和删除操作。

    (4)Transcation事务操作类

        Transaction接口是对实际事物实现的一个抽象,这些实现包括JDBC的事务、JTA中的UserTransaction、甚至可以是CORBA事务。这样设计的目的是为了让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。

     

    3、使用Query进行HQL语句查询

        Query接口实现对数据库及持久化对象的查询操作,它可以有两种表达方式:HQL语言或者本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。

        要取得Query对象,需要使用Session的createQuery()函数来执行查询,查询的参数是基于HQL语法的,其查询的对象是Hibernate的持久化对象名,Hibernate会根据该对象名找到要查找的表名。具体运用如下:

    (1)不带参数的查询

        代码示例如下:

         Query query = session.createQuery(“from User”);

    (2)带参数的查询

       代码示例如下:

         Query query = session.createQuery(“from User where username =: username”);

         Query.setString(“username”,”admin”);

    (3)取得List结果集

        代码示例如下:

         List list = query.list();

    (4)取得迭代列表结果集

        代码示例如下:

         Iterator it1 = query.iterate();

         Iterator it2 = query.list().iterator();

         while(it2.hasNext()){

             User user = (User)it2.next();

         }

    (5)取得一个对象

        示例代码如下:

         Query query = session.createQuery(“from User where username=?”);

         Query.setString(0,”admin”);

         User user = (User)query.uniqueResult();

    (6)标量查询

        示例代码如下:

          Iterator results = session.createQuery(“select user.username,count(user.email) from User user group by user.username”).list().iterator();

    (7)分页查询

        示例代码如下:

         Query query = session.createQuery(“from User”);

         query.setFirstResult(10);

         query.setMaxResult(20);

         List list = query.list();

    (8)创建SQL查询

        示例代码如下:

         List users = session.createSQLQuery(“select {user.*} from User{user}”).list();

        

    4、使用Criteria进行条件查询

        Criteria接口和Query接口非常类似,它允许你创建并执行面向对象的标准化查询。

    与之相对的是,如果你希望能够动态的使用API进行面向对象查询,而非在Java代码中嵌入字符串,那么选择Criteria可以达到这样的目的。以下是其具体应用:

    (1)创建Criteria实例

        实例代码如下:

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

         criteria.setMaxResult(50);

         List users = criteria.list();

    (2)添加查询条件

        实例代码如下:

         Criteria criteria = session.createCriteria(User.class);                                                              criteria.add(Restrictions.like(“username”,”admin%”));

         criteria.add(Restrictions.like(“ID”,1,10));

         List users = criteria.list();

    (3)添加排序条件

        实例代码如下:

         List users = session.createCriteria(User.class).add(Restrictions.like(“username”,”admin”)).addOrder(Order.asc(“username”)).addOrder(Order.desc(“password”)).setMaxResults(50).list();

    (4)使用示例查询

        示例代码如下:

         User user = new User();

         User.setUsername(“admin”);

         List results = session.createCriteria(User.class).add(Example.create(user)).list();

  • 相关阅读:
    visual studio 项目中使用EF创建的数据库,后续更新数据库操作(生产已经部署,不能删除数据库重新创建)
    使用Visual Studio 开发SharePoint项目时的快捷键
    JQuery预览图片
    Sharepoint 编辑WebPart时,WebPart属性为灰色不可用
    iWS工作流加载顺序
    dll备份注意事项
    Repeater 横向显示数据
    MDN开发者网络
    hdu 1010:Tempter of the Bone(DFS + 奇偶剪枝)
    ytu 2463:给小鼠补充代码(DFS 深度优先搜索)
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/5771178.html
Copyright © 2011-2022 走看看