Hibernate是对jdbc进一步的封装,随着项目的开展,小编开始接触到这个概念,一开始接触的时候并没有觉得hibernate有多神秘,没有进一步的研究,只是简单的知道她是对jdbc的进一步的封装,可是这并不是学习的目的,到了目前这个学习的阶段,所有的知识都应该精益求精,而不仅仅是停留在知道和使用这个层面上,那么hibernate是什么?她是干什么的?为什么会出现hibernate?她又有着怎么样的优缺点呢?今天这篇博文小编就从这几个方面对hibernate进行一个简单的总结,希望对有需要的小伙伴有帮助,还请小伙伴们多多指教哦`(*∩_∩*)′!

Hibernate是什么?

Hibernate是一个开放源代码的对象关系映射框架,她对JDBC进行了非常轻量级的对象封装,使得java程序员可以随心所欲的使用对象编程思维来操纵数据库,hibernate可以应用在任何使用JDBC的场合,既可以在java的客户端程序使用,也可以在Servlet/jsp中的Web应用中使用,最具革命意义的,hibernate可以在应用的EJB的j2ee架构中取代cmp,完成数据持久化的重任。

有意思的是hibernate翻译成中文的意思是冬眠,虽然现在已经是三月份,但是北方依旧是冷飕飕的`(*∩_∩*)′,冬眠嘛,需要睡很长的时间,这就跟我们的持久化不谋而合,持久化是将程序数据在持久状态和瞬时状态间转换的机制,通俗的讲,就是好瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。在我们的实际生活中,也有很多持久化的方法,比如说,我们会将鲜肉冷藏,吃的时候再解冻;将水果做成罐头的方法也是;将人的脏器迅速冷冻,运输,然后解冻给人移植的技术也是。

  hibernate怎么用?

Hibernate主要用来实现Java对象和表之间的映射,除此之外还提供还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的百分之九十五,对于以数据为中心的程序来说,她们往往只在数据库中使用存储过程来实现商业逻辑,hibernate可能不是最好的解决方法,对于那些在基于java的中间层应用中,她们实现面向对象业务模型中和商业逻辑的应用,hibernate是最有用的,hibernate可以帮助我们消除或者包装那些针对特定厂商的SQL代码并且帮你把结果集从表格格式的表示形式转换到一系列的对象去。如下一张简单的图,我们来看一下hibernate的工作原理:

结合上面的执行过程图,小编来简单的描述一下hibernate的运行过程,首先,应用程序先调用Configration类,该类读取hibernate的配置文件及映射文件中的信息,并用这些信息生成一个SessionFactory对象,接着,从SessionFacctory对象生成一个Session对象,并用Session对象生成Transaction对象,可通过Session对象的get()、load()、sava()、update()、delete()和saveOrupdate()等方法对PO进行加载,保存,更新,删除等操作;在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作,如果没有异常,Transaction对象将提交这些操作结果到数据库中。

  Hibernate的优缺点

优点:
    一、更加对象化
    以对象化的思维操作数据库,我们只需要操作对象就可以了,开发更加对象化。
    二、移植性
    因为Hibernate做了持久层的封装,你就不知道数据库,你写的所有的代码都具有可复用性。
    三、Hibernate是一个没有侵入性的框架,没有侵入性的框架我们称为轻量级框架。对比Struts的Action和ActionForm,都需要继承,离不开Struts。Hibernate不需要继承任何类,不需要实现任何接口。这样的对象叫POJO对象。测试更加方便,提高了效率。
    缺点:

一、由于对持久层封装过于完整,导致开发人员无法对SQL进行优化,无法灵活使用JDBC的原生SQL,Hibernate封装了JDBC,所以没有JDBC直接访问数据库效率高。要使用数据库的特定优化机制的时候,不适合用Hibernate 
    二、框架中使用ORM原则,导致配置过于复杂,一旦遇到大型项目,比如300张表以上,配置文件和内容是非常庞大的,另外,DTO满天飞,性能和维护问题随之而来
    三、如果项目中各个表中关系复杂,表之间的关系很多,在很多地方把lazy都设置false,会导致数据查询和加载很慢,尤其是级联查询的时候。
    四、Hibernate在批量数据处理时有弱势,对于批量的修改,删除,不适合用Hibernate,这也是ORM框架的弱点。接着,结合小编目前的项目,做一个简单的实例,来帮助我们更好的来理解hibernate。

  Hibernate实例

首先,第一步建议实体类User.java,具体代码如下所示:

package com.liang.hibernate;  

import java.util.Date;  

public class User {
    private String id;
    private String name;
    private String password;
    private Date createTime;
    private Date expireTime;  

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public Date getExpireTime() {
        return expireTime;
    }
    public void setExpireTime(Date expireTime) {
        this.expireTime = expireTime;
    }  

}  

第二步,提供User.hbm.xml文件,完成类映射,具体代码如下所示:

<span style="font-size:12px;"><?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!--生成默认为user的数据库表-->
    <class name="com.liang.hibernate.User">
        <id name="id">
            <!-- 算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成GUID -->
            <generator class="uuid"></generator>
        </id>
        <property name="name"></property>
        <property name="password"></property>
        <property name="createTime" type="date"></property>
        <property name="expireTime" type="date"></property>
    </class>  

</hibernate-mapping></span>  

第三步,将User.hbm.xml文件加入到hibernate.cfg.xml文件中,代码如下所示:    

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  

<hibernate-configuration>
    <session-factory>
        <!-- 设置数据库驱动 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 设置数据库URL -->
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
        <!-- 数据库用户名 -->
        <property name="hibernate.connection.username">root</property>
        <!-- 数据库密码 -->
        <property name="hibernate.connection.password">123456</property>
        <!-- 指定对应数据库的方言,hibernate为了更好适配各种关系数据库,针对每种数据库都指定了一个方言dialect -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  

        <!-- 映射文件 -->
        <mapping resource="com/liang/hibernate/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>  

第四步,编写工具类ExportDB.java,将hbm生成ddl,也就是hbm2ddl,代码如下所示:

package com.liang.hibernate;  

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;  

/**
 * 将hbm生成ddl
 * @author liang
 *
 */
public class ExportDB{
    public static void main(String[]args){
        //默认读取hibernate.cfg.xml文件
        Configuration cfg = new Configuration().configure();
        ////生成并输出sql到文件(当前目录)和数据库
        SchemaExport export = new SchemaExport(cfg);
        export.create(true, true);
    }
}  

测试之前,要提前建立数据库hibernate_first,测试如下;控制台打印的SQL语句:

drop table if exists User
create table User (id varchar(255) not null, name varchar(255), password varchar(255), createTime date, expireTime date, primary key (id))  

数据库表结构,如下图所示:


         建立客户端类Client,添加用户数据到mySQL

package com.liang.hibernate;  

import java.util.Date;  

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;  

public class Client {
    public static void main(String[]args){
        //读取hibernate.cfg.xml文件
        Configuration cfg = new Configuration().configure();
        //建立SessionFactory
        SessionFactory factory =cfg.buildSessionFactory();  

        //取得session
        Session session = null;  

        try{
            //开启session
            session = factory.openSession();
            //开启事务
            session.beginTransaction();  

            User user = new User();
            user.setName("jiuqiyuliang");
            user.setPassword("123456");
            user.setCreateTime(new Date());
            user.setExpireTime(new Date());
            //保存User对象
            session.save(user);  

            //提交事务
            session.getTransaction().commit();  

        }catch(Exception e){
            e.printStackTrace();
            //回滚事务
            session.getTransaction().rollback();
        }finally{
            if(session != null){
                if(session.isOpen()){
                    //关闭session
                    session.close();
                }
            }
        }
    }
}  

右键debug运行,测试完成之后,我们查询一下测试结果:
       
       小编寄语:该博文,小编主要简单的介绍了一下hibernate,以及hibernate的一个简单的实例,从例子我们可以看出来,我们只是使用Hibernate对User这一个实体进行了映射,比较简单,但是完全不符合实际。如何像关系型数据库一样表示多种关联关系,例如:一对一,一对多,多对多等等,我们还需要深入。下篇博文,我们介绍Hibernate的基本映射原理以及关联关系映射。同样的在代码中没有涉及到任何有关JDBC的代码,作为开发人员只需要写好相应的实体类,然后通过配置就可以实现了表的建立以及向表中实现数据的插入。在代码中有许多Hibernate的核心对象,例如Configuration、SessionFactory、Session等等,在后面的博文中小编会陆续的介绍,尽请期待`(*∩_∩*)′!

浅谈hibernate+入门实例的更多相关文章

  1. 浅谈Hibernate入门

    前言 最近打算做一个自己的个人网站,经过仔细思考,打算使用hibernate作为开发的ORM框架,因此各种找资料,由于本人是刚刚接触这技术的,所以就找了比较基础的知识来分享下 基本概述 Hiberna ...

  2. hibernate入门实例

    1. 环境配置 1.1 hiberante环境配置 hibernate可实现面向对象的数据存储.hibernate的官网:http://hibernate.org/ 官网上选择hibernate OR ...

  3. Core Data浅谈初级入门

    Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数 ...

  4. 【Hibernate 7】浅谈Hibernate的缓存机制

    一.Hibernate缓存机制简介 对于Hibernate本身来说,它的缓存主要包括三部分:session缓存(一级缓存).二级缓存.查询缓存. 1.1,session缓存 随着session的关闭而 ...

  5. 【转】Hibernate入门实例

    1. 环境配置 1.1 hiberante环境配置 hibernate可实现面向对象的数据存储.hibernate的官网:http://hibernate.org/ 官网上选择hibernate OR ...

  6. 浅谈hibernate的sessionFactory和session

    一.hibernate是什么? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hiber ...

  7. 浅谈Hibernate框架(一)——.hbm.xml中的配置

    Hibernate一枚“全自动”的ORM框架: 用IDE工具集成Hibernate会自动生成: 以.hbm.xml为后缀结尾的配置文件+ POJO类 + Dao类 主键查询: Session.load ...

  8. 从一次异常中浅谈Hibernate的flush机制

    摘自http://www.niwozhi.net/demo_c70_i1482.html http://blog.itpub.net/1586/viewspace-829613/ 这是在一次事务提交时 ...

  9. 【SSH 基础】浅谈Hibernate关系映射(4)

    继上篇博客 多对多关联映射(单向) 多对多对象关系映射,须要增加一张新表完毕基本映射. Hibernate会自己主动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联,多 ...

随机推荐

  1. Words to Use Instead of "Very"

  2. [NOI 2010]航空管制

    Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上 ...

  3. [HNOI 2009]最小圈

    Description 考虑带权的有向图$G=(V,E)$以及$w:E\rightarrow R$,每条边$e=(i,j)(i\neq j,i\in V,j\in V)$的权值定义为$w_{i,j}$ ...

  4. [USACO08JAN]haybale猜测Haybale Guessing

    题目描述 The cows, who always have an inferiority complex about their intelligence, have a new guessing ...

  5. [SCOI2008]配对

    题目描述 你有 n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一个Bp[i].要求所有配对的整数差的绝对值之和尽量小,但不允许两个相同的数配对.例如A={5,6,8},B={5, ...

  6. 【USACO】股票市场

    题目描述 尽管奶牛天生谨慎,它们仍然在住房抵押信贷市场中大受打击,现在它们准备在股市上碰碰运 气.贝西有内部消息,她知道 S 只股票在今后 D 天内的价格. 假设在一开始,她筹集了 M 元钱,那么她该 ...

  7. hihocoder 1035 : 自驾旅行 III

    描述 给定一棵含有 n 个结点的树,结点从 1 标号.你从 1 号结点驾车出发,希望遍历一些关键结点(访问到就好,不需要按照这些关键结点的输入顺序).每条边有两个权值,c0, c1 分别表示步行和驾车 ...

  8. SPOJ 1812 Longest Common Substring II

    A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...

  9. Linux学习之CentOS(八)----文件与目录的默认权限与隐藏权限(转)

    文件与目录的默认权限与隐藏权限 一个文件有若干个属性, 包括读写运行(r, w, x)等基本权限,及是否为目录 (d) 与文件 (-) 或者是连结档 (l) 等等的属性! 要修改属性的方法在前面也约略 ...

  10. easyui datagrid 横向滚动条

    要出现横向滚动条则不能有fitColumns:true/false