Hibernate核心接口

一、Configuration类
一个应用程序只创建一个Configuration对象,只存在于系统的初始化阶段。
1.常用的Configuration操作方法

若要加载多个自定义的XML文件,可采用Configuration中提供的addResource方法实现:

    //多次调用addResource方法,加载xml映射文件
    Configuration cfg=new 
    Configuration().addResource("xml1.hbm.xml").addresource("xml2.hbm.xml");
    //多次调用addClass方法,直接添加被映射的类,消除对文件名的硬编码
    //在/com/model下寻找xml1.hbm.xml和xml2.hbm.xml文件,并加载进来
    Configuration cfg=new 
    Configuration().addClass(com.model.xml1.class).addClass(com.model.xml2.class);
    //调用setProperty方法动态配置属性值
     Configuration cfg=new 
    Configuration().addClass(com.model.xml1.class).addClass(com.model.xml2.class).
    setProperty("hibernate.dialect","org.hibernate.dialect.MySQLDialect").
    setProperty("hibernate.connection.datasource","java:comp/env/jdbc/test");

二、SessionFactory接口
一个应用程序中只有一个SessionFactory实例,且不能改变。
!!但当项目中要操作多个数据库时,必须为每个数据库指定一个SessionFactory。
1.常用操作方法

    Configuration config = new Configuration().configure();
    SessionFactory sessionFactory=config.buildSessionFactory();
    //采用openSession()方法创建Session
    Session session1=sessionFactory.openSession();
    //采用getCurrentSession()方法创建Session
    Session session2=sessionFactory.getCurrentSession();
采用openSession()方法创建Session实例时,SessionFactory直接创建一个新的Session实例,使用完成后调用
close()方法手动关闭。
采用getCurrentSession()方法创建的Session实例会被绑定到当前线程中,在提交(commit)或回滚(rollback)操
作时自动关闭。!!需在hibernate.cfg.xml配置文件中添加如下配置:
     //使用本地事务
     <property name="hibernate.current_session_context_class">thread</property>
     //使用全局事务
     <property name="hibernate.current_session_context_class">jta</property>

三、Session接口
Session对象生命周期以Transaction对象的事务开始和结束为边界。
特点:
(1)非线程安全
(2)实例是轻量级的,创建和销毁不需太多资源
(3)有一个缓存(Hibernate的第一级缓存),用于存放当前工作单元加载的对象。
对象在生命周期中有三种状态:瞬时态(Transient)、持久态(Persistent)、游离态(Detached)
能够使对象进入持久态的方法包括:
save() :由瞬时态变为持久态;
load()或get() :返回的总是持久态对象;
find() :返回List集合,集合中的对象都是处于持久态;
update()、saveOrUpdate()和lock() :将游离态对象转换为持久态对象。
若一个持久态对象与一个瞬时态对象关联,在允许级联保存的情况下,Session会在清理缓存时将瞬时态对象
转换为持久态对象。
将一个对象由持久态转换为游离态方法:
close() :若程序中再没有变量来引用这些游离态对象,则这些对象就会被垃圾回收而结束其生命周期。
evict() :将缓存中的一个持久态对象删除,使其变为游离态。当Session的缓存中保存了大量的持久态对象时,
可调用evict()从中删除一些持久态对象以节省内存空间。
1.常用操作方法
1.1save()方法
完成以下任务:
(1)将对象加入到缓存中,同时标识为Persistent状态;
(2)根据映射文件中的配置信息生成实体对象的唯一标识符;
(3)生成计划执行的insert语句。(事务结束或此操作为后续操作的前提情况下,才会执行insert语
句)
save()方法持久化实体对象的代码:

        User user = new User();//->瞬时态
        user.setName("Tom");
        user.setPassword("123456");
        Session session=sessionFactory.openSession(); //创建Session实例
        Transaction tx = session.beginTransaction();  //开启事务
        session.save(user);//->持久态       
        tx.commit();       //提交事务
        session.close();   //关闭Session
        //->游离态
    如果要对指定了/<generator>/元素的实体对象使用自定义的标识符作为记录的主键值,可利用Session实例中的
    重载方法save(Object object,Serializable id)来实现。
    对处于Persistent状态的实体对象,在此调用save()方法是没有意义的。

1.2update()方法
Session实例的update()方法主要完成以下任务:
(1)将user对象加入到缓存中,并标识为Persistent状态;
(2)生成计划执行的update语句。
update()方法更新数据库中记录的方法代码:

        User user = new User();//->瞬时态
        user.setName("Tom");
        user.setPassword("123456");
        user.setId("1");    //**必须设置主键**
        Session session=sessionFactory.openSession(); //创建Session实例
        Transaction tx = session.beginTransaction();  //开启事务
        session.update(user);//->持久态       
        tx.commit();       //提交事务
        session.close();   //关闭Session
        //->游离态

1.3saveOrUpdate()方法
当传入Transient状态实体对象时,执行save()操作;当传入Detached状态实体对象时,执行update()操作;
传入Persistent状态实体对象时,直接返回,不进行任何操作。
当用户的id属性为空时,执行save()操作,此时user对象被当作是瞬时态的;当从数据库获取的user对象的id
属性不为空时,执行update()操作。

     String hql="select new User(user name,user age)from User user";//定义HQL语句
     Query query = session.createQuery(hql);//创建Query对象
     List users = query.list();//返回结果集
     //遍历结果集
     for(int i=0;i<users.length();i++){
         User user = (User) users.get(i);
         user.setName("Jack");
         session.saveOrUpdate(user);//id为null,执行save()
      }
      String hql = "from User user";
      Query query = session.createQuery(hql);//创建Query对象
      List users = query.list();//返回结果集
      //遍历结果集
      for(int i=0;i<users.length();i++){
         User user = (User) users.get(i);
         user.setName("Jack");
         session.saveOrUpdate(user);//id不为null,执行update()
       }

1.4delete()方法
主要完成以下任务:
(1)若传入的实体对象不是Persistent状态,则将需要删除的对象与Session实例相关联,使其转变为
Persistent状态;
(2)生成计划执行的delete语句;
delete()方法删除实体对象的过程代码:

     User user = new User();
     user.setId("1");//必须设置主键
     Session session = sessionFactory.openSession();
     Transaction tx = session.beginTransaction();
     session.delete(user);
     tx.commit();
     session.close();
 执行删除操作时,应注意执行顺序,尤其是有外键关联情况下,要避免删除父对象而忘记删除子对象情况,否则会引发约
 束冲突。

1.5get()方法
通过标识符得到指定类的持久化对象。如果对象不存在则返回空。

     Session session = sessionFactory.getCurrentSession();//创建Session实例
     Transaction tx = session.beginTransaction();
     User user = (User)session.get(User.class,"1");//获取id为"1"的持久化对象
     System.out.println(user.getId());
     tx.commit();
     session.close();

1.6load()方法
与get()方法一样,都是通过标识符得到指定类的持久化对象。但要求持久化对象一定存在,否则产生异
常。

     Session session = sessionFactory.getCurrentSession();//创建Session实例
     Transaction tx = session.beginTransaction();
     User user = (User)session.load(User.class,"1");//获取id为"1"的持久化对象
     System.out.println(user.getId());
     tx.commit();
     session.close();
 get()和load()主要区别:
 (1)查找记录不存在时,get()返回null,load()抛出异常;
 (2)get()直接返回实体类,load()可以返回实体的代理类实例(当xxx.hbm.xml中的<class>元素的lazy属性值为
     true时)
 (3)load()和get()都是先从Session内部缓存中查找实体对象,如果没找到,load()会查询Hibernate的二级缓存
     (get()会越过二级缓存),若还未找到则发送一条SQL语句到数据库中查询,根据查询结果生成相应的实体对象。

1.7contains()方法
判断一个实体对象是否与当前的Session对象相关联,也可判断是否处于Persistent状态。
1.8evict()方法
通过移除缓存中实体对象与Session实例之间的关联关系来清除指定的对象,执行evict()后,实体对象由
Persistent状态转变为Detached状态。

     if(session.contains(user))
         session.evict(user);

1.9clear()方法
清空session的缓存。

下面介绍的几种Sessionf方法分别创建了Query、Criteria以及SQLQuery查询接口的实例,再通过这些实例来获
取持久化对象。
1.10createQuery()方法
建立Query查询接口实例,该实例可以使用HQL语言进行数据库查询操作。

      Session session = sessionFactory.getCurrentSession();//创建Session实例
      Transaction tx = session.beginTransaction();
      Query query = session.createQuery("from User");//创建Query实例
      List list = query.list();
      tx.commit();
      session.close();

1.11createCriteria()方法
建立Criteria查询接口实例,可通过设置条件来执行数据库查询操作。

      Session session = sessionFactory.getCurrentSession();//创建Session实例
      Transaction tx = session.beginTransaction();
      Criteria crit = session.createCriteria(User.class);//创建Criteria实例
      crit.setMaxResults(50);
      List users = crit.list();
      tx.commit();
      session.close();

1.12createSQLQuery()方法
建立SQLQuery查询接口实例。查询接口通过标准SQL语句执行数据查询操作。

       Session session = sessionFactory.getCurrentSession();//创建Session实例
       List users = session.createSQLQuery("select {user.*} from User {user}",
                                           "user",User.class).list();
       session.close();

1.13createFilter()方法
用于一个持久化集合或数组的特殊查询。查询字符串中可以使用this关键字引用集合中当前元素。

     //查询班级team中成绩高于80分的学生集合。
      Collection StudentScore = session.createFilter(team.getStudents(),("where 
                     this.score>?").setParameter(1,new Integer(80)).list());

四、Transaction接口
事务提交:
事务回滚:
事务隔离和隔离级别关系表:
事务隔离和隔离级别关系表
配置文件中可对隔离级别进行设置:

     <property name="hibernate.connection.isolation">4</property>

五、Query接口
接口在使用HQL语句对数据库进行操作时,主要包括以下三个步骤:
(1)创建Query实例。Query query=session.createQuery(hql)
(2)设置动态参数。setter方法
(3)执行查询语句,返回查询结果。既可以返回List类型的结果,也可返回唯一的对象。
1.常用Query操作方法
1.1setter方法
设置参数时,既可以根据参数名称来设置,也可根据参数位置来设置。

      Session session = sessionFactory.openSession();//创建Session实例
      Query query = session.createQuery("from user where age>**:userAge**");
      query.setInteger("userAge",25);   //根据名称设置
      List users = query.list();
      //
      Query query = session.createQuery("from user where age>**?**");
      query.setInteger(0,25);   //根据位置设置
      List users = query.list();
      session.close();

1.2list()方法
执行查询语句,以List类型返回。Hibernaet会将所有结果集中数据转换成Java实体对象。
1.3iterator()方法
执行查询语句返回Iterator对象。读取时只能按顺序方式读取(不知道结果集中记录的数目),仅把使用到的
数据转换成Java实体对象。

     Session session = sessionFactory.openSession();//创建Session实例
     Query query = session.createQuery("from user");
     Iterator iter = query.iterator();
     //遍历结果集
     while(iter.hasNext()){
         ...
      }
     session.close(); 

1.4uniqueResult()方法
返回唯一结果,可将返回结果直接转换成相应的对象。

     Session session = sessionFactory.openSession();//创建Session实例
     Query query = session.createQuery("from User where id="1" ");
     User user = (User)query.uniqueResult();
     session.close();

1.5executeUpdate()方法
可支持HQL语句的更新和删除操作,建议更新时采用。

     Session session = sessionFactory.openSession();//创建Session实例
     Transaction tx = session.beginTransaction();
     Query query = session.createQuery("update User set password='123' ");
     query.executeUpdate();
     tx.commit();
     session.close();

1.6setFirstResult()方法
设置所获取的第一个记录的位置,从0(第1个)开始计算.
1.7setMaxResults()方法
设置结果集的最大记录数,实现分页功能时非常有用。

     Session session = sessionFactory.openSession();//创建Session实例
     Transaction tx = session.beginTransaction();
     Query query = session.createQuery("from User");
     int currentPage = xxx;//当前页数,第1页开始计算
     int pageSize = xx;//每页记录数
     query.setFirstResult((currentPage-1)*pageSize);
     query.setMaxResults(pageSize);
     List users = query.list();
     tx.commit();
     session.close();

2.1实体查询
2.2属性查询
2.3实体的更新和删除
2.4HQL的聚集函数
2.5分组和排序
2.6子查询
六、Criteria接口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值