Hibernate中API详解

本文深入解析Hibernate框架的核心概念,包括PO、BO、VO对象的作用,Configuration配置对象的使用,SessionFactory和Session的管理,以及Transaction事务处理。同时介绍了Query和Criteria对象的查询功能,提供了一个完整的Hibernate开发流程概览。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.体系结构
这里写图片描述
PO:persistent object ,用于与数据库交互数据。–dao层 (JavaBean + hbm )
BO:Business object 业务数据对象。–service层
VO:Value Object 值对象。–web层
开发中:直接使用JavaBean 描述三个对象。
这里写图片描述
2.Configuration 配置对象

hibernate 核心配置文件种类

hibernate.cfg.xml 通常使用xml配置文件,可以配置内容更丰富。
hibernate.properties 用于配置key/value 形式的内容,key不能重复的。配置有很多的局限性。一般不用。
参考文件:hibernate-distribution-3.6.10.Final\project\etc\ hibernate.properties提供了核心配置文件常用的配置项,及选择参数。
1.提供构造 new Configuration() hibernate将自动加载 hibernate.properties文件
hibernate.properties文件必须存放在类路径(src)下
2.提供方法 configure() 将加载src下的hibernate.cfg.xml
这里写图片描述
3.扩展api
configure(String) 加载指定目录下的 xml文件
4.手动加载配置文件

        // 手动加载指定的配置文件
        config.addResource("com/itheima/a_hello/User.hbm.xml");
        // 手动加载指定类,对应的映射文件 User--> User.hbm.xml
        config.addClass(User.class);

这里写图片描述
常见异常:
这里写图片描述
开发中:将hbm.xml映射 配置 hibernate.cfg.xml
学习中:可以使用 addClass 或 addResource

3.SessionFactory工厂

  • SessionFactory 相当于java web连接池,用于管理所有session
    获得方式:config.buildSessionFactory();
    sessionFactory hibernate缓存配置信息 (数据库配置信息、映射文件,预定义HQL语句 等)
    SessionFactory线程安全,可以是成员变量,多个线程同时访问时,不会出现线程并发访问问题。
    提供api:
        //打开一个新的会话 session
        factory.openSession();
        //获得当前线程中绑定的会话session
        factory.getCurrentSession();

hibernate支持,将创建的session绑定到本地线程中,底层使用ThreadLocal,在程序之间共享session。
1.必须在hibernate.cfg.xml 配置

<!-- 2 与本地线程绑定 -->
<property name="hibernate.current_session_context_class">thread</property>

2.如果提交或回滚事务,底层将自动关闭session

4.Session 会话

Session 相当于 JDBC的 Connection – 会话
这里写图片描述
通过session操作PO对象 –增删改查
session单线程,线程不安全,不能编写成成员变量。
session api

save 保存
update 更新
delete 删除
get 通过id查询,如果没有 null
load 通过id查询,如果没有抛异常
createQuery(“hql”) 获得Query对象
createCriteria(Class) 获得Criteria对象
5.Transaction 事务

开启事务 beginTransaction()
获得事务 getTransaction()
提交事务:commit()
回滚事务:rollback()

try{
   //开启
   //session操作
   //提交
} catch(e){
   //回滚
}

扩展:不需要手动的管理事务,之后所有的事务管理都交予spring。

6.Query对象

  • hibernate执行hql语句
    hql语句:hibernate提供面向对象查询语句,使用对象(类)和属性进行查询。区分大小写。
    获得 session.createQuery(“hql”)
    方法:

list() 查询所有
uniqueResult() 获得一个结果。如果没有查询到返回null,如果查询多条抛异常。

setFirstResult(int) 分页,开始索引数startIndex
setMaxResults(int) 分页,每页显示个数 pageSize

7.Criteria对象(了解)

QBC(query by criteria),hibernate提供纯面向对象查询语言,提供直接使用PO对象进行操作。
获得方式:Criteria criteria = session.createCriteria(User.class);
条件
criteria.add(Restrictions.eq(“username”, “tom”));

8.工具类

public class H3Utils {

    // 会话工厂,整个程序只有一份。
    private static SessionFactory factory;

    static{
        //1 加载配置
        Configuration config = new Configuration().configure();

        //2 获得工厂
        factory = config.buildSessionFactory();
//3 关闭虚拟机时,释放SessionFactory
            Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println("虚拟机关闭!释放资源");
                sf.close();
            }
        }));
    }


    /**
     * 获得一个新的session
     * @return
     */
    public static Session openSession(){
        return factory.openSession();
    }

    /**
     * 获得当前线程中绑定session
     * * 注意:必须配置
     * @return
     */
    public static Session getCurrentSession(){
        return factory.getCurrentSession();
    }
}

over~~~

依赖对象(Dependent objects) 组件(Component)是一个被包含的对象,在持久化的过程中,它被当作值类型,而并非一个实体的引用。在这篇文档中,组件这一术语指的是面向对象的合成概念(而并不是系统构架层次上的组件的概念)。举个例子, 你对人(Person)这个概念可以像下面这样来建模: public class Person { private java.util.Date birthday; private Name name; private String key; public String getKey() { return key; } private void setKey(String key) { this.key=key; } public java.util.Date getBirthday() { return birthday; } public void setBirthday(java.util.Date birthday) { this.birthday = birthday; } public Name getName() { return name; } public void setName(Name name) { this.name = name; } ...... ...... } public class Name { char initial; String first; String last; public String getFirst() { return first; } void setFirst(String first) { this.first = first; } public String getLast() { return last; } void setLast(String last) { this.last = last; } public char getInitial() { return initial; } void setInitial(char initial) { this.initial = initial; } } 在持久化的过程中,姓名(Name)可以作为人(Person)的一个组件。需要注意的是:你应该为姓名的持久化属性定义getter和setter方法,但是你不需要实现任何的接口或申明标识符字段。 以下是这个例子的Hibernate映射文件: <!-- class attribute optional --> 人员(Person)表中将包括pid, birthday, initial, first和 last等字段。 就像所有的值类型一样, 组件不支持共享引用。 换句话说,两个人可能重名,但是两个Person对象应该包含两个独立的Name对象,只不过这两个Name对象具有“同样”的值。 组件的值可以为空,其定义如下。 每当Hibernate重新加载一个包含组件的对象,如果该组件的所有字段为空,Hibernate将假定整个组件为空。 在大多数情况下,这样假定应该是没有问题的。 组件的属性可以是任意一种Hibernate类型(包括集合, 多对多关联, 以及其它组件等等)。嵌套组件不应该被当作一种特殊的应用(Nested components should not be
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值