资讯专栏INFORMATION COLUMN

初识Hibernate

tomato / 2219人阅读

摘要:使用反射机制,而不是字节码增强程序来实现透明性。工具类初始化失败为空,请检查配置文件瞬时对象与持久化对象测试代码当前在数据库中没有记录进行关联,所以此时是瞬时对象。将持久化当前在数据库有唯一一条记录对应,所以此时是持久化对象。

一、什么是Hibernate?
Hibernate (开放源代码的对象关系映射框架): Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

二、为什么使用Hibernate? 2.1 Hibernate相对于传统JDBC的优点

对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作。

hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

2.2 Hibernate相对于MyBatis的区别与联系
两者区别:

两者联系:

缓存方面

相同点:

Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓 存方案,创建适配器来完全覆盖缓存行为。

不同点:

Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。

MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。

三、Hibernate的使用

准备好User实体类和数据库记录

User.java

public class User {
    private Integer id;
    private String userName;
    private String passWord;
    //Get、Set方法,此处省略。
}

mysql数据库:

3.1 添加pom依赖

Hibernate基础Maven依赖:


    
      junit
      junit
      4.12
      test
    

    
    
      dom4j
      dom4j
      1.6.1
    
    
      commons-logging
      commons-logging
      1.1.1
    
    
    
    
      org.hibernate
      hibernate-core
      4.3.2.Final
    

    
      commons-collections
      commons-collections
      3.2.1
    
   
    
    
    
      mysql
      mysql-connector-java
      5.1.6
    
  
3.2 hibernate.cfg.xml配置文件



    
        
        
        com.mysql.jdbc.Driver
        
        admin
        
        jdbc:mysql://localhost:3306/Hibernatetraning
        
        root
        
        org.hibernate.dialect.MySQLDialect
        
        true
       
        
    
3.2 User.hbm.xml映射文件




    
        
        
            
        
        
        

    
测试
        Configuration config = new Configuration().configure();
        SessionFactory sessionFactory = config.buildSessionFactory();

        //测试session是否创建,以及是否可以从user映射的表里获取记录
        Session session = sessionFactory.openSession();
        //System.out.println("session=="+session);
        User user = (User)session.get(User.class,1);
        System.out.println(user);
        //关闭会话工厂,项目自动停止。生产环境中千万不要写这句。
        //sessionFactory.close();

控制台输出:User{id=1, userName="Jack", passWord="123"}

四、Hibernate基本概念
Hibernate是自动化程度更高ORM(Object-Relational Mapping)框架,不是面向SQL的持久层框架,以更加OO方式来编写数据读写代码。

4.1 对象与关系型数据库

注意:一定要清楚当前操作的东西,是属于对象层面的还是关系型数据库层面的,解决异常也是如此。

Hibernate中的对象有3中状态,瞬时对象(Transient Objects)、持久化对象(Persistent Objects)和离线对象(Detached Objects也叫做脱管对象)。
4.2 HibernateUtils.java工具类
public class HibernateUtils {

    private static SessionFactory sessionFactory = null;

    static {
        try {
            Configuration configuration = new Configuration().configure();
            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                    .applySettings(configuration.getProperties())
                    .build();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        }catch (HibernateException e){
            System.out.println("SessionFactory初始化失败");
            e.printStackTrace();
        }
    }

    public static SessionFactory getSessionFactory() throws Exception{
        if (sessionFactory != null){
            return sessionFactory;
        }else {
            throw new Exception("sessionFactory为空,请检查配置文件");
        }
    }

    public static Session getSession(){
        Session session = null;
        try {
            if (sessionFactory != null){
                session = sessionFactory.openSession();
            }
        }catch (HibernateException e){
            e.printStackTrace();
        }
        return session;
    }

    public static void closeSession(Session session){
        try {
            if (session != null && session.isOpen()){
                session.close();
            }
        }catch (HibernateException e){
            e.printStackTrace();
        }
    }
}
4.3 瞬时对象与持久化对象

测试代码:

        Session session = HibernateUtils.getSession();
        Transaction tx = session.beginTransaction();

        User user1 = new User();
        user1.setId(2);
        user1.setUserName("Frank");
        user1.setPassWord("111");
        // 当前user1在数据库中没有记录进行关联,所以此时user1是瞬时对象。

        // 将user1持久化
        session.save(user1);
        tx.commit();

        User user2 = (User)session.get(User.class, 2);
        System.out.println(user2);
        // 当前user2在数据库有唯一一条记录对应,所以此时user2是持久化对象。
4.4 hibernate.hbm2ddl.auto

hibernate.cfg.xml配置文件中hibernate.hbm2ddl.auto属性值(从类自动生成数据库DDL操作)

update设置为update可以不用手动建表了。

create:如果设置为该值,则每次加载hibernate时(准确说应是创建SessionFactory时)都会删除以前创建的表而根据model重新生成表,即使前后的表没有任何变化,通常会造成数据库数据丢失,需谨慎使用这个取值。

create-drop:与create差不多,所不同的是每次sessionFactory关闭时,就会删除所有表。

update(最常用):这个取值比较常用,需要先建立数据库,在第一次加载hibernate时会自动创建表,以后创建hibernate会自动根据model更新表结构,即使表结构改变了,以前的行不会被删除。

validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73465.html

相关文章

  • Spring Boot - 表单校验(JSR303&Hibernate Validator)

    摘要:初步使用主要使用注解的方式对进行校验,第一个例子在需要校验的字段上指定约束条件然后在中可以这样调用,加上注解即可。如果校验失败,默认会返回框架的出错信息。指定到的分组名会全部进行校验,不指定的不校验。 Spring Boot - 表单校验(JSR303&Hibernate Validator) 回顾 Spring Boot - 初识 Hello World Spring Boot -...

    tinyq 评论0 收藏0
  • Hibernate之CRUD与实例状态

    摘要:本文将继续介绍简单的增删改查方法和对对象实例状态的理解查询方法暂不提及。二实例状态中的对象有中状态瞬时对象持久化对象和离线对象也叫做脱管对象。持久化状态已经被持久化,并且加入到缓存中。处于游离状态的对象称为游离对象。 在上一篇《初识Hibernate》中简单介绍了在Hibernate如何加载对象和持久化对象,以及Hibernate中对象实例状态。本文将继续介绍Hibernate简单的增...

    Youngdze 评论0 收藏0
  • Spring Boot - 自定义启动banner

    摘要:背景这段时间较忙,有些想念小红,为了表达我对小红的思念之情,决定将启动的研究一下,看看是否能够自定义,让我天天能够看到她。 背景 这段时间较忙,有些想念小红,为了表达我对小红的思念之情,决定将spring boot启动的banner研究一下,看看是否能够自定义,让我天天能够看到她。 展示 经过调研,发现自定义banner是一个轻松愉快的过程,忍不住让我多启动几次,先看看效果:(省略了一...

    CollinPeng 评论0 收藏0
  • Spring Boot - 单元测试(Junit4&Mockito)

    摘要:当面讲给你听讲堂地址,或许是最实用的教程,新课促销中,只要你敢来,保你收货满满。优惠报名全程撸码快速入门教程全原价,优惠价全程撸码进阶全原价,优惠价 回顾 Spring Boot - 初识 Hello World Spring Boot - Servlet、过滤器、监听器、拦截器 Spring Boot - 静态资源处理、启动加载、日志处理 Spring Boot - 部署Deplo...

    raoyi 评论0 收藏0
  • Hibernate配置及自定义注册映射文件

    摘要:一配置属性详解可以在各式各样不同环境下工作而设计的因此存在着大量的配置参数。以简便操作,多数配置参数都有默认的配置值也是我们日常使用的必须品。 Hibernate (开放源代码的对象关系映射框架) Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装, 它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernat...

    coordinate35 评论0 收藏0

发表评论

0条评论

tomato

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<