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学习(1):hibernate基本架构和关系映射详解_第1张图片
上图是高抽象级别的结构视图

hibernate学习(1):hibernate基本架构和关系映射详解_第2张图片
上图显示了基本结构和一些重要的类

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案例的完整目录结构

hibernate学习(1):hibernate基本架构和关系映射详解_第3张图片

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

hibernate学习(1):hibernate基本架构和关系映射详解_第4张图片

首先加载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 list = query.list(); //获取所有用户信息,存入List列表
            //----------提交事务
            transaction.commit();                 //持久态
        } catch (HibernateException e) {
            e.printStackTrace();
            transaction.rollback();
        } finally{
            session.close();                      //游离态
        }
    }
}

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

你可能感兴趣的:(javaWeb,Hibernate)