Hibernate入门应用(一)

1、Hibernate概念

  

 Hibernate 是基于javaEE平台的一种开放源代码的ORM框架技术。

   是对JDBC的封装,向业务层提供了更加面向对象的API,而操作的对象

是域模型对象(POJO)。Hibernate 要求对javabean提供一个不带参数的构造方法

2、hibernate的体系架构图

       应用层 ------> 【  Hibernate API (JDBC 、JTA 、JNDI)】 --------->数据层

Hibernate入门应用(一)_第1张图片

3、Hibernate 的核心API(5个)

     

      Configuration 接口:用于Hibernate配置,在Hibernate启动的时候读取配置文件,创建一个SessionFactory对象。

      SessionFactory 接口:用来产生Session对象,一个SessionFactory对象代表一个数据库连接。他是线程安全的,他所拥有的信息(二级缓存,不是必须的)被客户用户所共享。

      Session 接口:用于对数据进行持久化操作。相当于持久化对象在内存中的一个缓冲区(一级缓存,必须的)。他是线程不安全的,hibernate会自动检测缓冲区中持久化对象的是否已经被改变并及时进行刷新,以保证数据的同步性。

      Transaction 接口:是Hibernate API通过操作底层事务(如:JDBC事务管理、JTA)来达到管理事务的目的。

      Query/Criteria 接口:提供对数据的查询方法。

  

  五个接口之间的关系是:

Configuration   ------> SessionFactory  -------> Session   -------->【Transaction、Query /  Criteria】



4、简单案例

hibernate.cfg.xml配置
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <!-- 配置数据库方言 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- 配置是否显示sql语言 -->
        <property name="show_sql">true</property>
        <!-- 自动生成表 -->
        <property name="hbm2ddl.auto">update</property>
        <!-- 引入映射文件 -->
        <mapping resource="com/liusheng/models/Person.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
模型类对象关系映射文件Person.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
   <class name = "com.liusheng.models.Person" table="person">
       <id name = "id" column = "id" type="int">
           <!-- 主键生成方式,由hibernate 生成主键,id元素为必须的 -->
           <generator class="increment"></generator>
       </id>
       <property name="name" column = "name" type = "string"></property>
       <property name="pass" column = "pass" type = "string"></property>
       <property name="birthday" column = "birthday" type = "date"></property>
   </class>
</hibernate-mapping>
关键代码:
//构建配置对象,加载配置文件信息
 Configuration cfg = new Configuration().configure();
//创建SessionFactory对象
SessionFactory factory = cfg.buildSessionFactory();
//获取数据操作对象session
Session session = factory.openSession();
//获得事务对象
Transaction tx = session.beginTransaction();
//利用session对象进行数据查询(利用OID进行查询)
Object o1 = session.get(Person.class,new Integer(1));
Object o2 = session.load(Person.class,new Integer(2));
//利用HQL进行数据查询
Query query = session.createQuery(“from Person”);
List list = query.list();
Iterate iterate = query.iterate();


5、方法比较


session.get()

   他首先会查询一级缓存,没有的话二级缓存,最后再查询数据库。

   如果没有就返回null,是一种立即加载。

session.load()

   他首先查询一级缓存,如果没有创建一个代理对象。在实际使用的时候没有就再去

查询二级缓存,最后再查询数据。再没有就会抛出异常。load()方法认为要查询的

对象一定存在,所以使用了代理对象来达到延迟加载的目的。

query.list()

首先查询一级缓存,没有的话二级缓存,最后再查询数据库。

他返回的是完整数据对象的集合,没有就返回null.立即加载。

产生的sql:select * from person;

query.iterate()

首先查询一级缓存,没有的话二级缓存,最后再查询数据库。

他返回的是数据对象的OID集合,当真正使用的时候,他在

针对每一个对象进行数据查询此时返回的才是完整的数据对象。

都没有就返回null,是一种延迟加载。

产生的sql:

  首次返回OID集合 select id from person;

  真正使用时在查询每个对象select p.id,p.name from person p where id = 1;

通过上面的比较发现:

   使用了get()与list()会立即返回完整对象,所以当session关闭后可以直接使用

   而load()与iterate()则分别通过生成代理对象与返回OID对象集合的方式达到延迟

   加载的目的。当session关闭后再去使用这些对象,由于他们这时才会真的去查询出完整

   对象,所以就会抛出session关闭的异常。再有使用了iterate将会产生多条sql,进行

   影响性能.


你可能感兴趣的:(Hibernate,orm)