hibernate入门

  Hibernate框架是当今主流的持久化框架之一,由于它具有简单易学、灵活性强、扩展性强等特点,能够大大地简化程序的代码量,提高工作效率,因此受到广大开发人员的喜爱。Hibernate是一个开放源代码的ORM框架,它对JDBC进行了轻量级的对象封装,使得Java开发人员可以使用面向对象的编程思想来操作数据库。

  1.为什么学hibernate

  使用传统的JDBC开发系统应用时,如果是小型应用,并不会觉得有什么麻烦,但是如果是针对大型应用系统,就会显得力不从心.

  例如:A.从几十上百张数据库表中查询几十个字段的数据,编写数据库语句不但很长,而且很繁琐,容易出错;

    B.在读取数据时需要写很多getXxx的方法,不但枯燥,而且重复代码量大.

  为了提高数据访问层的开发效率,Gavin King(加文.)开发出了一个当今最流行的的ORM框架,它就是Hibernate框架。

  2.与其它操作数据库的技术相比,Hibernate具有以下几点优势:

  - hibernate对JDBC访问数据库的代码做了轻量级封装,大大简化了数据访问层繁琐的重复代码,减少了内存消耗,加快了运行效率

  - hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度上简化了DAO层的编码操作

  - hibernate的性能非常好,映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系

  - 可扩展性强,由于源代码的开源,及API的开放,当其本身功能不够时,可以直接对其进行编码扩展

  3.入门实例

  需求:公司有新客户时,要将新客户信息录入系统并永久性存储.

  分析:我们需要建立一个客户的表,将客户信息进行存入.这里我们使用hibernate进行实现

  开发包和版本介绍:

  下载网址:http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/

  页面展示:

  

  下载下来后,开发包结构如下:

  

  从图可以看出,hibernate5.0.7的解压后目录中包含一系列的子目录,这些子目录分别用于存放不同功能的文件,接下来针对这些子目录进行简单介绍,具体如下:

  documentation文件夹:存放Hibernate的相关文档,包括参考文档的API文档。

  lib文件夹:存放Hibernate编译和运行所依赖的JAR包。其中required子目录下包含了运行Hibernate5项目必须的JAR包。

  project文件夹:存放Hibernate各种相关的源代码。

  

  4.搭建Hibernate开发环境

    4.1  使用eclipse创建Java Project

    

    4.2  新建lib文件夹,导入必备包

    

     必备包位置:hibernate-release-5.0.7.Finallib equired,lib中的required文件夹下,

      

     导入完成之后,build path,添加小奶瓶,然后环境就配置完成了.其中包的对应功能详细如下:

      antlr-2.7.7.jar:语言转换工具,hibernate利用它实现HQL到SQL的转换

      dom4j-1.6.1.jar:对dom4j的封装,是解析xml文件的

      geronimo-jta_1.1_spec-1.1.1.jar:hibernate对事务的处理

      hibernate-commons-annotations-5.0.1.Final.jar:支持hibernate Annotation(注解)

      hinbernate-core-5.0.7.Final.jar:hibernate的核心jar包

      hibernate-jpa-2.1-api-1.0.0.Final.jar:对JPA(Java持久化API)规范的支持

      jandex-2.0.0.Final.jar:用来索引annotation的

      javassist-3.18.1-GA.jar:一个用来操作Java字节码的类库

      jboss-logging-3.3.0.Final.jar: 日志文件

     4.3  创建数据表和实体类

      4.3.1 创建客户表

        

      4.3.2 创建实体类

        

          这里实体类的创建,需要遵循的规范:

          - 属性的类型最好使用基本数据类型包装类

          - 因为是在网络传输,所以实现序列化接口

          - 基本的私有化属性,提供getter,setter方法,提供空参的构造方法

    5. 编写映射配置文件(xml)

    之前编写的实体类Customer目前还不具备持久化操作的能力,而Hibernate需要知道实体类Customer映射到数据库中的哪个表,以及类中的哪个属性对应数据库表中的哪个字段,这些都需要在映射文件中配置。在实体类Customer所在的包中,创建一个名称为Customer.hbm.xml的映射文件,在该文件中定义了实体类Customer的属性是如何映射到cst_customer表的列上的。    

<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入DTD约束 
位置:在Hibernate的核心jar包(hibernate-core-5.0.7.Final.jar)中名称为hibernate-mapping-3.0.dtd
明确该文件中的内容:
    实体类和表的对应关系
    实体类中属性和表的字段的对应关系
-->
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="bobo.domain"><!-- package属性用于设定包的名称,接下来该配置文件中凡是用到此包中的对象时都可以省略包名 -->
    <!-- class标签
            作用:建立实体类和表的对应关系
            属性:
                name:指定实体类的名称
                table:指定数据库表的名称
     -->
     <class name="Customer" table="cst_customer">
        <!-- id标签
             作用:用于映射主键
             属性:
                 name:指定的是属性名称。也就是get/set方法后面的部分,并且首字母要转小写。
                 column:指定的是数据库表的字段名称
        -->
        <id name="custId" column="cust_id">
            <!-- generator标签:
            作用:配置主键的生成策略。
            属性:
              class:指定生成方式的取值。
              取值之一:native   使用本地数据库的自动增长能力。
              mysql数据库的自动增长能力是让某一列自动+1。但是不是所有数据库都支持这种方式
           -->
           <generator class="native"></generator>
        </id>
        <!-- property标签:
                作用:映射其他字段
                属性:
                    name:指定属性的名称。和id标签的name属性含义一致
                    column:指定数据库表的字段名称
        -->
        <property name="custName" column="cust_name"></property>
        <property name="custSource" column ="cust_source"></property>
        <property name="custIndustry" column ="cust_industry"></property>
        <property name="custLevel" column ="cust_level"></property>
        <property name="custAddress" column ="cust_address"></property>
        <property name="custPhone" column ="cust_phone"></property>
     </class>
</hibernate-mapping>

   

   6. 编写配置文件(xml)

      Hibernate的映射文件(例:Customer.hbm.xml)反映了持久化类和数据库表的映射信息,而Hibernate的配置文件则主要用来配置数据库连接以及Hibernate运行时所需要的各个属性的值。在项目的src下创建一个名称为hibernate.cfg.xml的文件

    

     

<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入dtd约束:
位置:在核心jar包中的名称为hibernate-configuration-3.0.dtd
-->
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <!-- 配置SessionFactory 
    SessionFactory就是一个工厂,用于生产Session对象的。
    Session就是我们使用hibernate操作数据库的核心对象了。
    明确:
        它和我们Web阶段的HttpSession没一点关系。
        此配置文件中的内容不需要背,很多配置都是可以在开发包中找到的。
        但是要求必须知道:
        创建SessionFactory由三部分组成:(缺一不可)
        1、连接数据库的基本信息
        2、hibernate的基本配置
        3、映射文件的位置
        找配置文件的key都是在hibernate的开发包中project文件夹下的etc目录中的hibernate.properties
        路径:...hibernate-release-5.0.7.Finalprojectetchibernate.properties
  -->
  <session-factory>  
  <!-- 1、数据库的基本信息 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!-- 数据库的方言 -->
        <!-- 新版本的数据库方言:org.hibernate.dialect.MySQL5Dialect -->
        <!-- 老版本的数据库方言:org.hibernate.dialect.MySQLDialect -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
  <!-- 2、hibernate的基本配置 -->
        <!-- 是否显示SQL语句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 是否格式化SQL语句 -->
        <property name="hibernate.format_sql">true</property> 
  <!-- 3、映射文件的位置 -->
        <mapping resource="bobo/domain/Customer.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

   

   7. 实现数据持久化操作

    在项目中新建一个名称为bobo.dao的包,然后在包中建立一个名为CustomerDao.java的文件    

package bobo.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import bobo.domain.Customer;
/**
 * 封装操作Customer实体的CRUD
 * 
 * @author bobo
 *
 */
public class CustomerDao {
    /**
     * 保存一个客户实体
     * @param c
     */
   public static void save(Customer c){
             //加载主配置文件(hibernate.cfg.xml)
             Configuration cfg=new Configuration().configure();
             //创建SessionFactory对象
             SessionFactory factory=cfg.buildSessionFactory();
             //使用SessionFactory生产一个Session
             Session session=factory.openSession();
             //开启事务
             Transaction tx=session.beginTransaction();
             //保存客户
             session.save(c);
             //提交事务
             tx.commit();
             //释放资源
             session.close();
             factory.close();
   }
}

     8.新建测试类,实现测试    

import org.junit.Test;
import bobo.dao.CustomerDao;
import bobo.domain.Customer;
public class HibernateDemo1 {
    @Test
    public void test1(){
             //创建客户类对象
        Customer c= new Customer();
        c.setCustName("波波老湿");
        //调用对客户进行持久化的方法
        CustomerDao.save(c);
    }
}

     测试时,会发生找不到驱动问题,由于之前没有介绍驱动包,所以需要手动导入,另外注意

      1. 在主配置文件中更改一下自己对应的数据库名以及连接的用户名密码.

     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>

      2. 更改一下映射文件的地址      

<mapping resource="bobo/domain/Customer.hbm.xml"/>

       到此,就是一个简单的hibernate入门了.

原文地址:https://www.cnblogs.com/bobohaohao/p/7743880.html