浅谈hibernate+入门实例

    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等等,在后面的博文中小编会陆续的介绍,尽请期待`(*∩_∩*)′!

时间: 2024-10-30 12:59:36

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

myeclipse下hibernate入门实例介绍

myeclipse下hibernate初步实例 说明:本例采用myeclipse+sqlserver2000 hibernate版本为3.0. 数据库驱动为:jtds-1.0.2. 1.配置myeclipse环境(eclipse-SDK- 3.1.1+myeclipse4.1.1GA_E3.1). 2.配置好sqlserver2000数据库:建立数据库:goto . 表 test_products CREATE TABLE [dbo].[test_products] ( [id] [int] I

浅谈SEO入门必须要懂的知识

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 随着现在学习seo的人越来越多,对seo的研究也更加深刻,但是新手学习seo的时候还是很渺茫,不知道从何处入手学习,也不知道学习必须seo要懂得什么知识,今天我们以一个新手的角度谈一下seo入门必须要懂得知识. 第一:刚刚接触seo 先要了解seo和一些名词的概念,像是四处一次.死链.锚文本等这些名词一定要了解并且要记住运用的方法,大部分学习

浅谈Hibernate框架获得成功的几个理由

飞快的版本发布 保持活跃的开发速度,经常进行版本发布,甚至几天 之内就从前一个版本开发到下一个版本.这样是保证软件远离Bug的最好的办法,也可以让用户感到很放心,确信Hibernate的开发十分活跃,另外这样做也有一大好处,就是可以发现哪些功能是用户真正需要的. 回归测试 我想现在整个Java社区一定都很重视自动回归测试.如果软件的功能和设计有比较大的修改,那么一个综合性的test suite对于软件可维护性和稳定性来说实在是太重要了.我们应该有这样的意识:如果对软件的一个新功能没有进行回归测试

站长浅谈网站推广实例

我是一名新手站长,建立自己的网站才几天时间,还谈不上对网站推广有多深刻的方法,不过这几天为了将自己的网站推广给更多的朋友,我花了很多时间在推广上下功夫,也有一些成效,主要有下面一些方法,一步一步地做,要有耐心,我相信不久之后就会好起来了. 方法二:建立博客写文章 我在建好主站后,没过多久我就又在网上下载了一个博客程序,把我的博客建好了http://www.662112.cn/blog 我坚持每天写文章,都是写原创文章.写博客,就一定要写原创,去复制别人的文章不会对自己的网站有多大好处,新鲜的东西

Eclipse快速上手Hibernate之入门实例

这篇文章主要谈谈Hibernate的入门开发,例子很简单,就是向数据表中添加用户名和密码.我分别使用了三种方法,一种是直接写代码,写Hbm映射文件等:一种是通过Hbm映射文件来生成代码:一种是通过代码来生成Hbm映射文件.使用了一些自动化工具,XMLBuddy是用来编辑XML文件的,JBoss Eclipse IDE是用来编写Doclet标记的.这篇文章还谈到了一些Eclipse的使用技巧,比如建立"用户库"."生成 Getter 和 Setter"等. 关于一些软

浅谈实例Page Method到静态Page Method的移植

最近被问及Page Method的问题比较多,主要还是如何从Atlas CTP中的非静态Page Method转向Beta或RC中的静态Page Method时所遇到的问题.现在我来谈一下在这方面的一些看法,也希望大家能和我一起探讨一下. 在当时,只要在Code Behind的Page类中添加一个实例方法,并且使用WebMethodAttribute进行标记即能使用,例如: [WebMethod] public string GetString(string split){ return thi

phalapi-入门篇6(小技巧和浅谈API适用范围以及入门篇总结)

phalapi-入门篇6(小技巧和浅谈API适用范围以及入门篇总结) 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 本篇文章的目的在于把框架自带的一些好用,封装好的一些方便开发的类库简单的说一下,灵活使用可以提高开发效率,再就是因为在交流过程中有很多童鞋提出了一些关于什么样的项目怎么用API和web端怎么使用API这类的问题,我就我的理解把我的一些想法和大家交流一下,最后是对于入门篇做一下总结,以及对后面的一些教程做一下说明. 附上: 官网地址

浅谈php fopen下载远程文件的函数_php实例

如下所示: //下载附件 function get_file($url, $folder = "./") { set_time_limit (24 * 60 * 60); // 设置超时时间 $destination_folder = $folder . '/'; // 文件下载保存目录,默认为当前文件目录 if (!is_dir($destination_folder)) { // 判断目录是否存在 mkdirs($destination_folder); // 如果没有就建立目录

浅谈PHP正则中的捕获组与非捕获组_php实例

今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同时也希望有大神和细心的学习者找到我理解中出现的问题. 什么是捕获组 我们先看一下PHP的正则匹配函数 int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags =