首页 > 代码库 > Hibernate学习笔记

Hibernate学习笔记

一 . Hibernate的简介

  提到hibernate,首先的说说ORM框架技术(Object、Relation、Mapping),它的主要问题就是对象-关系的映射,怎么说呢?现在用的数据库大多数都是关系数据库,而关系数据库重在于表与表之间的关系连接。术语就为:一个持久化类和一个表对应,类的每个实例对应表的一条记录。其他就不说了,回到hibernate。ORM框架类型有很多,hibernate就是其中的一种,还有EJB框架(Enterprise javaBean)、iBATIS框架、TopLink框架等。

  1. 对象持久化 

    狭义的理解,“持久化”仅仅指把对象永久保存到数据库中
    广义的理解,“持久化”包括和数据库相关的各种操作:
        保存:把对象永久保存到数据库中。
        更新:更新数据库中对象(记录)的状态。
        删除:从数据库中删除一个对象。
        查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。
        加载:根据特定的OID,把一个对象从数据库加载到内存中。

   2.ORM的介绍 

    ORM(Object/Relation Mapping): 对象/关系映射
    ORM 主要解决对象-关系的映射

   技术分享 

    ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。
    ORM 采用元数据来描述对象-关系映射细节, 元数据通常采用 XML 格式, 并且存放在专门的对象-关系映射文件中

  3.Hibernate与MyBatis的对比

    Hibernate:
      非常优秀、成熟的 ORM 框架。
      完成对象的持久化操作
      Hibernate 允许开发者采用面向对象的方式来操作关系数据库。
      消除那些针对特定数据库厂商的 SQL 代码

    myBatis:
      相比 Hibernate 灵活高,运行速度快
      开发速度慢,不支持纯粹的面向对象操作,需熟悉sql语句,并且熟练使用sql语句优化功能

  4.Hibernate的简单开发

    4.1 使用myEclipse创建Maven项目

    4.2 因为使用maver项目,所以只需在项目的pom.xml文件中进行如下配置,会自动下载jar包,配置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>MyHibernate</groupId>
  <artifactId>MyHibernate</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name/>
  <description/>
  <dependencies>
    <dependency>
      <groupId>org.apache.openejb</groupId>
      <artifactId>javaee-api</artifactId>
      <version>5.0-1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.faces</groupId>
      <artifactId>jsf-api</artifactId>
      <version>1.2_04</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.faces</groupId>
      <artifactId>jsf-impl</artifactId>
      <version>1.2_04</version>
      <scope>provided</scope>
    </dependency>
    <!-- 此次导入Hiberante所需的jar包,此处导入核心jar包,所有关于hiberante的jar包都会导入 -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>4.2.20.Final</version>
    </dependency>
    
    <!-- 引入本地的jdbc的jar包 -->
    <dependency>
        <groupId>oracle</groupId>
          <artifactId>oracle</artifactId>
          <version>1.2.17</version>
        <scope>system</scope>
        <systemPath>C:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar</systemPath>
    </dependency>
  </dependencies>
  <build>
    <sourceDirectory>${basedir}/src</sourceDirectory>
    <outputDirectory>${basedir}/WebRoot/WEB-INF/classes</outputDirectory>
    <resources>
      <resource>
        <directory>${basedir}/src</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
          <webappDirectory>${basedir}/WebRoot</webappDirectory>
          <warSourceDirectory>${basedir}/WebRoot</warSourceDirectory>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

  4.3 . 在src目录下创建HIberante的配置文件hibernate.cfg.xml

     

<?xml version=‘1.0‘ encoding=‘UTF-8‘?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>
    <!-- 配置sessionFactory,表示获取连接,包含连接的四要素 
        注:hibernate 连接的四要素中的名字不能更改,必须是以下的名字
    -->
    <session-factory>
        <!--方言   告诉hibernate,连接的是oracle数据库     -->
        <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
        <property name="connection.url">jdbc:oracle:thin:local:1521:orcl</property>
        <property name="connection.username">scott</property>
        <property name="connection.password">tiger</property>
        <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
        <!-- 此标签用于是否在控制台输出sql语句  此处ture表示输出 -->
        <property name="show_sql">ture</property>
        <!--此标签表示引入hiberante的映射文件 -->
        <mapping resource="cn/et/hibernate/lesson01/Emp.hbm.xml"/>
    </session-factory>
    
</hibernate-configuration>

  4.4 创建Emp对象类

     


package cn.et.hibernate.lesson01;

import java.util.Date;

/**
 * Emp entity. @author MyEclipse Persistence Tools
 */

public class Emp implements java.io.Serializable {

    // Fields

    private Short empno;
    private String ename;
    private String job;
    private Short mgr;
    private Date hiredate;
    private Double sal;
    private Double comm;
    private Short deptno;

    // Constructors

    /** default constructor */
    public Emp() {
    }

    /** full constructor */
    public Emp(String ename, String job, Short mgr, Date hiredate, Double sal,
            Double comm, Short deptno) {
        this.ename = ename;
        this.job = job;
        this.mgr = mgr;
        this.hiredate = hiredate;
        this.sal = sal;
        this.comm = comm;
        this.deptno = deptno;
    }

    // Property accessors

    public Short getEmpno() {
        return this.empno;
    }

    public void setEmpno(Short empno) {
        this.empno = empno;
    }

    public String getEname() {
        return this.ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public String getJob() {
        return this.job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Short getMgr() {
        return this.mgr;
    }

    public void setMgr(Short mgr) {
        this.mgr = mgr;
    }

    public Date getHiredate() {
        return this.hiredate;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

    public Double getSal() {
        return this.sal;
    }

    public void setSal(Double sal) {
        this.sal = sal;
    }

    public Double getComm() {
        return this.comm;
    }

    public void setComm(Double comm) {
        this.comm = comm;
    }

    public Short getDeptno() {
        return this.deptno;
    }

    public void setDeptno(Short deptno) {
        this.deptno = deptno;
    }

}

 

 

  4.5 创建Hibernate的映射文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="cn.et.hibernate.lesson01.Emp" table="EMP" schema="SCOTT">
        <id name="empno" type="java.lang.Short">
            <column name="EMPNO"/>
            <generator class="native" />
        </id>
        <property name="ename" type="java.lang.String">
            <column name="ENAME">
                <comment>员工姓名</comment>
            </column>
        </property>
        <property name="job" type="java.lang.String">
            <column name="JOB">
                <comment>员工职位</comment>
            </column>
        </property>
        <property name="mgr" type="java.lang.Short">
            <column name="MGR">
                <comment>领导编号</comment>
            </column>
        </property>
        <property name="hiredate" type="java.util.Date">
            <column name="HIREDATE">
                <comment>雇佣日期</comment>
            </column>
        </property>
        <property name="sal" type="java.lang.Double">
            <column name="SAL">
                <comment>月薪</comment>
            </column>
        </property>
        <property name="comm" type="java.lang.Double">
            <column name="COMM">
                <comment>奖金</comment>
            </column>
        </property>
        <property name="deptno" type="java.lang.Short">
            <column name="DEPTNO">
                <comment>所属部门编号</comment>
            </column>
        </property>
    </class>
</hibernate-mapping>

  4.6 定义测试类,测试通过Hiberante对数据库的增删改查操作


package cn.et.hibernate.lesson01;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class TestHibernate {
    //表示增加
    @Test
    public void test1(){
        //创建sessionFactory
        SessionFactory sf = new Configuration().configure("/cn/et/hibernate/lesson01/hibernate.cfg.xml").buildSessionFactory();
        Session session = sf.openSession();
        //开启一个事物
        Transaction  t = session.beginTransaction();
        Emp emp = new Emp();
        emp.setEmpno(Short.parseShort("7903"));
        emp.setEname("aaa");
        session.save(emp);
//        t.commit();
    }
    @Test
    public void testdelete(){
        //创建sessionFactory
        SessionFactory sf = new Configuration().configure("/cn/et/hibernate/lesson01/hibernate.cfg.xml").buildSessionFactory();
        Session session = sf.openSession();
        //开启一个事物
        Transaction  t = session.beginTransaction();
        Emp emp = new Emp();
        //表示获取该对象属性关联属性
        emp.setEmpno(Short.parseShort("7905"));
        //调用删除的方法
        session.delete(emp);
        //事物的提交
        t.commit();
    }
    
    @Test
    public void testupdate(){
        //创建sessionFactory
        SessionFactory sf = new Configuration().configure("/cn/et/hibernate/lesson01/hibernate.cfg.xml").buildSessionFactory();
        Session session = sf.openSession();
        //开启一个事物
        Transaction  t = session.beginTransaction();
        //此处要是不查询,会将表内其他数据修改,所以先要进行查询,将查询返回的对象进行修改
        Emp emp = (Emp) session.get(Emp.class, Short.parseShort("7904"));
        emp.setEname("abcde");
        t.commit();
    }
}

  以上为Hibernate的简单的对数据库的增删改查的操作

Hibernate学习笔记