zoukankan      html  css  js  c++  java
  • Hibernate---快速入门

      

    Hibernate简介

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

      1.Hibernate优点:

      (1)对象/关系数据库映射(Basic O/R Mapping)

      它使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思想,完全的面向对象思想。

      (2)透明持久化(Persistent)

      带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。这些对象可能是普通的JavaBeans/POJO,这个对象没有实现第三方框架或者接口,唯一特殊的是他们正与(仅仅一个)Session相关联。一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。(例如,用作跟表示层打交道的数据传输对象。)

      (3)事务Transaction (org.Hibernate.Transaction)

      应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。某些情况下,一个Session之内可能包含多个Transaction对象。尽管是否使用该对象是可选的,但无论是使用底层的API还是使用Transaction对象,事务边界的开启与关闭是必不可少的。

      (4)它没有侵入性,即所谓的轻量级框架。

      (5)移植性会很好。

      (6)缓存机制。提供一级缓存和二级缓存。

      (7)简洁的HQL编程。

      2.Hibernate缺点:

      (1)Hibernate在批量数据处理的时候是有弱势。

      (2)针对某一对象(单个对象)简单的查改删增,不是批量修改、删除,适合用Hibernate;而对于批量修改、删除,不适合用Hibernate,这也是OR框架的弱点;要使用数据库的特定优化机制的时候,不适合用Hibernate。

    Hibernate的核心

      

         从上图中,我们可以看出Hibernate六大核心接口,两个主要配置文件,以及他们直接的关系。Hibernate的所有内容都在这了。那我们从上到下简单的认识一下,每个接口进行一句话总结。

      1、Configuration接口:负责配置并启动Hibernate

      2、SessionFactory接口:负责初始化Hibernate

      3、Session接口:负责持久化对象的CRUD操作

      4、Transaction接口:负责事务

      5、Query接口和Criteria接口:负责执行各种数据库查询

      注意:Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成它就被丢弃了。


    第一个Hibernate程序

      第一步:准备数据库

      首先创建一个数据库【Hibernate】,编码格式为UTF-8,然后在创建一个【user】的表,插入几行数据

      

      

      第二步:创建工程

      

      IntelliJ IDEA 集成了Hibernate等Java Web框架。选择Java(或者Java Enterprise),勾选Hibernate。默认已勾选Download,从JetBrains仓库自动下载,当前集成的版本为Hibernate 5.3.6。推荐选择Create default hibernate configuration and main class,将自动创建Hibernate配置文件。点击Next:

      

      项目构建完成后自动创建lib目录和将Hibernate所有jar包放到此目录下并自动Add as Library。同时,自动生成了hibernate.cfg.xml和Main.java:

      

      此外还需要导入MySql JDBC的包

      

     intellij配置hibernate自动生成hbm.xml文件

      (1)、View-->Tool Windows-->Database

      

      (2)、点击 + DataSource-->对应的数据库

      

       (4)、配置数据库信息,点击Test Connection 测试连接是否正常,然后点击OK

      

       可以看到我们数据库的内容

      

       

      (5)、选择View-->Tool Windows-->Persistence

       

      

      (6)、点击项目名 Generate Persistence Mapping-->By Database Schema

      

      (7)

      

       (8)、点击OK之后,intellij将会帮我们自动生成相应的实体类和hbm.xml文件

      

       然后我们点击 hibernate.cfg.xml 文件,在文件中也自动帮我们加入了配置信息

      

        

      编写配置文件

       hibernate.cfg.xml

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.username">root</property>
            <property name="connection.password">root</property>
    
            <!-- 配置Hibernate的基本信息 -->
            <!-- hibernate 所使用的数据库方言 -->
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    
            <!-- 执行操作时是否在控制台打印 SQL -->
            <property name="show_sql">true</property>
    
            <!-- 是否对 SQL 进行格式化 -->
            <property name="format_sql">true</property>
    
            <!-- 指定是否自动生成数据库表 -->
            <property name="hbm2ddl.auto">update</property>
            
            
            <mapping resource="org/zyu/bean/UserEntity.hbm.xml"/>
            <mapping class="org.zyu.bean.UserEntity"/>
    
            <!-- DB schema will be updated if needed -->
            <!-- <property name="hbm2ddl.auto">update</property> -->
    
    
        </session-factory>
    </hibernate-configuration>

      编写测试类

    package org.zyu.test;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.query.Query;
    import org.junit.Test;
    import org.zyu.bean.UserEntity;
    
    import java.util.List;
    
    public class HibernateTest {
    
        /**
         * 添加数据
         */
        @Test
        public void saveTest(){
            //读取配置文件
            Configuration conf=new Configuration().configure();
            //根据配置创建factory
            SessionFactory sessionFactory=conf.buildSessionFactory();
            //获得操作数据库的session对象
            Session session=sessionFactory.openSession();
            //开启事务
            Transaction tx=session.beginTransaction();
    
            //创建对象
            UserEntity userEntity = new UserEntity();
            userEntity.setId(2);
            userEntity.setUsername("zyu");
            //执行保存
            session.save(userEntity);
            //提交事务
            tx.commit();
            session.close();
            sessionFactory.close();
        }
    
        /**
         *
         */
        @Test
        public void getTest(){
            Configuration conf=new Configuration();
            conf.configure();
            SessionFactory sessionFactory=conf.buildSessionFactory();
            Session session=sessionFactory.openSession();
            Transaction tx=session.beginTransaction();//开启事务
    
            UserEntity userEntity = (UserEntity)session.get(UserEntity.class, 1);
    
            System.out.println(userEntity.toString());
    
            tx.commit();
            session.close();
        }
    
        @Test
        public void getAllTest(){
            Configuration conf=new Configuration();
            conf.configure();
            SessionFactory sessionFactory=conf.buildSessionFactory();
            Session session=sessionFactory.openSession();
            Transaction tx=session.beginTransaction();//开启事务
    
            Query query = session.createQuery("from UserEntity");
    
            List<UserEntity> list = query.list();
            System.out.println(list.toString());
    
            tx.commit();
            session.close();
        }
    
    }

      项目结构

      

       

  • 相关阅读:
    rabbitmq队列
    什么是RPC
    图解rabbitmq
    rabbitmq的面试题
    nginx介绍
    nginx正向代理和反向代理
    负载均衡 分布式 集群
    Nginx的负载均衡
    缓存雪崩 穿透 击穿
    Python Day32:UDP协议、UDP与TCP协议的区别、以及其服务端、客户端标准代码
  • 原文地址:https://www.cnblogs.com/zyulike/p/9718517.html
Copyright © 2011-2022 走看看