hibernate学习(1):hibernate基本架构和关系映射详解

前言

hibernate是一个数据持久化层的ORM框架,是对基本jdbc的进一步封装。那么,什么是ORM?ORM是“对象关系映射(Object Relationship Mapping)”的简称。下面分别解释这3个单词:
1,Object:java对象,这里特指javabean。
2,Relationship:关系(二维表),特指关系型数据库中的表。
3,Mapping:映射,指对象(Object)的属性与表(Relationship)中的字段存在对应关系。

ORM就是将java对象映射到数据库表,通过操作java对象,然后完成对数据库表的操作。

正文

一,hibernate基本架构
这里写图片描述
上图是高抽象级别的结构视图

这里写图片描述
上图显示了基本结构和一些重要的类

hibernate使用了现存的java API,比如jdbc,java事务API(JTA)等。下面简要说明hibernate中涉及到的常用类。
1,配置文件加载类Configuration,其在应用程序初始化时创建。配置类有2个基本组件:
a-数据库连接:文件有hibernate.properties或者hibernate.cfg.xml
b-类映射文件:用于创建javabean与数据库之间的联系。

2,SessionFactory类:相当于建立java web连接池,用于管理所有session。

3,Session类:一个会话被用于创建与数据库的连接, 相当于jdbc的Connection。

4,Transaction类:事务管理类

5,Query类:hibernate执行HQL语句时,使用对象和属性进行查询。session.createQuery(“HQL语句”)。

6,Crireria类:Criteria 对象被用于创造和执行面向规则查询的对象来检索对象。

二,一个hibernate案例的完整目录结构

这里写图片描述

三,java对象属性和表字段的映射

这里写图片描述

首先加载hibernate.cfg.xml创建数据库连接,接着创建javabean属性和数据库表字段之间的联系。接下来就可以通过操作java对象来操作数据库表啦。

四,对象操作示例

1,一般地,我们在编写hibernate程序时,要重复的获取数据库连接,创建sessionFactory,并且在程序结束时关闭sessionFactory。这些重复性的工作提取出来封装进HibernateUtils.java类。

package com.jimmy.utils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

/**
 * hibernate工具类,封装了hibernate的重复性初始化代码
 * 
 * 1,封装“配置文件读取”操作
 * 2,封装“创建sessionFactory”操作
 * 3,封装“获取session”操作
 */
public class HibernateUtils {
    //整个程序应该只有一个sessionFactory
    private static SessionFactory sessionFactory;

    static {
        //加载配置文件
        Configuration configure = new Configuration().configure();
        //创建session工厂
        sessionFactory = configure.buildSessionFactory();
        //关闭虚拟机时,释放session工厂
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            public void run() {
                sessionFactory.close();
            }
        }));
    }

    public static Session openSession(){ //创建session
        return sessionFactory.openSession();
    }

    public static Session getCurrentSession(){  //获取当前session
        return sessionFactory.getCurrentSession();
    }
}

2,增删改查

package com.jimmy.test;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.jimmy.domain.User;
import com.jimmy.utils.HibernateUtils;

public class TestDemo2 {
    @Test
    public void saveTest(){
        Session session = HibernateUtils.openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            //----------开启事务
            User user = new User();               //瞬时态
            user.setUsername("haha");           //瞬时态
            user.setPassword("131313");           //瞬时态
            session.save(user);                   //持久态
            //----------提交事务
            transaction.commit();                 //持久态
        } catch (HibernateException e) {
            e.printStackTrace();
            transaction.rollback();
        } finally{
            session.close();                      //游离态
        }
    }

    @Test
    public void updateTest(){
        Session session = HibernateUtils.openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            //----------开启事务
            User user = (User)session.get(User.class, 9); //根据表id获取User对象
            user.setUsername("xixi");  //重新设置值
            user.setPassword("222");
            session.update(user);  //保存对象
            //----------提交事务
            transaction.commit();                 //持久态
        } catch (HibernateException e) {
            e.printStackTrace();
            transaction.rollback();
        } finally{
            session.close();                      //游离态
        }
    }

    @Test
    public void deleteTest(){
        Session session = HibernateUtils.openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            //----------开启事务
            User user = (User)session.get(User.class, 9); //根据表id获取User对象
            session.delete(user);  //保存对象
            //----------提交事务
            transaction.commit();                 //持久态
        } catch (HibernateException e) {
            e.printStackTrace();
            transaction.rollback();
        } finally{
            session.close();                      //游离态
        }
    }

    @Test
    public void queryTest(){
        Session session = HibernateUtils.openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            //----------开启事务
            Query query = session.createQuery("from com.jimmy.domain.User"); //HQL语句
            List<User> list = query.list(); //获取所有用户信息,存入List列表
            //----------提交事务
            transaction.commit();                 //持久态
        } catch (HibernateException e) {
            e.printStackTrace();
            transaction.rollback();
        } finally{
            session.close();                      //游离态
        }
    }
}

上述代码,我们可以看到,对数据库的操作完全转变为对java对象的操作。

   [Hibernate体系结构的概要图] Hibernate体系结构的概要图 Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这6个核心接口分别加以介绍。    Session接口 Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。   SessionFactory接口 SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。   Configuration接口 Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。 Transaction接口   Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。 Query和Criteria接口   Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值