zoukankan      html  css  js  c++  java
  • hibernate框架(2)---Hibernate的核心API

    Hibernate的核心API

    一般我们通过hibernate进行操作的时候,都会遵循下面的流程,那么接下来我对每一个步骤进行讲解:

     1  public void testInsert() {
     2              //(1) 实例化配置对象 加载映射文件 加载 hibernate.cfg.xml
     3              Configuration configuration = new Configuration().configure();
     4              //(2)创建会话工厂
     5              SessionFactory sessionFactory = configuration.buildSessionFactory();
     6              //(3) 创建会话
     7              Session session = sessionFactory.openSession();
     8              //(4) 开启事务
     9              Transaction transaction = session.beginTransaction();
    10   
    11             /*
    12              *编写自己的逻辑代码
    13              */
    14  
    15              // 提交事务
    16              transaction.commit();
    17              session.close();
    18              sessionFactory.close();
    19          } 

      (1) 实例化配置对象 configuration 

       这一步是用来加载核心配置文件

        核心配置有两种:
          hibernate.properties
            加载:Configuration configuration = new Configuration();
          hibernate.cfg.xml:
            加载:Configuration configuration = new Configuration().configure();

     (2)创建会话工厂  sessionFactory 

         Configuration对象根据当前的配置信息生成 SessionFactory对象,

           SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句

         SessionFactory 对象是线程安全的,SessionFactory还负责维护Hibernate的二级缓存,

          SessionFactory对象根据数据库信息,维护连接池,创建Session(相当于Connection)对象

     (3)创建会话 session对象(相当于 JDBC的 Connection)

            Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,是线程不安全的

            所有持久化对象必须在 session 的管理下才可以进行持久化操作,Session 对象有一个一级缓存

            显式执行 flush 之前,所有的持久化操作的数据都缓存在 session 对象处,持久化类与 Session 关联起来后就具有了持久化的能力,

            Session维护了Hiberante一级缓存.

       session对象提供了许多的方法来实现增删改差:

           save()/persist()         :添加
        update()         :修改
        saveOrUpdate()      :增加和修改对象
        delete()          :删除对象
        get()/load()       :根据主键查询
        createQuery()      :创建一个Query接口,编写HQL语句
        createSQLQuery()   :创建一个SQLQuery接口,编写SQL语句数据库操作对象
        createCriteria()     :返回一个Criteria接口.条件查询 

    (4)提取工具类

    因为我们在项目开发中经常需要进行相关增删改查的操作,所以都需要这个session对象,这个时候我们可以把她变成一个工具类

     1 public class HibernateUtils {
     2     
     3     private static Configuration configuration;
     4     
     5     private static SessionFactory sessionFactory;
     6     
     7     static{
     8         configuration=new Configuration().configure();
     9         
    10         sessionFactory=configuration.buildSessionFactory();   
    11     }   
    12     public static Session getSession(){
    13         return sessionFactory.openSession();
    14     } 
    15 }
    16 /*
    17  *通过这个工具类,只要你每次HibernateUtils.getSession
    18  *就可以获得session对象
    19  */

    (5) 开启事务 Transaction 对象

      获得:Transaction tx = session.beginTransaction();

      常用方法:
        commit() :提交相关联的session实例
        rollback() :撤销事务操作
        wasCommitted() :检查事务是否提交

      如果没有开启事务,那么每个Session的操作,都相当于一个独立的事务

    6.Query 对象
      Query代表面向对象的一个Hibernate查询操作
      session.createQuery 接收一个HQL语句
      HQL是Hibernate Query Language缩写, 语法很像SQL语法,但是完全面向对象的

     举例

     //1.查询所有的数据
        public  void testQuery(){
            //这里就是通过足记编写的工具类,来获得session对象
            Session session=HibernateUtils.getSession();
            Transaction transaction =session.beginTransaction();
            
            String hql="from Customer"; //类名
            
            Query  query =session.createQuery(hql);
            
            List<Customer> customers=query.list();
            System.out.println(customers);
            
            transaction.commit();
            session.close();
        }
    }
    查询所有的数据
       //批量插入数据
        public void testBathInsert(){
            Session session=HibernateUtils.getSession();
            Transaction transaction =session.beginTransaction();
            
            for(int i=0;i<1000;i++){
                Customer customer =new Customer();
                customer.setName("小明_"+i);
                customer.setAddr("余杭区_"+i);
                customer.setCity("杭州_"+i);
                customer.setAge(i);
                session.save(customer);
            }     
            transaction.commit();
            session.close();
          
    批量插入数据
     1 //分页查询
     2     public void testQueryByPage(){
     3         Session session=HibernateUtils.getSession();
     4         Transaction transaction =session.beginTransaction();
     5         
     6         //查询所有数据
     7         String hql=" from Customer";
     8         Query query =session.createQuery(hql);
     9         
    10         //设置查询条件 
    11         query.setFirstResult(20);//设置开始查询的位置
    12         query.setMaxResults(20);//要查询的长度
    13         
    14         List<Customer> customers =query.list();
    15         System.out.println(customers);
    16         
    17         
    18         transaction.commit();
    19         session.close();
    20     }
    分页查询
     1 //通过select关键字 查询指定的属性和对应的列
     2     public void testQuerySelect(){
     3         Session session=HibernateUtils.getSession();
     4         Transaction transaction =session.beginTransaction();
     5         //这里既然是new Customer(name,age),那么就需要通过这样的构造函数
     6         String hql="select new Customer(name,age) from Customer";
     7         
     8         Query query =session.createQuery(hql);
     9         
    10         List<Customer> customers =query.list();
    11         System.out.println(customers);
    12         
    13         transaction.commit();
    14         session.close();
    15     }
    选择特定的列
     1 //通过where条件
     2     public void testQueryParamter(){
     3         Session session=HibernateUtils.getSession();
     4         Transaction transaction =session.beginTransaction();
     5         
     6         String hql="from Customer where name=? and age=?";
     7         
     8         Query query =session.createQuery(hql);
     9         query.setParameter(0, "小明_4");
    10         query.setParameter(1, 4);
    11         
    12         List<Customer> customers =query.list();
    13         System.out.println(customers);
    14            
    15         transaction.commit();
    16         session.close();
    17     }
    where条件查询

    7.Criteria(条件查询接口)

    可以实现和Query一样的效果

    举例

     1   // 查询所有
     2     public void testQueryAll() {
     3 
     4         // 获取Session对象
     5         Session session = HibernateUtils.getSession();
     6         //开启事务
     7         Transaction transaction =session.beginTransaction();
     8         //
     9         Criteria criteria =session.createCriteria(Customer.class);
    10         
    11         List<Customer> customers =criteria.list();
    12         System.out.println(customers);
    13         
    14         transaction.commit();
    15         session.close();
    16     }
    查询所有 
     1    //分页查询
     2     public void testQueryByPage(){
     3         // 获取Session对象
     4         Session session = HibernateUtils.getSession();
     5         //开启事务
     6         Transaction transaction =session.beginTransaction();
     7         
     8         Criteria criteria =session.createCriteria(Customer.class);
     9         criteria.setFirstResult(30);
    10         criteria.setMaxResults(20);
    11         
    12         List<Customer> customers =criteria.list();
    13         System.out.println(customers);
    14          
    15         transaction.commit();
    16         session.close();
    分页查询
     1 //条件查询
     2     public void testQueryByCondition(){
     3      // 获取Session对象
     4         Session session = HibernateUtils.getSession();
     5         //开启事务
     6         Transaction transaction =session.beginTransaction();
     7         Criteria criteria =session.createCriteria(Customer.class);
     8         
     9         //创建条件对象
    10         Criterion  criterion =Restrictions.eq("name", "小明_4");
    11         
    12         //把查询条件对象加载到查询对象
    13         criteria.add(criterion);
    14         
    15         List<Customer> customers =criteria.list();
    16         System.out.println(customers);
    17          
    18         transaction.commit();
    19         session.close();
    20     }
    条件查询

    这篇文字就讲到这了,欢迎大家多多指点,谢谢!

  • 相关阅读:
    记一道乘法&加法线段树(模版题)
    2021CCPC网络赛(重赛)题解
    Codeforces Round #747 (Div. 2)题解
    F. Mattress Run 题解
    Codeforces Round #744 (Div. 3) G题题解
    AtCoder Beginner Contest 220部分题(G,H)题解
    Educational Codeforces Round 114 (Rated for Div. 2)题解
    Codeforces Global Round 16题解
    Educational Codeforces Round 113 (Rated for Div. 2)题解
    AtCoder Beginner Contest 182 F
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/6483829.html
Copyright © 2011-2022 走看看