(四)Hibernate API详解

一、Configuration类

用来加载默认文件路径下的配置文件(hibernate.properties)。

调用configure()方法会加载默认文件路径下的xml格式的配置文件(hibernate.cfg.xml)推荐使用。

如果配置文件在不默认文件路径下或者配置文件名不符合默认规则 可以使用

       new Configuration().configure(file) 加载指定文件

       new Configuration().configure(path) 加载指定路径下的文件

如果使用properties格式的配置文件,可以使用addClass(实体类名.class)方法可以加载映射文件。

 

二、SessionFactory对象

SessionFactory代表数据库存储源。根据Hibernate配置文件创建对应的数据库存储源。

SessionFactory对象创建后,和Configuration对象再无关联。修改Configuration包含的配置文件信息,不会对SessionFactory有任何影响。

获取SessionFactory对象:new Configuration().configure().buildSessionFactory();

对象的缓存很大,就称为重量级对象。SessionFactory存放了Hibernate配置信息,映射元数据信息等。是重量级对象。

 

三、Session对象

                代表程序和数据库的会话。Session提供了操作数据库的各种方法。是轻量级对象。 

                   获取Session对象 
                   factory.openSession(): 获取新的Session实例。
                   factory.getCurrentSession():采用该方法创建的Session会取出当前线程中的Session,底层使用ThreadLocal进行存取 

                    save()方法:把Java对象保存到数据库中。
                                    Transaction ts=session.beginTransaction();
                                    User u=new User();
                                    u.setName("赵六");
                                    u.setPassword("123456");
                                    //将对象保存到数据库
                                    session.save(u); 
                                    ts.commit();

                    update()方法:更新数据库的方法 
                                    Transaction ts=session.beginTransaction();
                                    //先查出要修改的对象,根据主键值   
                                    User user=session.get(User.class, 1);
                                    user.setName("jery");
                                    //将对象更新到数据库,根据OID
                                    session.update(user); 
                                    ts.commit();

                    delete()方法:删除方法
                                    底层根据OID进行删除。有两种方式
                                    (1)
                                        Transaction ts=session.beginTransaction();
                                        User user=session.get(User.class, 1); 
                                        //删除指定对象
                                        session.delete(user);   
                                        ts.commit();
                                    (2)
                                        Transaction ts=session.beginTransaction();
                                        User user=new User();
                                        user.setId(2);
                                        session.delete(user);
                                        ts.commit();     

                    load()或get()方法:从数据库查找指定对象 

                                  session.get(实体类名.class,OID);或session.load(实体类名.class,OID);

                    load()和get()的区别
                                  我们使用get查询时发现控制台会立马打出查询语句。
                                  使用load查询时控制台不会打印查询语句。
                                  get方法被调用时立刻发送sql语句到数据库进行查询。
                                  load方法被调用时并没有查询数据库,当我们需要使用查询的对象时,才去查询,所以当我们打印对象时,才会在控制台打印sql语句。

                      get()的原理 
                                程序调用get方法,Hibernate发送sql语句到数据库
                                数据库返回结果,Hibernate将结果封装成对象,返回对象到程序。

                      load()的原理
                                程序调用load方法,Hibernate使用代理技术,创建一个代理对象,属性只有ID值。
                                然后返回代理对象给程序,我们使用对象时,代理对象调用Hibernate查询数据库,初始化其他属性。 

            load方法,返回一个代理对象,获取其属性时,会查询数据库,每次访问属性都会查询数据库么?
            答:不是。代理对象中有一个标识是否被初始化的boolean类型变量,记录是否被初始化。

 四、Criteria 

            使用HQL语言(后面会详细介绍),HQL语言是面向对象的
            Query query=session.createQuery("from User");


            第二种方式
            Criteria c=session.createCriteria(User.class);
            List<User> l=c.list();

            第三种方式,使用原生sql语句进行查询
            SQLQuery query=session.createSQLQuery("select * from user");
            List l=query.list();

 五、Transaction对象 

        封装了事务的操作。我们做增删改查等操作时,必须开启事务.
            因为session是线程不安全的,这样主要是为了线程安全。保证数据的正确性。
            开启事务: Transaction ts=session.beginTransaction();
            提交事务:ts.commit();
            回滚事务:ts.rollback();
            当通过getCurrentSession获取当前线程绑定的Session时,事务关闭时,会自动把Session关闭并删除。

 

六、Query对象 

        封装HQL语句的对象。

        返回一个对象的方法 query.uniqueResult();

        分页相关
        query.setFirstResult(index):从第几个取
        query.setMaxResults(count):指定取几行记录

  

 

转载于:https://www.cnblogs.com/yuexiaoyun/p/9452025.html

依赖对象(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、付费专栏及课程。

余额充值