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操作,都相当于一个独立操作。
  • 相关阅读:
    洛谷p1017 进制转换(2000noip提高组)
    Personal Training of RDC
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Eurasia
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Peterhof.
    Asia Hong Kong Regional Contest 2019
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Siberia
    XVIII Open Cup named after E.V. Pankratiev. Ukrainian Grand Prix.
    XVIII Open Cup named after E.V. Pankratiev. GP of SPb
    卜题仓库
    2014 ACM-ICPC Vietnam National First Round
  • 原文地址:https://www.cnblogs.com/wuzhilong/p/9953340.html
Copyright © 2011-2022 走看看