千家信息网

持久层ORM框架中Hibernate框架的示例分析

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍了持久层ORM框架中Hibernate框架的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言hibernat
千家信息网最后更新 2026年11月01日持久层ORM框架中Hibernate框架的示例分析

这篇文章主要介绍了持久层ORM框架中Hibernate框架的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

前言

hibernate的概念:
hibernate是一个ormapping框架(ORM框架,全自动ORM框架)
hibernate是一个数据库的操作框架即持久层框架
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库(SQL语句由Hibernate根据对象自动生成)。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用.。

一、Hibernate的优点?

1、Hibernate的代码是比较简单的。
2、Hibernate是面向对象的操作。
3、Hibernate的数据库移动植性很强。
4、Hibernate的缓存是世界级的。

二、Hibernate的缺点

1、不能干预sql语句的生成所以如果一个项目中,如果对sql语句的优化要求比较高,那么不适合用hibernate
2、如果一张表中有千万级别的数据量,也不适合用hibernate(因为缓存机制,它会将大量数据放入缓存)
3、hibernate适合用中小型企业开发软件
4、hibernate不适合处理复杂SQL。

三、搭建Hibernate项目架构

项目目录

1、第一步导包

2、第二步编写Hibernate的配置文件

我用的是Mysql数据库,你要是用别的把数据源驱动信息改一下即可。

                com.mysql.jdbc.Driver        jdbc:mysql://127.0.0.1:3306/MySql        root        root                org.hibernate.dialect.OracleDialect                true                true                                     

关于方言可以参考下面的图片,根据项目需求配置即可。

3、第三步:编写持久化类(pojo类)

package com.zrrd.vo;public class Dept {    private Integer deptno;    private String dname;    private String loc;    public Integer getDeptno() {        return deptno;    }    public void setDeptno(Integer deptno) {        this.deptno = deptno;    }    public String getDname() {        return dname;    }    public void setDname(String dname) {        this.dname = dname;    }    public String getLoc() {        return loc;    }    public void setLoc(String loc) {        this.loc = loc;    }    //直接转换,看着方便    @Override    public String toString() {        return "Dept{" +                "deptno=" + deptno +                ", dname='" + dname + '\'' +                ", loc='" + loc + '\'' +                '}';    }    public Dept() {        super();    }     public Dept(Integer deptno, String dname, String loc) {        this.deptno = deptno;        this.dname = dname;        this.loc = loc;    }}

4、第四步:编写Hibernate映射文件(*.hbm.xml)

该文件完成 持久化类和数据库中指定表的映射。说白了就是说明持久化类对应数据库中的哪张表,类中的每个属性都对应数据库中的那些字段。

                                                                                                                                                           SEQ_DEPT                                                                                                        

5、第五步:编写测试类完成对数据库的操作

package com.zrrd.text;import com.zrrd.vo.Dept;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class Text {    public static void main(String[] args){        //读取Hibernate.cfg.xml配置文件        Configuration configuration=new Configuration();        configuration.configure("hibernate.cfg.xml");        //创建sessionfactory工程        SessionFactory sessionFactory=configuration.buildSessionFactory();        //创建Session对象        Session session=sessionFactory.openSession();        //创建实体对象(与数据库中表对应的vo对象为实体对象,进而操作数据库(由Hibernate自动创建SQL语句)        Dept dept=session.get(Dept.class,1);        System.out.println(dept);        session.close();        sessionFactory.close();    }}

执行结果图

数据库存的数据

四、Hibernate核心接口的介绍

Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、
Transaction、Query、Criteria和Configuration。这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。

1.Session

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。

2.SessionFactory

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

3.Transaction

Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。

4.Query

Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。

5.Criteria

Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。

6.Configuration

Configuration 接口的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 接口在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。

五、封装Hibernate的工具类

当然我们在实际开发的项目当中肯定不会CRUD的时候都去写测试类里面的代码,这样会导致项目代码量巨大而且可移植性太差,所以我们要封装一下写一个工具类,用的时候直接调用即可。

public class HibernateUtil {        //一个Hibernate容器中只需要一个SessionFactory        private static SessionFactory sessionFactory;        //利用静态代码框创建SessionFactory对象        static        {                //创建Configuration对象                Configuration conf = new Configuration();                //加载Hibernate配置文件                conf.configure();//默认加载src下的hibernate.cfg.xml                //创建SessionFactory对象                sessionFactory  = conf.buildSessionFactory();        }        //得到Session对象        public static Session getSession()        {                return sessionFactory.openSession();        }}

六、常用的CRUD操作

我都已经写好啦相关执行的方法,你只要改改返回的类型就可以啦,就像Jpa框架那样,直接在你的项目中使用就可以啦。不用太感谢我,为人民服务!

1.根据主键查询对象

public Dept selectOne(int deptno)        {                Dept dept= null;                //得到session对象                Session session = null;                try                {                        //得到Session对象                        session = HibernateUtil.getSession();                        //根据主键得到对应的信息                        dept = (Dept) session.get(Dept.class, deptno);                }                catch(Exception e)                {                        e.printStackTrace();                }                finally                {                        if(session != null)                        {                                session.close();                        }                }                return dept;        }

2.查询全部的信息

public static List queryDept()        {                List deptList = null;                //声明session                Session session = null;                try                {                        //创建Session对象                        session= HibernateUtil.getSession();                        //声明HQL  :其中Dept为实体类                        String hql="from Dept ";//from后写的是类名                        //得到Query对象                        Query query = session.createQuery(hql);                        //执行查询                        deptList = query.list();                }                catch(Exception e)                {                        e.printStackTrace();                }                finally                {                        if(session != null)                        {                                session.close();                        }                }                return deptList;        }

3.条件查询

public List queryDeptByLoc(String loc)        {                List deptList = null;                //声明session                Session session = null;                try                {                        //创建Session对象                        session= HibernateUtil.getSession();                        //声明HQL  :其中Dept为实体类                        String hql="from com.zrrd.vo.Dept where loc=:loc ";//:loc表示是参数                        //得到query对象                        Query query =  session.createQuery(hql);                        //给参数赋值                        query.setString("loc", loc);//给指定参数赋值                        //查询返回List                        deptList = query.list();                }                catch(Exception e)                {                        e.printStackTrace();                }                finally                {                        if(session != null)                        {                                session.close();                        }                }                return deptList;        }

4.根据主键删除

public void deleteDept(int deptno)        {                //声明Session对象                Session session = null;                try                {                        //得到Session对象                        session = HibernateUtil.getSession();                        //开启事务保护                        Transaction  ta = session.beginTransaction();                        //根据id得到对应的值                        Dept deleteObj = (Dept) session.get(Dept.class, deptno);                        //删除该对应                        session.delete(deleteObj);                        //提交事务                        ta.commit();                }                catch(Exception e)                {                        e.printStackTrace();                }                finally                {                        if(session != null)                        {                                session.close();                        }                }        }

5.根据指定条件删除

/**         * 利用Hql进行删除         * 根据部门编号进行删除         */        public int deleteDeptByLoc(String loc)        {                int result =0;                //声明Session对象                Session session = null;                try                {                        //得到Session对象                        session = HibernateUtil.getSession();                        //开启事务保护                        Transaction  ta = session.beginTransaction();                        //编写删除使用的HQL 这里的:loc表示参数名                        String hql="delete com.zrrd.vo.Dept where loc=:loc";                        //得到Query对象                        Query query =session.createQuery(hql);                        //给参数赋值                        query.setString("loc", loc);                        //执行DML语句                        result = query.executeUpdate();                        //提交事务                        ta.commit();                }                catch(Exception e)                {                        e.printStackTrace();                }                finally                {                        if(session != null)                        {                                session.close();                        }                }                return result;        }

6.修改单个对象

public static void updateDept(Dept dept)        {                //声明Session对象                Session session = null;                try                {                        //得到Session对象                        session = HibernateUtil.getSession();                        //开启事务保护                        Transaction  ta = session.beginTransaction();                        //根据持久化对象进行修改                        session.update(dept);                        //提交事务                        ta.commit();                }                catch(Exception e)                {                        e.printStackTrace();                }                finally                {                        if(session != null)                        {                                session.close();                        }                }        }

7.根据条件进行修改(HQL)

public static int updateDeptLoc(String oldLoc,String newLoc)        {int result =0;                //声明Session对象                Session session = null;                try                {                        //得到Session对象                        session = HibernateUtil.getSession();                        //开启事务保护                        Transaction  ta = session.beginTransaction();                        //编写删除使用的HQL 这里的:loc表示参数名                        String hql="update Dept set loc=:newLoc where loc=:oldLoc";                        //得到Query对象                        Query query =session.createQuery(hql);                        //给参数赋值                        query.setString("newLoc", newLoc);                        query.setString("oldLoc", oldLoc);                        //执行DML语句                        result = query.executeUpdate();                        //提交事务                        ta.commit();                }                catch(Exception e)                {                        e.printStackTrace();                }                finally                {                        if(session != null)                        {                                session.close();                        }                }                return result;        }

8.将对象存入数据库

       public static void saveDept(Dept dept)        {                Session session = null;                try                {                        //得到Session对象                        session = HibernateUtil.getSession();                        //得到事务对象                        Transaction ta = session.beginTransaction();                        //将持久化对象存入 数据库                        session.save(dept);                        //提交事务                        ta.commit();                }                catch(Exception e)                {                        e.printStackTrace();                }                finally                {                        if(session != null)                        {                                session.close();                        }                }        }

七、主键生成机制

1、increment:表示hibernate调用所连接的数据库的加一机制为该字段生成信息(即生成主键)
2、identity:表示由所连接的数据本身调用自加一机制为该字段生成信息(即生成主键)
Increment 和identity的区别在于前者是由hibernate调用生成机制,后者是数据库本身调用生成机制(即您在建表的时候就声明该字段是自动加一的)。但是以上两种主键生成机制在连接Oracle时都不适用。因为Oracle没有自动加一机制。如果Oracle要用自动加一机制就必须依靠。
3、sequence:表示该字段由数据的序列生成,如果不想指定特定的序列则在Oracle中该序列名字必须叫HIBERNATE_SEQUENCE 用于默认选择。


4、uuid:根据UUID算法生成生成32位字符类型的主键信息。

5、guid:利用数据库提供的sys_guid 函数生成主键。但是要注意不是所有数据库都有sys_guid函数的。所以首选还是uuid

6、native:根据具体连接的数据库从identity, sequence或者hilo选择一种来生成主键。适用的数据库根据选择的生成方式确定。(这个情况数据库是可以跨越的,因为它能自动选择生成方案),在Oracle中就必须有名字叫HIBERNATE_SEQUENCE的序列
assigned: 交给应用自己给主键赋值。要注意的是赋值必须在调用save()方法之前完成。适用的数据库根据选择的生成方式确定。

八、Hibernate的类型

在Hibernate中可以使用纯java类型和Hibernate指定类型。在Hibernate框架的内部可以自动对Java类型或者Hibernate类型完成对表的对应。建议在开发中使用java类型,效率比较快

感谢你能够认真阅读完这篇文章,希望小编分享的"持久层ORM框架中Hibernate框架的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

对象 数据 数据库 生成 事务 接口 框架 项目 查询 机制 参数 类型 语句 信息 选择 配置 代码 字段 文件 加一 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技社 北京互联网科技 互联网科技的发展 成都互联网科技公司 凡科互联网科技 丰台科技园 互联网公司 盛创互联网科技有限公司 互联网科技素材视频竖屏 海南购全球互联网科技 深圳市运趣互联网科技有限公司 金融科技与互联网金融相同和不同 栖莱科技互联网股份有限公司 港股科技和互联网 中国互联网公司排名锤子科技 保险科技服务互联网营销体系 广州千川互联网科技有限公司 上海万顺科技互联网有限公司招聘 互联网金融运营模式中的金融科技 互联网时代高科技布局 互联网的黑科技实验室 科技信息互联网 广州互联网科技公司 奇士达互联网科技 贵州叶脉互联网科技有限公司所属行业 互联网科技公司有风险吗 南博望互联网科技有限公司 为客找房互联网科技公司怎么样 银行科技岗属于互联网吗 中国互联网公司的科技投入 盐城市攀科互联网科技有限公司
0