Hibernate入门教程(二)

讲师:钟昕灵,叩丁狼教育高级讲师。原创文章,转载请注明出处。

在上一节中,我们使用Hibernate实现了基本的CRUD操作,可以看出整个过程还是比较简单的,但是我们还是需要去分析一下其执行的流程,达到灵活使用的目的.

执行流程分析

save方法的执行流程:

首先,回顾一下保存操作实现的代码:

public void save(User u) {
        // 创建hibernate的配置对象
        Configuration conf = new Configuration();
        // 加载hibernate的配置文件
        conf.configure("/hibernate.cfg.xml");
        // 创建SessionFactory对象:可理解为一个连接池对象
        SessionFactory factory = conf.buildSessionFactory();
        // 创建Session对象:可理解为一个连接对象
        Session session = factory.openSession();
        // 获取事务管理对象
        Transaction transaction = session.getTransaction();
        // 开启事务
        transaction.begin();
        // 调用session的save方法完成数据的保存操作
        session.save(u);
        // 提交事务
        transaction.commit();
        // 释放资源
        session.close();
    }
执行流程分析:
  1. 创建Configuration对象,加载Hibernate.cfg.xml和Xxx.hbm.xml文件
  2. 通过加载的配置文件中的信息,创建SessionFactory对象,该对象相当于一个连接池(DataSource)对象
  3. 从SessionFactory工厂中获取Session对象,该对象相当于一个连接(Connection)对象
  4. 获取事务,并开启事务,将增删改的操作放在一个事务空间中
  5. 调用save方法,将需要保存的数据传入该方法
    1. Hibernate需要为我们拼接出保存的SQL语句:
      insert into user (username, password, age, hiredate) values (?, ?, ?, ?)
    2. 使用反射,获取到传入user对象的类型名称(User),然后将名称首字母小写(user),作为SQL中需要的表名
    3. 使用内省机制,获取到对象中的属性名称(uusername,upassword,uage,uhiredate),以及各个属性对应的属性值(“admin”,”12345”,10,”2017-01-01”),并根据映射文件中配置的属性和列的映射关系,找到每个属性对应的列名(username, password, age, hiredate),拼接到SQL中
    4. 得到以上数据后,Hibernate就能够为我们拼接出执行保存操作时需要的SQL语句了
    5. 创建PreparedStatement对象,将获取到的属性值设置给预编译语句对象
    6. 提交SQL到数据库中,进行预编译的处理
  6. 提交事务,在数据库中执行保存的sql,将数据保存到数据库中
    7.释放资源

save方法的执行流程分析

通过以上我们对保存的执行流程的分析得知,Hibernate要自动的为我们生成对应的sql语句,映射文件的作用也就显现出来了,我们可以通过映射中的配置,可以获取到当前类对应的表名, 当前类中属性对应的列名,在使用内省机制,可以获取到对应的属性名,最后生成sql,执行sql

get方法的执行流程

接下来,我们在使用相同的方式来分析一下get方法的执行流程
代码如下:

@Override
    public User get(long id) {
        // 创建hibernate的配置对象
        Configuration conf = new Configuration();
        // 加载hibernate的配置文件
        conf.configure("/hibernate.cfg.xml");
        // 创建SessionFactory对象:可理解为一个连接池对象
        SessionFactory factory = conf.buildSessionFactory();
        // 创建Session对象:可理解为一个连接对象
        Session session = factory.openSession();
        // 调用session的delete方法完成数据的删除操作
        User user = session.get(User.class, id);
        // 释放资源
        session.close();
        return user;
    }
执行流程分析:

session.delete(u);

  1. 调用get方法前后的步骤和上面基本一致(查询不需要放在事务中),这里不再赘述
  2. 调用get方法执行查询单条数据的操作
    1. Hibernate为我们生成的SQL:
      select
          user0.id as id1_0_0, user0.username as username2_0_0, user0.password as password3_0_0, user0.age as age4_0_0, user0.hiredate as hiredate5_0_0
      from
          user user0
      where
          user0
      .id=?
    2. sql中需要的列名和表名和上面的获取方式一样
    3. Hibernate的get方法是针对根据主键查询设计的查询操作,所以在sql需要拼接主键相关的条件
    4. 在映射文件中可以获取到该表的主键列名和属性名,到这里sql拼接就完成了(Hibernate为每个列生成了别名, 这里不需要太过在意)
    5. 根据内省机制获取到主键属性的值,设置给sql,并执行sql
      get方法的执行流程分析

到此,我们通过分析save和get方法的执行流程,希望可以通过这一节能够帮助大家对Hibernate中的常用持久化方法的执行流程及原理的理解更加的深刻

小结

Hibernate是面向对象的持久层框架, 为开发人员屏蔽关系型数据库中的细节操作,所以,需要执行的sql语句都是自动生成的, 那么在生成sql的时候, 需要我们开发人员通过配置的方式告知必需的数据,如:表名,列名,执行sql需要的参数等等,一旦了解到这一点之后, 我们会对在使用Hibernate的过程中做的各种配置就会有更加深刻的理解.


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值