博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初识Hibernate
阅读量:5959 次
发布时间:2019-06-19

本文共 5512 字,大约阅读时间需要 18 分钟。

hibernate_logo

一、什么是Hibernate?

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

<!-- more -->

二、为什么使用Hibernate?

2.1 Hibernate相对于传统JDBC的优点

  1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
  2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作。
  3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
  4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

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

两者区别:

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数据库:

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方式来编写数据读写代码。

Hibernate

4.1 对象与关系型数据库

对象与关系型数据库

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

Hibernate核心架构

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操作)

<property name="hibernate.hbm2ddl.auto">update</property>设置为update可以不用手动建表了。

  1. create:如果设置为该值,则每次加载hibernate时(准确说应是创建SessionFactory时)都会删除以前创建的表而根据model重新生成表,即使前后的表没有任何变化,通常会造成数据库数据丢失,需谨慎使用这个取值。
  2. create-drop:与create差不多,所不同的是每次sessionFactory关闭时,就会删除所有表。
  3. update(最常用):这个取值比较常用,需要先建立数据库,在第一次加载hibernate时会自动创建表,以后创建hibernate会自动根据model更新表结构,即使表结构改变了,以前的行不会被删除。
  4. validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

转载地址:http://wwyax.baihongyu.com/

你可能感兴趣的文章
并查集hdu1232
查看>>
Mysql 监视工具
查看>>
从前后端分离到GraphQL,携程如何用Node实现?\n
查看>>
Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
查看>>
博客搬家了
查看>>
Python中使用ElementTree解析xml
查看>>
jquery 操作iframe、frameset
查看>>
解决vim中不能使用小键盘
查看>>
jenkins权限管理,实现不同用户组显示对应视图views中不同的jobs
查看>>
我的友情链接
查看>>
CentOS定时同步系统时间
查看>>
批量删除用户--Shell脚本
查看>>
如何辨别android开发包的安全性
查看>>
Eclipse Java @Override 报错
查看>>
知道双字节码, 如何获取汉字 - 回复 "pinezhou" 的问题
查看>>
linux中cacti和nagios整合
查看>>
Parallels Desktop12推出 新增Parallels Toolbox
查看>>
Python高效编程技巧
查看>>
Kafka服务端脚本详解(1)一topics
查看>>
js中var self=this的解释
查看>>