Hibernate初步

来源:互联网 发布:vue.js 数据绑定 编辑:程序博客网 时间:2024/05/01 21:23

 

一 综述

 

1 Session的创建

    步骤 : 

     (1) 初始化Hibernate配置管理器 Configuration 

            根据传入或默认的配置文件 hibernate.cfg.xml , 或者 hibernate.properties ,来创建并初始化一个实例 。 

            Configuration config=new Configuration().configure();

 

   (2)通过Configuration类创建Session的f工厂类SessionFactory 

           SessionFactory sessionFactory=config.buildSessionFactory();  

 

   (3)通过SessionFactory得到session的实例

         Session session=sessionFactory.openSession();  

 

二 hibernate 基础定义

 

   1  Configuration

 

   负责管理hibernate的配置信息,Hibernate运行时获得一些底层信息,几个关键属性包括:

 

  (1)  数据库 URL 

  (2)  数据库用户

  (3)  数据库用户密码

  (4) 数据库jdbc驱动类

  (5) 数据库适配器(dialect) ,用于对特定的数据库提供支持,其中包含了对特定数据库进行实现。如hibernate数据类型到数据库类型的映                射。

 

    当我们调用:

      Configuration config=new Configuration().configure(); 一般在创建SessionFactory时需要该类。

 

      Hibernate会自动在CLASSPATH中搜索hibernate.cfg.xml  ,并加载进内存,作为后继操作的配置。

 

 

2 SessionFactory

 

   该类负责创建session实例,保存了对应当前数据库配置的所有映射关系,同时也负责维护当前的二级缓存和StatementPool,创建SessionFactory代价是昂贵的。

 

3  Session  

 

 该类是hibernate操作的基础,相当于JDBC 与JDBC Cnnection ,Session作为Hibernate的持久化管理器核心,提供了众多支持持久化的方法,通过这些对象我们可以透明的完成CRUD 。

 

  (1) 利用Query接口:

 

 

String hql = "from User user where user.username like ? " ;

Query query = session.createQuery(hql) ;

query.setParameter(0, "duming") ;

List list = query.list() ;

Iterator iter = list.iterator() ;

while(iter.hasNext()){

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

System.out.println("name:" + user.getUsername());

System.out.println("password:" + user.getPassword());

}

 

 

 

(2)criteria 查询接口

 

 

四 hibernate O/R映射

 

 1 实体映射技术

 

      该技术作为类和表之间的纽带,在ORM技术中占有重要的位置。对于hibernate用户而言,映射关系更多的体现在配置文件的维护之中。

 

 该部分分为以下3种方面:

 

   (1)  介绍hibernate中类表映射,字段属性之间的映射。

 

   (2) 介绍自定义数据类型,该偶记属性之间的映射。

 

   (3) 围绕实体映射中实体粒度,层次的设计思路进行探讨。

 

 

2 实体映射基础

 

  a) 表名类名之间的映射

 

   <class name="cn.bupt.duming.vo.User" table="user" catalog="login">

 

   <generator-class = "native">

     表示主键生成方式由数据库本身负责。generator 表示主键的生成方式。   

 

 

  b) 主键映射

 

    <id name="username" type="java.lang.String">

            <column name="username" length="50" />

    </id>

 

  c) 字段映射

 

    <property name="password" type="java.lang.String">

            <column name="password" length="50" />

    </property>

 

 

  通过以上配置binernate.hbm.xml ,我们就完成了实体类与数据库表之间的映射。从而能够完成增删改查的操作。

 

3 hibernate 还提供了一种与实体类型无关的映射模式:动态模型 , 即通过通用的集合类型来对数据库进行操作。

 

   最简单的是通过hashMap 的键值对,来记录数据库中的 属性值/属性名。

 

    实例如下:

 

   <class entity-name="DynamicUserMap" table="user" catalog="login">

 

   动态模型中不存在特定的实体类,我们通过增加一个字段entity-name,用以指定实体名,然后借助这个实体名,我们进行MAP类的持久化。

 

 

   实例代码如下:

   Map userMap = new HashMap();

   userMap.put("username" , "duming2" ) ;

   userMap.put("password", "lk") ;

   Transaction tx = session.beginTransaction() ;

   session.save("DynamicUserMap" , userMap) ;

   tx.commit() ;

 

 

4 高级实体映射机制:

 

   UserType 和CompositeUserType 接口是hibernate中提供的实现自定义类型的接口。

 

 

5 符合主键

 

 hibernate 只用composite-id 对库表进行操作 , 映射主键为:

 

   <class name="cn.bupt.duming.vo.Student" table="student" catalog="login">

        <composite-id>

            <key-property name="firstname" type="java.lang.String">

                <column name="firstname" length="50" />

            </key-property>

            <key-property name="lastname" type="java.lang.String">

                <column name="lastname" length="50" />

            </key-property>

        </composite-id>

 

        <property name="address" type="java.lang.String">

            <column name="address" length="50" />

        </property>

 

 

(2)VO类实现:

 

 需要重载 equals 方法, 和 hashCode 方法。

 

 public boolean equals(Object obj) {

// TODO Auto-generated method stub

if(!(obj instanceof Student)){

return false ;

}

Student rhs = (Student) obj ;

return  new  EqualsBuilder()

.append(this.firstname , rhs.firstname)

.append(this.lastname , rhs.lastname).isEquals();

}

 

@Override

public int hashCode() {

return new HashCodeBuilder(-528253723 , -475504089)

.append(super.hashCode())

.append(this.firstname)

.append(this.lastname)

.toHashCode() ;

}

 

 

(3)  测试代码

 

Student student = new Student() ;

student.setFirstname("du") ;

student.setLastname("ming") ; 

student = (Student) session.load(Student.class, student) ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击