zoukankan      html  css  js  c++  java
  • Hibernate day01

    本节内容:

    1.hibernate概述

    2.hibernate入门案例

    3.hibernate配置文件

    4.hibernate的api使用

    一、hibernate概述

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

    Hibernate就是一个持久层的ORM的框架

    ORM:Object Relational Mapping,对象关系映射

    所谓的ORM就是利用描述对象和数据库表之间的元数据,自动把java应用程序中的对象,持久化到关系型数据库的表中。通过操作java对象,就可以完成对数据库表的操作。可以把ORM理解为关系型数据与对象之间的一个纽带,开发人员只需要关注一端映射的对象即可

    二、Hibernate入门案例

      1.下载Hibernate5

    https://sourceforge.net/projects/hibernate/

    解压后的目录

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

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

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

    2.在数据库创建表:商品表 shop:

    CREATE TABLE `shop` (
      `s_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `s_name` varchar(20) NOT NULL COMMENT '商品名',
      `s_describe` varchar(100) DEFAULT NULL COMMENT '商品描述',
      `s_stock` int(11) NOT NULL COMMENT '库存',
      `s_price` double NOT NULL COMMENT '价格',
      PRIMARY KEY (`s_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    3.创建一个java项目

    引入jar包:

    hibernate的jar包

    log4j支持包:日志包

    需要数据库驱动jar:

    4.创建实体类(持久化类)

    持久化类是程序中的业务实体类,这里的持久化是指类的对象能够被持久化保存到数据库中。Hibernate使用普通java对象(Plain Old java Object)即:POJP的编程模式来进行持久化,POJO类中包含的是与数据库表相对应的各个属性,这些属性通过get与set方法类访问,对外部隐藏了内部的实现细节。

    package com.hibernate.pojo;
    
    /**
     * 商品实体类 与数据库表对应
     */
    public class Shop {
    
    //    实体类中必须有一个属性作为唯一标识的主键对应表中的主键
        private Integer s_id;
    
        private String s_name;
    
        private String s_describe;
    
        private Integer s_stock;
    
        private double s_price;
    
        public Integer getS_id() {
            return s_id;
        }
    
        public void setS_id(Integer s_id) {
            this.s_id = s_id;
        }
    
        public String getS_name() {
            return s_name;
        }
    
        public void setS_name(String s_name) {
            this.s_name = s_name;
        }
    
        public String getS_describe() {
            return s_describe;
        }
    
        public void setS_describe(String s_describe) {
            this.s_describe = s_describe;
        }
    
        public Integer getS_stock() {
            return s_stock;
        }
    
        public void setS_stock(Integer s_stock) {
            this.s_stock = s_stock;
        }
    
        public double getS_price() {
            return s_price;
        }
    
        public void setS_price(double s_price) {
            this.s_price = s_price;
        }
    }
    View Code

    5.创建映射文件

      实体类不具备持久化的能力,而我们的Hibernate需要知道实体类与数据库那张表进行映射,以及类中的那个属性与表中的字段进行对应,这些都需要在配置文件中进行配置。

    在实体类的包下创建一个名称为实体类名.hbm.xml的映射文件,在映射文件中定义实体类与表之间的映射。

    映射文件没有固定位置,建议在实体类的包下创建:实体类名.hbm.xml  在配置文件中引入xml的dtd约束

    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <?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属性:表名(如果类名与表名是一致的,那么table属性可以省略)
        catalog属性:数据库名称,可以省略
        -->
        <class name="com.hibernate.pojo.Shop" table="shop">
            <!--建立类中的属性与表中的主键的映射-->
    
            <!--id标签:用来建立类中的属性与表中的主键字段对应
              name 属性:类中的属性名
              column:表中的字段名(如果表中的字段名与类中的属性名一致,那么省略column)
              length属性:字段的长度
              type属性:类型写java数据类型,Hibernate数据类型(默认)SQL类型
    
            -->
            <id name="s_id" column="s_id">
                <!--主键生成策略-->
               <generator class="native"></generator>
            </id>
              <!--建立类中的普通属性与表中字段的映射-->
             <!--
             property标签:用来建立类中的普通属性与表中的字段对应
             name属性:类中的属性名
             column属性:表中字段名(如果表中的字段名与类中的属性名一致,那么省略column)
             length属性:字段的长度
             type属性:类型写java数据类型,Hibernate数据类型(默认)SQL类型
             -->
            <property name="s_describe" column="s_describe"></property>
            <property name="s_stock" column="s_stock"></property>
            <property name="s_price" column="s_price"></property>
            
        </class>
    
    
    </hibernate-mapping>
    View Code

    6.创建hibernate的核心配置文件

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

    引入约束:

    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <!--必要的配置信息:连接数据库的基本参数-->
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    
            <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
            
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">root</property>
    
            <!--hibernate的属性-->
            <!--hibernate的方言:作用,根据配置的方言生成相应的sql语句-->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQL57Dialect</property>
             <!--hibernate:显示SQL语句-->
             <property name="hibernate.show_sql">true</property>
                <!--hibernate格式化SQL语句-->
            <property name="hibernate.format_sql">true</property>
    
                <!--Hibernate的hbm2ddl(数据库定义语言:create drop alter...)属性-->
            <!--
            hbm2ddl.auto的取值:
              none:  不用Hibernate自动生成表
              create:每次都会创建一个新的表
              create-drop:每次都会创建一个新表,执行程序结束后删除这个表
              update:如果数据库有表,使用原来的表,如果没有表创建新表,可以更新表结构
    
            -->
             <property name="hibernate.hbm2ddl.auto">update</property>
    
             <!--hibernate加载映射-->
            <mapping resource="com/hibernate/pojo/Shop.hbm.xml"></mapping>
    
    
         </session-factory>
    </hibernate-configuration>
    View Code

    7.测试:

    package com.hibernate.pojo;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;
    
    
    public class HibernateTest {
    
    
    
        @Test
        public void test(){
            //1.加载配置文件
            Configuration configuration = new Configuration ();
            //自动在src下查找hibernate.cfg.xml文件
            configuration.configure ();
            //2.创建一个SessionFactory
            SessionFactory sessionFactory = configuration.buildSessionFactory ();
    
            //3.创建一个session对象  session对象类似于connection
    
            Session session = sessionFactory.openSession ();
    
            //4.开启事务
            Transaction transaction = session.beginTransaction ();
            //5.执行相关操作
             Shop shop = new Shop ();
             shop.setS_name ("面条");
             shop.setS_describe ("意大利面");
             shop.setS_stock (123);
             shop.setS_price (10.0);
    
             session.save (shop);
    
    
    
            //6.事务提交
            transaction.commit ();
    
            //7.释放资源
            session.close ();
            sessionFactory.close ();
    
    
    
    
        }
    }
    View Code

    首先创建Configuration类的实例,并通过它来读取并解析配置文件hibernate.cfg.xml.然后创建SessionFactory读取解析映射文件信息,并将Configuration对象中的所有配置信息拷贝到SessionFactory内存中。接下来,打开session让SessionFactory提供链接,并开启一个事务,之后创建对象,向对象中添加数据,通过Session.save()方法完成向数据库保存数据的操作,最后提交事务,并关闭资源。

    三、Hibernate配置文件

    Hibernate映射配置文件

    1. 映射配置文件名称与位置没有固定要求
    2. 映射配置文件中,标签name属性值写实体类的属性

               (1) class标签name属性值实体全类名

               (2) id标签与property标签name属性值为实体类属性名称

           3.id标签和property标签中的column属性可以省略  不写与name属性值一样

           4. property的属性 type属性设置关于表字段的类型,自动对应类型

    Hibernate核心配置文件

    1. 配置文件的名称与位置是固定的在src下 配置文件名:hibernate.cfg.xml
    2. 配置3部分要求  数据库部分是必须的 hibernate部分可选 映射文件必须的
    3. 配置文件标签都写在:

             标签内部

    四、HibernateAPI使用

    Configuration:配置对象:用来加载hibernate框架的核心配置文件

    在使用Hibernate时,首先要创建Configuration实例,Configuration实例主要用于启动、加载、管理hibernate的配置文件信息。在启动hibernate的过程中,Configuration实例首先确定hibernate配置文件的位置,然后读取相关配置,最后创建一个唯一的SessionFactory实例,Configuration对象只存在于系统初始化阶段,它将SessionFactory创建完成,就完成了自己的使命

    hibernate通常使用

    Configuration configuration = new Configuration ().configure ();
    创建实例此种方式默认会去src下读取hibernate.cfg.xml配置文件。如果不想使用默认的配置文件而是指定目录下的配置文件需要向configure ()方法中传递一个文件路径参数


    SessionFactory:Session工厂对象
    SessionFactory接口负责Hibernate的初始化和建立Session对象,它在hibernate中起到一个缓冲区作用,Hibernate可以将自动生成的SQL语句、映射数据以及某些可以重复利用的数据放在这个
    缓冲区中。同时它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存
    SessionFactory实例通过Configuration 对象来获取
    SessionFactory sessionFactory = configuration.buildSessionFactory ();

    SessionFactory的特点:
    它是线程安全的,它的同一个实例对象可以供多个线程共享
    它是重量级的,不能随便创建于销毁
    由于SessionFactory的这些特点:一般情况下,一个项目中只需要一个SessionFactory,只有当应用中存在多个数据源时才为每一个数据源建立一个SessionFactory实例

    Session:

    Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作中心,它的主要功能是为持久化对象提供创建、读取、和删除的能力,所以持久化对象必须在Session的管理下才可以进行持久化操作。

      创建SessionFactory实例后,乐意通过他获取Session实例,获取Session实例有2种方式:

      Session session = sessionFactory.openSession ();

     Session session = sessionFactory.getCurrentSession ();

    以上2中获取session实例方式的主要区别是:采用openSession方法获取session实例时,SessionFactory直接创建一个新的Session实例,并且在使用完后需要调用

    close方法进行手动关闭,而getCurrentSession方法创建的Session实例会被绑定到当前线程中,它在提交或者回滚的时候会自动关闭。

    Session是线程不安全的,并发多个线程同时操作一个Session实例时,就可能导致Session数据存取的混乱(方法内部定义和使用session时,不会出现线程问题)。所以在设计软件结构时,应避免多个线程共享一个Session实例。

    session中提供了大量常用方法:

    save、update、saveOrUpdate方法:用于增加和修改对象

    delete:用户删除对象

    get和load:根据主键查询

    createQuery 和createSQLQuery用户操作数据库对象

    CreateCriteria:条件查询。

    Transaction:
    Transaction接口主要用于管理事务,他是hibernate的数据库事务接口,且对底层事务接口进行了封装。Transaction接口的事务对象是通过Session对象开启的
    Transaction transaction = session.beginTransaction ();
    在Transaction中提供了事务管理的常用方法:
    commit 提交事务
    rollback 回滚事务
    Session执行完数据库操作后,要使用Transaction接口的commit方法进行事务提交,才能将数据操作同步到数据库,发生异常时需要rollback方法进行事务回滚,以避免数据发生错误,
    因此在持久化操作后,必须调用Transaction接口的commit或者rollback如果没有开启事务,那么每个Session操作,都相当于一个独立操作。
  • 相关阅读:
    狐狸和兔子
    Arguments to main
    strncpy
    atoi
    sscanf
    集体的智慧:为什么SaaS打败企业软件?
    终于来热风了,又一次感觉到什么叫温暖!
    博士生的毕设
    淡淡的
    endnote如何修改输出格式?
  • 原文地址:https://www.cnblogs.com/wuzhilong/p/9953340.html
Copyright © 2011-2022 走看看