Hibernate快速入门

一、概述

Hibernate是一种对象/关系映射的解决方案,就是将Java中对象与对象之间的关系映射至关系数据库中的表与表之间的关系。对JDBC进行了轻量级的对象封装,解决了面向对象语言操作关系型数据库出现的不匹配问题。

作为模型层/数据访问层,通过配置文件(hibernate.cfg.xml或hibernate.properties)和映射文件(*.hbm.xml)把Java对象或持久化对象映射到数据库中的表。其中实体类对应表,类的属性对应数据库的表字段,然后通过操作PO(持久化对象),对数据库中的表进行各种操作。

优点:

  • 对象化:以对象的思维操作数据库,开发过程中只需要操作对象即可
  • 可移植:对持久层做了封装,不需考虑具体的数据库类型,代码具有可重用性
  • 非侵入:不需要继承任何类,不需要实现任何接口,属于POJO对象

缺点:

  • 使用数据库特性的语句,不容易调优
  • 大批量数据的更新存在问题
  • 存在大量的攻击查询功能

官网地址

二、核心接口

  1. Configuration,负责管理Hibernate的配置信息,包括数据库URL、数据库用户名等,保存在配置文件hibernate.cfg.xml中。
  2. SessionFactory,负责创建Session实例,保存了对应当前数据库配置的所有映射关系。
  3. Session,提供了众多持久化的方法,如save、update、delete等,通过SessionFactory创建。
  4. Transaction,负责事务操作,包括JDBC的事务、JTA中的UserTransaction等。
  5. Query,负责执行HQL语句。

三、工作流程

  1. 开发持久化类,由POJO和映射文件组成
  2. 获取Configuration
  3. 获取SessionFactory
  4. 获取Session,打开事务
  5. 用面向对象的方式操作数据库
  6. 关闭事务,关闭Session

四、HQL

HQL是一种面向对象的查询语言,SQL的操作对象是数据库表,而HQL的操作对象是类、实例、属性等。HQL的抽象依赖于Query类,每个Query实例对应一个查询对象。使用HQL查询步骤如下:

  1. 获取Session对象
  2. 编写HQL语句
  3. 以HQL语句作为参数,调用Session的createQuery方法创建查询语句
  4. 如果HQL语句包含参数,则调用Query的setXXX方法赋值
  5. 调用Query对象的list等方法返回查询结果列表(持久化实体集)

五、映射

对象关系映射有很多种,除了基本映射之外,还包括集合映射、组件映射、继承映射、关联关系映射等。其中,关联关系映射是最常用的一种映射,它包括一对一、一对多、多对一和多对多几种类型。

基本映射是对一个实体进行映射,关联关系映射是处理多个实体之间的关系,关联关系在对象模型中有一个或多个引用。

1、基本映射

映射文件一般以所创建的bean对象的名称来命名,声明bean对象及其属性对应数据库中的哪个表及哪个字段。除了使用XML方式配置映射外,还可以通过使用注解的方式配置映射。

<hibernate-mapping>
    <class name="beanName" table="tableName"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName" column="columnName"></property>
    </class>
</hibernate-mapping>

配置文件hibernate.cfg.xml,用来指定URL、用户名、密码、JDBC驱动等数据库连接信息,同时包含已经定义好的映射文件。

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.url"></property>
        <property name="hibernate.connection.driver_class"></property>
        <property name="hibernate.connection.username"></property>
        <property name="hibernate.connection.password"></property>

        <mapping resource="com/hibernate/pojo/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration></span>

2、多对一映射

多对一关联映射是最常见的映射,也是Hibernate中最简单的一种映射关系。原理是“多端”维护关联关系,在“多端”加入外键,以此指向“一端”,这样“多端”也就拥有了“一端”的引用。

<hibernate-mapping>
    <class name="manyBeanName" table="manyTableName"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName"></property>
        <many-to-one name="foreignKey" class="oneBeanName" column="foreignKey+Id"></many-to-one>
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="oneBeanName" table="oneTableName"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName"></property>
    </class>
</hibernate-mapping>

3、一对一映射

一对一关联映射就是两个对象之间是一对一的关系。由于关系模型是与方向无关的,即是双向性的,而对象模型是有方向性的,是由对象模型即映射文件决定的。所以一对一单向关联映射和双向关联映射还是有区别的,主要体现在实体类和映射文件的不同。

对象模型与关系模型关联关系的维护有两种方式:主键关联和唯一外键关联。

主键关联

两个对象使用相同的主键,不需要使用其他外键。

<hibernate-mapping>
    <class name="beanNameOne" table="tableNameOne"/>
        <id name="id">
            <generator class="foreign">
                <param name="property">primaryKey</param>
            </generator>
        </id>
        <property name="propertyName"></property>
        <one-to-one name="objectTwo" class="beanNameTwo" constrained="true"></one-to-one>
    </class>
</hibernate-mapping>

<!-- 单向 -->
<hibernate-mapping>
    <class name="beanNameTwo" table="tableNameTwo"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName"></property>
    </class>
</hibernate-mapping>

<!-- 双向 -->
<hibernate-mapping>
    <class name="beanNameTwo" table="tableNameTwo"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName"></property>
        <one-to-one name="objectOne" class="beanNameOne" fetch="join"></one-to-one>
    </class>
</hibernate-mapping>

唯一外键关联

某一端使用一个外键进行关联,属于多对一的特例。

<hibernate-mapping>
    <class name="beanNameOne" table="tableNameOne"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName"></property>
        <many-to-one name="objectTwo" class="beanNameTwo" column="objectTwo+Id" unique="true"></many-to-one>
    </class>
</hibernate-mapping>

<!-- 单向 -->
<hibernate-mapping>
    <class name="beanNameTwo" table="tableNameTwo"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName"></property>
    </class>
</hibernate-mapping>

<!-- 双向 -->
<hibernate-mapping>
    <class name="beanNameTwo" table="tableNameTwo"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName"></property>
        <one-to-one name="objectOne" class="beanNameOne" property-ref="propertyNameOne"></one-to-one>
    </class>
</hibernate-mapping>

由于采用主键关联映射不能改成多对一关联映射,灵活性差,所以通常会采用唯一外键关联映射。

4、一对多映射

一对多关联映射和多对一关联映射的映射原理一样,都是在“多端”加入外键,指向“一端”。

<!-- 单向 -->
<hibernate-mapping>
    <class name="oneBeanName" table="oneTableName"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName"></property>
        <set name="objectMany">
            <key column="primaryKey"/>
            <one-to-many class="manyBeanName"/>
        </set>
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="manyBeanName" table="manyTableName"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName"></property>
    </class>
</hibernate-mapping>


<!-- 双向 -->
<hibernate-mapping>
    <class name="oneBeanName" table="oneTableName"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName"></property>
        <set name="objectMany" inverse="true">
            <key column="primaryKey" not-null="true"/>
            <one-to-many class="manyBeanName"/>
        </set>
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="manyBeanName" table="manyTableName"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName"></property>
        <many-to-one name="objectOne" class="oneBeanName" column="primaryKey"/>
    </class>
</hibernate-mapping>

5、多对多映射

多对多关联映射是最常见、也是最容易理解的映射。无论是单向关联还是双向关联,都是将两个表中的主键通过第三张表进行关联,避免数据冗余。

<hibernate-mapping>
    <class name="oneBeanName" table="oneTableName"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName"></property>
        <set name="objectTwo" table="twoTableName">
            <key column="primaryKeyOne"/>
            <many-to-many class="twoBeanName" column="primaryKeyTwo"/>
        </set>
    </class>
</hibernate-mapping>

<!-- 单向 -->
<hibernate-mapping>
    <class name="twoBeanName" table="twoTableName"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName"></property>
    </class>
</hibernate-mapping>

<!-- 双向 -->
<hibernate-mapping>
    <class name="twoBeanName" table="twoTableName"/>
        <id name="id"><generator class="native"/></id>
        <property name="propertyName"></property>
        <set name="objectOne" table="oneTableName">
            <key column="primaryKeyTwo"/>
            <many-to-many class="oneBeanName" column="primaryKeyOne"/>
        </set>
    </class>
</hibernate-mapping>

六、实现dao操作

public class UserDao{  
    public void insert(User user){          
        // 加载配置文件hibernate.cfg.xml  
        Configuration config = new Configuration().configure();  
        // 创建会话工厂  
        SessionFactory sf = config.buildSessionFactory();  
        // 会话对象,表示与数据库的连接会话过程  
        Session session = null;  
        Transaction tx = null ;          
        try{  
            session= sf.openSession();  
            // 开启事务  
            tx= session.beginTransaction();  
            // 调用sava方法 
            session.save(user); 
            // 提交事务  
            tx.commit();                          
        }        
    }  
}

参考资料:

Hibernate详细教程

Hibernate原理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Hibernate是一个开源,轻量级的ORM(对象关系映射)工具。Hibernate框架简化了java应用程序与数...
    易百教程阅读 1,140评论 2 4
  • Hibernate: 一个持久化框架 一个ORM框架 加载:根据特定的OID,把一个对象从数据库加载到内存中OID...
    JHMichael阅读 1,956评论 0 27
  • 本文中我们介绍并比较两种最流行的开源持久框架:iBATIS和Hibernate,我们还会讨论到Java Persi...
    大同若鱼阅读 4,300评论 4 27
  • 本文包括: 1、CRM 项目的整体介绍 2、Hibernate 框架概述 3、Hibernate 快速入门 4、H...
    廖少少阅读 3,463评论 9 66
  • 卢奕发给我的照片,卢奕、杨宸昊、张纪元、周烨四人在市里比赛的合影。是啊,他们四人现在分属于三所高中,聚在一起并不容...
    蓝蝶landie阅读 273评论 1 2