随笔 - 416  文章 - 0  评论 - 842  阅读 - 273万

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     }
条件查询
复制代码

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

 

posted on   雨点的名字  阅读(453)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了

点击右上角即可分享
微信分享提示