一、Hibernate基础

  1.Hibernate简介

    Hibernate是一种对象关系映射(ORM)框架,是实现持久化存储的一种解决方案。Java包括Java类到数据库表的映射和数据查询及获取的方法,能够大大减少开发人员使用JDK和SQL处理数据的时间。

  2.Hibernate获取

    Hibernate的官网是http://www.hibernate.org,需要的时候可以去官网上下载相关的版本。

  3.Hibernate配置

    在一个项目中有时候不需要Hibernate中的全部jar包,所以当项目用到Hibernate的时候可以将相关jar包复制到项目的classpath/WebContent/WEB-INF/lib下面;或者在项目中建立一个Library加载Hibernate的jar包。

  4.Hibernate配置文件

    Hibernate的配置文件一般命名为hibernate.cfg.xml,这个配置文件默认存储在项目的classpath根目录下。下面以一个具体的配置文件说明hibernate配置文件的相关知识

    <?xml version='1.0' encoding='utf-8'?>   <!-- 这是一个xml文件头,定义版本和编码 -->

    <!DOCTYPE hibernate-configuration PUBLIC

      "_//Hibernate/Hibernate Configuration DTD 3.0//EN"

      "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">   <!-- hibernate独有的,建议写上 -->

    <hibernate-configuration>

      <session-factory>

        <property name="driver_class">com.mysql.jdbc.Driver</property>  <!-- 数据库驱动,这个是MySQL的驱动  请加载你相应数据库的驱动 -->

        <property name="url">jdbc:mysql://localhost:3306/test</property>  <!-- 数据库连接的URL -->

        <property name="username">root</property>  <!-- 数据库连接用户名 -->

        <property name="password">passwd</property>  <!-- 数据库连接密码 -->

        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  <!-- hibernate方言 -->

        <property name="show_sql">true</property>  <!-- 打印SQL语句 -->

        <mapping resource="com/lyq/User.hbm.xml" />  <!-- 映射文件,可以用这个属性改变映射文件的位置和名称 -->

      </session-factory>

    </hibernate-configuration>

    关于配置文件作如下解释:

      <hibernate-configuration>是配置文件的根元素;

      <session-factory>元素通常只有一个,其包含有多个<property>和<mapping>子元素用来配置Hibernate属性信息;

        <mapping>元素用来配置持久化类映射文件的相对路径;

        <property>元素的常用属性及说明如下:

          connectio.driver_class:设置数据库驱动;

          connection.url:设置数据库连接的URL;

          connection.username:设置连接数据库所使用的用户名;

          connection.password:设置连接数据库所使用的密码;

          dialect:设置连接数据库所使用的Hibernate方言;

          show_sql:是否打印SQL语句;

          format_sql:设置是否对SQL语句进行格式化;

          hbm2ddl.auto:设置自动建表。

  5.Hibernate的核心接口

    Hibernate的核心接口主要有五个:

    (1)Session接口:负责执行被持久化对象的CRUD操作,需要注意的是Session对象是非线程安全的;

    (2)SessionFactory接口:负责初始化Hibernate,他充当数据存储源的代理,并负责创建Session对象;

    (3)Configuration接口:负责配置并启动Hibernate,创建SessionFactory对象;

    (4)Transaction接口:负责事务相关的操作(可选);

    (5)Query接口:负责执行各种数据库查询。

二、持久化对象(数据库对象映射)

  1.持久类的编写

    持久类是Hibernate操作的对象,它与数据库中的数据表相对应,描述数据表的结构信息。下面是一个学生类student.java

    public class Student{

      private String id;  //id编号

      private String name;  //姓名

      private boolean sex;  //性别

      //参数的setter和getter方法

    }

    编写Hibernate的持久类时候需要注意以下几点:声明一个默认的、无参的构造方法;类的声明是非final类型的;拥有一个标识属性;为属性声明getter和setter方法。

  2.映射文件的编写

    Hibernate的映射文件与持久类相互对应,映射文件指定持久类与数据表之间的映射关系。Hibernate的映射文件的命名规则是*.hbm.xml。上面student类的映射文件如下:

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE hibernate-mapping PUBLIC

      "_//Hibernate/Hibernate Mapping DTD 3.0//EN"

      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

    <hibernate-mapping>

      <class name="持久类的全名"  table="数据表名">

        <id name="id" column="id" type="String">

          <generator class="native"></generator>

        </id>

        <property name="name" type="String" not-null="true" length="50">

          <column name="name"></column>

        </property>

        <property name="sex" type="boolean">

          <column name="sex" />

        </property>

      </class>

    </hibernate-mapping>

    关于持久类的映射文件作如下解释:

      <hibernate-mapping>元素是映射文件的根元素,其常用的属性主要是package属性,用来指定包名;

      <class>元素用于指定持久化类和数据表的映射,其属性中的table属性用于指定数据表的名称,name属性指定持久化类的完整类名(包含包名),但是当<hibernate-mapping>中指定package属性时可以不指定包名;上述<class>中包含<id>和<property>,下面分别介绍

        <id>元素对应数据表中的标识,指定持久化类的OID和表主键的映射;<id>通过name属性指定持久化类中的属性,column属性指定数据表中的字段名称,type属性用于指定字段的类型。<id>的子元素<generator>用于配置数据表主键的成长策略,主键生成策略标识如下:

        increment:适用于代理主键,由Hibernate以自增的方式生产,增量为1;

        identity:适用于代理主键,由底层数据库生成,前提是底层数据库支持自增字段类型;

        sequence:适用于代理主键,Hibernate根据底层数据库的序列生成,前提条件是底层数据库支持序列;

        hilo:适用于代理主键;

        native:适用于代理主键,根据底层数据库对自动生成标识符的支持能力,选择identity、sequence和hilo;

        uuid:适用于代理主键,不推荐使用,因为字符串型要比整形占用更多的数据库空间;

        assigned:适用于自然主键,由Java应用程序负责生成;

        <id>的子元素<property>元素描述数据表中字段的属性,用于配置数据表中字段的属性信息,通过此元素能够详细地对数据表的字段进行描述。<property>元素的常用配置属性及说明如下:

        name:指定持久化类中的属性名称;

        column:指定数据表中的字段名称;

        type:指定数据表中的字段类型;

        not-null:指定数据表字段的非空属性,它是一个布尔值;

        length:指定数据表中的字段长度;

        unique:指定数据表字段值是否唯一,它是一个布尔值;

        lazy:设置延迟加载。

  3.映射关系的使用

    持久化对象使用最频繁的操作是增删改查的操作,所以在下文中介绍对映射关系的使用。

三、关联关系映射

  映射在Hibernate中发挥着重大的作用,它将实体对象映射成数据表,实体对象的属性映射成数据表中的字段,另外,实体之间的关联关系也是通过映射实现的。其实关联类型分两种:

  单向关联:具有关联关系的实体对象之间的加载关系是单向的;

  双向关系:具有关联关系的实体对象之间的加载关系是双向的。

  1.一对多的关联关系

    再建一个类class.Java,包含id,classname和student三个变量。如下:

    public class Class {

      private int id;

      private String classname;

      private Ser<Student> studentes;

      //相应的getter和setter方法

    }

    这时,映射文件class.hbm.xml的内容主要部分如下:

    <set name="students">  <!-- Set为我们在class.java中定义的集合 -->

      <key column="id"></key>  <!-- 外键名称 -->

      <one-to-many class="....../student.java" />  <!-- 一对多关系的对应的类,类名的全称 -->

    </set>

    除了Set集合,还有List、Map等集合。映射文件的写法大同小异,如下:

      <!-- 映射集合属性studentes,指定存放集合属性的表明 -->

      <list name="studentes" table="student">

        <!-- 集合属性和持久化类的关联外键 -->

        <key column="id" not-null="true"/>

        <!-- 集合属性的次序列 -->

        <list-index column="list-order"/>

        <!-- 集合属性的元素 -->

        <element type="String" column="name" />

      </list>

      <!-- 映射Map  集合属性 -->

      <map name="student" table="student">

        <key  column="id" not-null="true"/>

        <map-key column="name" type="String"/>

      </map>

  2.多对一的关联关系

    将上面的一对多的关系颠倒过来就是多对一的关联关系了。假设在学生类中加一个班级属性,两个类如下:

      public class student {

        private int id;

        private String name;

        private Stirng sex;

        private Great great;

        //相应的getter和setter方法

      }

      public class Great{

        private int id;

        private String name;

        //相应的getter和setter方法

      }

    在student.hbm.xml里面的主要语句如下:

      <!-- 多对一的映射关系 -->

      <many-to-one name="great" column="great_id"></many-ro-one>

  3.多对多的关联关系

    学生和课程之间就是一个常见的多对多的关系,一个学生可以选多门课、一门课也可以被多个学生选择。假设课程类Course.java如下:

      public class Course{

        private String name;

        private int core;

        private Set<Student> students;

        //相应的getter和setter方法

      }

    这时,应该在student.java中增加一个属性private Set<Course> course;

    student.hbm.xml中的主要配置如下:

      <!-- cascade="save-update"表示在保存和更新当前对象时,级联保存和更新附属对象 -->

      <!-- inverse="true"表示该对象不维护关系(一般由一边来维护,下面会介绍让course维护) -->

      <!-- table="sc_table"表示中间表 -->

      <set name="courses" cascade="save-update" inverse="true" table="sc_table">

        <!-- column为中间表  参照student_table的外键 -->

        <key column="stu_id"  not-null="true"></key>

        <!-- 多对多的关系映射 -->

        <map-to-many  class="Course"  column="cor_id"></map-to-many>

      </set>

    course.hbm.xml中的主要配置如下:

      <!-- 主要这里没有inverse属性,由course这边维护映射关系 -->

      <set name="student" cascade="save-update" table="sc_table">

        <key column="cou_id"  not-null="true"></key>

        <map-to-many class="student" column="stu_id"></map-to-many>

      </set>

四、Hibernate对数据库的操作——增删改查

  1.Hibernate的初始化

    使用Hibernate操作数据库时首先应该创建和初始化Hibernate。

  1.1创建Hibernate——使用SessionFactory

    默认情况下,Hibernate会加载classpath目录下的Hibernate.cfg.xml文件,格式如下:

     Configuration  cfg = new Configuration().configure();

    实例化SessionFactory的代码如下:

     SessionFactory  factory = cfg.buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry());

  2.获取session

    代码如下:

     Session  session = (Session)threadLocal.get();

     if( session == null || !session.isOpen() ){

       session = (sessionFactory != null)sessionFactory.openSession() : null;

     }

  3.开启事务

    session.beginTransaction();

    还有一个提交事务:session.getTransaction().commit();

  4.添加数据

    添加数据的语法格式如下:

     public  Serializable  save(Object obj) throws  HibernateException

    比如添加student的代码:session.save(student);

  5.删除数据

    删除数据的语法格式如下:

     public  void  delete(Object obj)  throws  HibernateException

    但是因为要删除的对象并不在Session的管理之中,通过Session并不能对其进行删除操作,所以需要将要删除的对象转换为持久状态,使其处于Session的管理之内,再用上述方法将数据删除。

    比如删除student的代码:

     Student  student = (Student)session.load(Student.class,new Integer(001));

     session.delete(student);

  6.查询数据

    Session接口提供了两个加载数据的方法,即get()和load()方法。这两个方法都可用于加载数据,但是两者之间存在一定的区别。get()方法返回实际对象;load()方法返回对象的代理,只有在被调用时,Hibernate才会发出SQL语句去查询对象。

   6.1 get()方法

     get()方法的语法格式如下:

       public  Object  get(Class  entityClass, Serializable  id)  throws  HibernateExcetion

        其中,entityClass:持久化对象的类;id:标识;返回值:持久化对象或null值。

     例如:Student  student = (Student)session.get(Student.class,new Integer(1));

   6.2 load()方法

     load()方法的语法格式如下:

       public  Object  load(Class  entityClass, Serializable  id)  throws  HibernateException

         各个参数的解释同上。

     例如:Student  student = (Student)session.load(Student.class,new Integer(1));

     当调用Session的load()方法时,Hibernate并不会立刻发出SQL语句进行查询,只有在引用对象时才会发出SQL语句。

  7.修改数据

    Hibernate对数据的修改主要有两种情况:1)当实例对象处于Persistent(持久)状态时,对于它所发生的任何更新操作,Hibernate在更新缓存时都会对其进行自动更新;2)Session接口提供了update()方法,调用此方法可对数据进行手动更新。

   7.1自动更新

     自动更新在操作之前需要加载数据,因为要修改的数据并没有处于Session的管理之内。

     Student  student = (Student)session.load(Student.class,new Integer(1));  //加载Student对象

     student.setName("test");  //修改名称

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

   7.2手动更新

     手动更新语法格式如下:

       public  void  update(Object obj)  throws  HibernateException

       例如:

        //手动创建的Detached状态的药品对象

        Student  student = new  Student();

        student.setId(1);

        student.setName("test");

        student.setSex(true);

        //更新student信息

        session.update(student);

        //提交事务

        session.getTransaction().commit();

五、写在最后

  关于Hibernate的基础知识就这些了,或许不够全面,但是根据这些知识足够建立一个Hibernate项目了。

  Hibernate还有些高级应用,例如一级缓存、二级缓存、HQL检索方式等等,以后有时间在写学习笔记。

Hibernate学习笔记的更多相关文章

  1. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  2. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  3. Hibernate 学习笔记一

    Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...

  4. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

  5. Hibernate学习笔记(四)

    我是从b站视频上学习的hibernate框架,其中有很多和当前版本不符合之处,我在笔记中进行了修改以下是b站视频地址:https://www.bilibili.com/video/av14626440 ...

  6. Hibernate学习笔记(三)

    我是从b站视频上学习的hibernate框架,其中有很多和当前版本不符合之处,我在笔记中进行了修改以下是b站视频地址:https://www.bilibili.com/video/av14626440 ...

  7. HIbernate学习笔记(一) 了解hibernate并搭建环境建立第一个hello world程序

    Hibernate是一个开放源代码的ORM(对象关系映射)框架,它对JDBC进行了轻量级的封装,Java程序员可以使用面向对象的编程思维来操纵数据库,它通过对象属性和数据库表字段之间的映射关系,将对象 ...

  8. Hibernate学习笔记-Hibernate关系映射

    1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...

  9. Hibernate学习笔记(1)Hibernate构造

    一 准备工作 首先,我们将创建一个简单的基于控制台(console-based)Hibernate应用. 我们所做的第一件事就是创建我们的开发文件夹.并把所有需要用到的Java件放进去.解压缩从Hib ...

随机推荐

  1. pelican-python install

    参考: http://www.cnblogs.com/ballwql/p/pelican.html 写的原因是,我的安装环境与原作者的安装过程有不一样的地方,所有总结一下. 本文将从以下几个方面进行描 ...

  2. EDIUS设置Alpha转场的教程

    有刚开始学习EDIUS视频编辑软件的同学吗?你们是否需要一本很好的EDIUS教程呢?你们可以到EDIUS中文网站里面找哦,小编会一直更新EDIUS教程的,能给你们带来帮助我是非常高兴的.今天我们来一起 ...

  3. 解决MVC中使用BundleConfig.RegisterBundles引用Css及js文件发布后丢失的问题

    ASP.NET MVC4,ASP.NET MVC5中对JS和CSS的引用又做了一次变化,在MVC3中我们这样引用资源文件: <link href="@Url.Content(" ...

  4. SQL 2000/2005/2008 收缩日志方法

    一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大. 方法一:清空日志.1.设置数据库模式为简单模式:打开SQL企业管理器,在 ...

  5. sql rollup解决责任人收支余额

    问题的提出是周聪之前问过我的项目往来查询,不好在NC上一次性查询到.然后我就搞了一个很长的项目对账,发布了NC的节点. 现在我做了总二的总账,每次领导问我项目还有多少钱,收了多少付了多少,我还要通过科 ...

  6. int和NSInteger区别

    NSInteger会自动根据操作系统的位数(32或者64位)返回最大的类型 查到c语言中,int和long的字节数是和操作系统指针所占位数相等. 但c语言中说,long的长度永远大于或等于int ob ...

  7. [Mongodb]3.2版本的一些基本操作--待续

    一.缘由 今天公司测试股票交易系统,需要拉取大量的数据存放,故考虑放在mongodb里. 二.一些基本操作 1.权限管理 mongo默认是不用账号就能登陆的,默认端口27017,但是这不太安全.我们要 ...

  8. Zigbee组网原理详解

    Zigbee组网原理详解 来源:互联网 作者:佚名2015年08月13日 15:57   [导读] 组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点加入网络.其中节点加入网络又包括两个 ...

  9. 在.NET中使用EPPlus生成Excel报表 .

    --摘抄自:http://blog.csdn.net/zhoufoxcn/article/details/14112473 在开发.NET应用中可能会遇到需要生成带图表(Chart)的Excel报表的 ...

  10. XE6移动开发环境搭建之IOS篇(8):在Mac OSX 10.8中安装XE6的PAServer(有图有真相)

    网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 安装PAServer ...