• Hibernate入门


    Hibernate5.2.11

    框架(Framework)概念
      1.框架封装了一些常用的功能,供开发者使用。不需要手动一步一步的实现。
      2.框架可以看作是一个半成品的项目,开始者只需要知道如何调用即可,并不需要知道其中实现的原理过程。
      

      特点:框架是可重用的设计。可以提高开发效率(非常适合于敏捷快速开发)

    1.1 什么是Hibernate?

      1. Hibernate是一个开放源代码的ORM框架:Object Relational Mapping对象关系映射
           ORM:通过面向对象思想将java对象映射到数据库表中。而且通过操作java对象(访问set/get方法)来操作Hibernate数据库。不需要写任何的sql语句。
           示例:
          java对象-----------映射过程Hibernate完成-----------------数据库
          私有成员变量  -----------映射过程Hibernate完成------------ 表中的字段(列名)
          提供公共的set/get方法------映射过程Hibernate完成----------- 操作表中的字段(列名)
      2.Hibernate封装老了jdbc的所有操作,可以应用到任何使用JDBC的场合,即可以在java客户端程序使用,也可以在web程序中的servlet/jsp中使用

    1.2 Hibernate特点?

      1.基于面向对象思想的,不需要写sql语句
      2.高性能(延迟加载策略,抓取策略等。。。。)
      3.scalability 可伸缩性
      4.可靠性强(稳定性)
      5.可拓展性
      6.数据库平台移植性好。(通过配置可以使用不同的数据库平台)
      7.hibernate开源免费,适合大中型系统
      缺点:
         1.不是批量操作
         2.效率比jdbc略差。

    1.4 入门程序

      1.创建web project工程

      2.添加jar包(11个):

    ​     hibenernate(10个:下载库的lib/required/xx) mysql驱动

      3.写一个持久化Student类。

    /* 持久化类(pojo类:一个简单的java对象   plain ordinary  java object  )
    书写原则:
    * 1.必须有无参构造方法
    * 2.成员变量必须是private的
    * 3.属性方法(set/get)是public
    * 4.成员变量的类型尽量使用包装类型(包装类具有对象的属性和方法,可以方便的去操作基本类型)
    * 5.必须要有一个oid(Object InDetitifer 唯一标识)与表的主键对应
    * 6.该类不能用final修饰(final修饰的变量不可改变,final修饰的方法不可重写, final修饰的类不可继承)
    *
    备注: Hibernate中延迟加载的机制用到了动态代理模式,动态代理中的类很可能要被继承。
    */
    4.元数据配置文件

      持久化类的映射文件

        备注: 文件名称: 持久化类名称.hbm.xml 和持久化类必须在同一个目录下

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 查找映射文件的xml约束规则:
         hibernate-core.xx.jar中查找:org.hibernate包hibernate-mapping-3.0.dtd-->
    <!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="com.qf.domain.Student" table="stu">
         <id name="stu_id" column="stu_id">
                <generator class="native"></generator>
         </id>
         <property name="stu_name" column="stu_name"></property>
         <property name="stu_birthday" column="stu_birthday"></property>
     </class>
    </hibernate-mapping>

      5.主配置文件(hibernate.cfg.xml)

        4(数据库连接信息)+1(数据库方言)+2(显示数据库)+1(数据库生成策略)+1(数据库隔离级别)+1(Session)+1(加载映射文件)

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 加载并启动初始化hibernate框架: 约束规则:
       hibernate-core.xx.jar/org.hibernate/hibernate-configuration-3.0.dtd -->
    <!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>
        <!-- 以下配置的依据查找:下载的库projectetchibernate.properties中查找 -->
        <!-- 配置连接数据库的信息:驱动,地址,用户名,密码 -->
             <property name="hibernate.connection.driver_class">
                   com.mysql.jdbc.Driver
             </property>
             <property name="hibernate.connection.url">
                  jdbc:mysql://localhost:3306/1715_hibernate01
             </property>
             <property name="hibernate.connection.username">root</property>
             <property name="hibernate.connection.password">123456</property>
             <!--配置数据库的方言 mysql5.0之后的方言  org.hibernate.dialect.MySQL5InnoDBDialect
                 表示创建表的类型是:  engine=InnoDB -->
            <property name="hibernate.dialect">
               org.hibernate.dialect.MySQL5InnoDBDialect
             </property>
             <!--配置在后台显示hibernate生成的sql语句(过程)-->
             <property name="hibernate.show_sql">true</property>
             <property name="hibernate.format_sql">true</property>
             <!--配置数据库生成的策略(4个)  -->
             <property name="hibernate.hbm2ddl.auto">update</property>
          <!--设置数据库隔离级别  mysql默认级别为4 -->
          <property name="Hibernate.connection.isolation">4</property>
          <!-- 目的:要使用getCurrentSession()获取当前线程绑定的Session,必须要做如下配置-->
             <property name="hibernate.current_session_context_class">thread</property>
             <!--加载持久化类的映射文件: resource: src下资源目录-->
             <mapping  resource="com/qf/domain/Student.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>  

      6.创建测试类测试

    package com.itqf.test;
    import java.util.Date;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import com.qf.domain.Student;
    public class TestHibernate01 {
        public static void main(String[] args) {
        //1.加载主配置文件Hibernate.cfg.xml(主配置文件又加载了映射文件(元数据配置文件))
            //1.1 创建配置类的对象
            Configuration configuration =new Configuration();
            //1.2 加载配置文件(加载hibernate.cfg.xml文件)
            configuration.configure();  
            //2.从配置文件中得到sessionFactory对象
            SessionFactory factory = configuration.buildSessionFactory();
            //3.工厂生成session(Hibernate中的session)
            Session session = factory.openSession();
            //4.session可以增删查改
            Student student =new Student();
            student.setStu_name("皮皮虾");
            student.setStu_birthday( new Date());
            session.save(student);  
            //关闭资源
            session.close();
        }
    } 

    1.5 Hibernate中使用的核心类api解释

      1.Configuration

    Configuration: 配置Hibernate且启动初始化Hibernate框架。
    示例:
    Configuration  c =new Configuration();
    c.configure(); //加载src下的hibernate.cfg.xml文件

      2.SessionFactory

    从配置中得到SessionFactory对象,生产Session对象:
     c.buildSessionFactory();
     备注:SessionFacotry不是轻量级的。一个数据库对应一个SessionFactory对象。
         如果一个程序有多个数据库一定要有多个SessionFactory对象。
         SessionFactory线程安全的。

      3.Session

    Session负责增删改查。Session是非线程安全的。此处的Session指的是Hibernate的session(不同于HttpSession,唯一标识用户,用户session)
    factory.openSession()
    备注:Session使用结束需要关闭。

      4.Query

    负责查询,本地SQL语句查询和HQL查询。

      5.Transaction

    事务操作。

      6.Criteria

    查询(在线查询和离线查询)

     1.6 主键生成策略:

    <!-- 当不指定table的时候表名就是持久化类的名称 -->
    <!--如果没有指明column属性,表中的列名就是持久化类中成员变量的名称  -->
    示例:
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 查找映射文件的xml约束规则: hibernate-core.xx.jar中查找:org.hibernate包hibernate-mapping-3.0.dtd -->
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!--hibernate映射的说明 -->
    <hibernate-mapping package="com.qf.domain">
    <!-- 当不指定table的时候表名就是持久化类的名称 -->
        <class name="Student2">
    <!--如果没有指明column属性,表中的列名就是持久化类中成员变量的名称-->
            <id name="stu_id">      
                <generator class="uuid"></generator>
            </id>
            <property name="stu_name"></property>
            <property name="stu_birthday"></property>
        </class>
    </hibernate-mapping> 

      主键的分类

    1.自然主键    开发者自己维护主键
       表中有一个列,不为空,不重复,而且不能随意修改,当作主键使用。
       需要用户手动插入主键值(主键由开发者来维护,hibernate不维护)
       特点:业务逻辑复杂的时候,数据库的维护难度增加,不推荐。
       assigned:必须自己手动插入主键值,不插入报异常。
    2.代理主键  hibernate维护主键
       表中没有符合主键的列,创建一个列作为主键,且该键在业务处理中不具有任何意义(只是用来标识数据)
       特点:显然代理主键
       常见代理主键如下:
       native:本地策略。数据库平台不同。自动选择指定数据的策略。
               例如:mysql数据默认选择的是identity
                    orcale数据库默认选择的是sequence
       increment:适用于int,long,short类型的主键。自动增长机制是:
                 1.先查询数据库中最大的id值 select  max(id) from stu;
                 2.在最大的id值上加1作为新的id值插入
       identity:只能用在支持自动增长的数据中使用。如mysql支持自动增长,orcale不支持自动增长。
       uuid:适用于char,varchar类型的主键。长度为32位的16进制的字符串。占空间大。
            效率高保证唯一性,数据库移植性更好。
       sequence:oralce数据库使用的策略。
    备注:hibernate所有操作加事务
    开启事务
    Transaction t = session.beginTransaction();
        try{
          //做自己的事
        ........
    提交事务 t.commit(); }catch(Exception e){ 事务回滚(异常的时候) if(t!=null){ t.rollback(); } }

    1.7 数据库生成策略:

    create:先删除表后创建表,再操作
         create-drop:先判断有就删除,没有就创建,但是使用完该表删除。(关掉sessionFactory)
         update:没有表就创建表,如果有表了直接进行数据库操作(插入,删除,修改,查询)
         validate:校验。不会自动创建表。主要是校验持久化类中的变量和数据库表的列名是否一致。
          正式运行的项目使用update.
          测试:create-drop
     
  • 相关阅读:
    git cherrypick
    【系统设计】OA需求分析,OA系统选型及各供应商对比。
    .NET MD5加密 16位/32位
    手机端网页苹果/安卓滑动翻页,未触发事件解决办法
    k3s 私有仓库问题
    NeoVimByLua格式化代码
    RestTemplate 设置超时时间
    广告电商系统开发功能模块分析
    涂游易享系统开发和涂游易享app模式制度介绍
    广告电商系统开发新功能迭代目录
  • 原文地址:https://www.cnblogs.com/a77355699/p/7868190.html
Copyright © 2020-2023  润新知