zoukankan      html  css  js  c++  java
  • Hibernate基础知识

    一、Hibernate初识

    1、ORM:(Object/Relationship Mapping)--对象/关系映射

    2、写SQL语句的缺点:

      a.不同的数据库使用的SQL语法不同。比如:PL/SQL(oracle数据库)与T/SQL(微软版本)

      b.同样的功能在不同的数据库中有不同的实现方式。比如分页SQL,Oracle--rownumber、MySQL---使用关键字limit、SQLServer----还可以使用top关键字

      c.程序过分依赖SQL对程序的一直及扩展,维护等带来很大的麻烦。

    3、Hibernate是一种能够减少对SQL语句依赖,可行的ORM框架技术。

      1)Hibernate简介

        Hibernate是java领域的一款开源的ORM框架技术

        Hibernate对JDBC进行了非常轻量级的对象封装

      2)Hibernate在我们的应用程序中充当着什么样的角色呢?

        举例,如下图所示:我们要开发不同的系统

        持久化层 --- 处于业务逻辑层和数据库之间的一个角色

        作用 -- 把程序中生成的对象持久化到数据库中,换句话说,就是把这些对象通过对象关系映射保存到数据库的表中

      3)其他主流的ORM框架技术

        ①MyBatis: 前身就是著名的iBatis

        ②Toplink:后被Oracle收购,并重新包装为Oracle AS TopLink

        ③EJB:本身是JAVAEE的规范

      

    编写Hibernate例子的步骤:

      (1)创建Hibernate的配置文件(hibernate.cfg.xml)

      (2)创建持久化类

      (3)创建对象-关系映射文件

      (4)通过HIbernate API编写访问数据库的代码 

     hibernate必须的jar包:

      hibernate-release-4.2.4.Finallib equired;

      Mysql的JDBCjar包:mysql-connecttor-java-5.1.7-bin.jar;

      Junit4的jar包:junit-4.10.jar

    导入hibernate,Junit,mysql的驱动包步骤

      1.创建一个普通的java工程

      2.构建用户类库:windows --> preferences --> java --> build path --> user libraries --> new...(创建类库文件) --> Add Extra jars...(导入jar包)

      3.添加用户类库:在项目名上右键 --> properties --> java build path --> libraries --> Add libraries --> user libraries --> 勾选上 --> 完成

    Hibernate配置文档(cfg.xml)

    <property name="connection.username">root</property>
    <property name="connection.password"></property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="dialect">org.hibernamte.dialect.MySQLDialect</property>
    <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <property name="hbm2ddl.auto">create</property>

    编写持久化类(实体类),持久化类的设计原则要遵循javabean的设计原则,设计原则有四点:

      1. 这个类是一个公有类

      2. 提供公有的不带参数的默认的构造方法

      3. 属性要私有化private

      4. 属性要用setter/getter封装

    创建对象关系映射文件

      1.src -> New -> other - > Hibernate -> Hibernate XML Mapping file (hbm.xml) 选择需要映射的刚创建的实体类,会将创建的字段和数据库字段进行映射。

      2.在cfg.xml中配置文件声明:<mapping resource="Student.hbm.xml" ></mapping>

    使用Junit进行测试

      @Before 初始化方法

      @Test 测试注释标签

      @After 释放资源

    /**新版本方法
     * 在eclipse中可以查看数据库的,具体步骤:Winows->Show view->other->Data soure Explorer即可。
     * 一定要导数据库的jar包。数据库浏览器(Data soure Explorer)的jar包和项目的
     * jar包并不能通用,需分别倒入。
     * 使用数据库逆向生成实体类的小伙伴,一定要在数据库中设置主键,要不就等着报错吧!!!!!!!
     */
    public class StudentTest {
        private SessionFactory sessionfactory;
        private Session session;
        private Transaction transaction;
        @Before
        public void init() {
            Configuration configuration = new Configuration().configure();
    /*注意,并不调用ServiceRegistry方法,而且在新版本中调用该方法有几率会出现一定的错误.
    老师讲的课是由实体类直接生成的hbm.xml文件,会在hibernate.cfg.xml中的<session-factory>中生成一个
    name属性,即<session-factory name="">,把name属性删除,否则会报错
    */
            sessionfactory = configuration.buildSessionFactory();
            session = sessionfactory.openSession();
            transaction = session.beginTransaction();
        }
        
        @Test
        public void studentTest() {
            Student student=new Student(1,"zhanhgsa","man",new Date());
            session.save(student);
        }
    
        @After
        public void destory() {
            transaction.commit();
            session.close();
            sessionfactory.close();
        }
    }
    Junit测试

    二、Hibernate进阶

    1.hibernate.cfg.xml常用配置

    2.session简介

    3.transaction简介

    4.session详解

    5.对象关系映射常用配置

      

    1、Hibernate常用配置

    hibernate.cfg.xml配置文档的常用配置.

    程序在运行的时候会读取hibernate.cfg.xml配置文档,从而实现连接数据库,并且生成表结构.

    设置了<property name="show_sql">true</property>与<property name="format_sql">true</property>则会把hibernate运行时对数据库的操作时的sql语句会显示在控制台并且格式化.

    <property name="hbm2ddl.auto">create</property>即重新删除表结构再创建.所以之前的记录消失.

    <property name="hbm2ddl.auto">update</property>它不会删除表结构也不会创建新的表结构,会保留原有的数据,只是更新.没有"hbm2ddl.auto"属性一样也是可以添加新的数据,会保留原有的数据.

    <property name="hibernate.default_schema">hibernate</property>则在控制台输出的sql语句中,会在表名之前加上数据库名.

      

    2、session简介

      1.不建议直接使用jdbc的connection操作数据库,而是通过session操作数据库。

      2.session可以理解为操作数据库的对象,操作数据库之前必须先获取session的实例

      3.session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。

      4.把对象保存到关系数据库中需要调用session的各种方法:save(),update(),delete(),createQuery

      

    3、transaction简介

    Transaction事务简介:

      1. hibernate对数据库的操作都是封装在事务当中的,并且默认是非自动提交的方式。所以用session保存对象时,如果不开启事务并且没有手工提交事务,对象并不会真正保存在数据库中。

      2. 如果你想让hibernate像jdbc那样自动提交事务,必须调用session对象的doWork()方法,获得jdbc的connection后,设置其为自动提交事务模式(注意:通常并不推荐这样做)

       综上,我们必须开启事务。

      使用Session的doWork()方法提交事务(需要重写execute()方法,在方法中设置connection自动提交事务)。需要注意的是:在使用save()方法后并不会真正输出sql语句,需要调用flush()强制输出sql语句才可以。然后因为采用了自动提交方式(setAutoCommit(true)),数据才真正保存在数据库。

      

    4、session详解

    如何获得session对象?

      (1)openSessionion

      (2)getCurrentSession

      如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:

        如果是本地事务(jdbc事务) <property name="hibernate.current_session_context_class">thread</property>

        如果是全局事务(jta事务)    <property name="hibernate.current_session_context_class">jta</property>

    1,事务: 事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,其中的操作要么全做要么全都不做

    2,JDBC事务:JDBC事务由Connnection对象控制管理,也就是说,事务管理实际上是在JDBC Connection中实现。事务周期限于Connection的生命周期。

    3,JTA事务:提供了跨数据库连接(或其他JTA资源)的事务管理能力

    openSession 每次使用都是打开一个新的session,使用完需要调用close方法关闭session;

    getCurrentSession 是获取当前session对象,连续使用多次时,得到的session都是同一个对象,这是与openSession的区别之一 ;

    一般在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务,所以在一般情况下比较少使用openSession;

    openSession与getCurrentSession的区别:

    (1)getCurrentSession在事务提交或者回滚之后会自动关闭,而openSesssion需要你手动关闭。如果使用openSession而没有手动关闭,多次之后会导致连接池溢出!

    (2)openSession每次创建新的session对象,getCurrentSession使用现有的session对象

    5、对象关系映射常用配置 hbm.xml

    <hibernate-mapping
      schema="schemaName" //模式的名字
      catalog="catalogName" //目录的名称
      default-cascade="cassade_style" //级联风格
      default-access="field/property/CalssName" //访问策略
      default-lazy="true/false" //加载策略
      package="packagename" //默认包名
    />
    <class
      name="ClassName" //对应映射的类
      table="tableName" //对应映射数据库的表
      batch-size="N" //抓取策略,一次抓取多少记录
      where="condition" //条件 eg:抓取条件
      entity-name="EntiyName" //如果需要映射多张表
    />
    <id //表的主键
      name="propertyName" //对应的属性
      type="typeName" //对应类型
      column="column_nam" //映射数据库中表当中字段名的名称
      length="length" //指定长度
      <generator class="generatorClass">//主键生成策略
    />
    hbm.xml

      1、代理主键:是指与业务无关且能唯一标识数据库中记录,一般是数据库自动生成的,比如mysql可以使用auto_increment,Sql2000可以使用identity生成方式,oracle可以使用sequence生成方式。

      2、自然主键:指业务相关,由用户指定,且能唯一标识数据库中的任意一条记录。

       

  • 相关阅读:
    Linux学习之二——档案与目录的属性和权限
    Linux学习之一——开机必备知识
    阿里云实战之二(mysql+phpmyadmin)
    阿里云实战之一(必备程序安装)
    简要揭秘在线代码编辑器
    磕磕碰碰的Chrome之plugin开发
    Oracle导出的sql执行出错
    Spring学习(八)
    Spring学习(七)
    Spring学习(六)
  • 原文地址:https://www.cnblogs.com/silence-maple/p/10070500.html
Copyright © 2011-2022 走看看