- ORM和Hibernate
- ORM和Hibernate的关系
- Hibernate的基本映射思想
- Hibernate入门知识
- Hibernate的体系结构
ORM和Hibernate
1、对象/关系数据库映射(ORM)
ORM的全称是Object/Relation Mapping,对象/关系数据库映射。为了能以面向对象的方式操作持久化对象,ORM框架的作用就是把对持久化对象的保存、删除、修改等操作,转化成对数据库的操作。
2、基本映射方式
数据表映射类、数据表的行映射对象、数据表的列映射对象的属性。
3、流行的ORM框架简介
JPA:JPA本身只是一种ORM规范,并不是ORM产品。
Hibernate:Hibernate灵巧的设计、优秀的性能、丰富的文档,成为目前最流行的开源ORM框架。
iBATIS:Apache软件基金会组织的子项目,一种SQL Mapping框架。iBATIS更加灵活,它允许开发人员直接编写SQL语句。
TopLink:Oracle公司的产品:
4、Hibernate概述
Hibernate不仅仅管理Java类到数据库表的映射,还提供数据查询和获取数据的方法,可以大幅度减少人工使用SQL和JDBC处理数据的时间。Hibernate与其他ORM框架相比具有以下优势:开源和免费的License、轻量级封装、可扩展性。
使用Hibernate,程序无须理会底层采用何种数据库,这一切对程序完全透明,应用程序只需要创建、修改、删除持久化对象即可。
Hibernate优点:不再需要编写SQL语句,而是采用OO方式来访问数据库。封装了JDBC的大量的checked异常,被包装成Hibernate的Runtime异常,不再要求程序必须处理所有异常。
Hibernate入门
1、Hibernate下载和安装
2、Hibernate的数据库操作
PO:Persistent Object,持久化对象。
POJO:
Plain Ordinary Java Object 普通、传统java对象。 Plain,平的,简单的,朴素的,清晰的。 Ordinary,普通的,平凡的。
PO = POJO+映射文件
使用Hibernate进行持久化操作,需要进行如下步骤:
开发持久化类,由POJO加映射文件组成;配置hibernate.cfg.xml。
获取Configuration。 Configuration conf = new Configuration().config();
获取SessionFactory。 conf.buildSessionFactory();
获取Session,打开事务。 sf.openSession(); session.beginTransaction();
用面向对象的方式操作数据库。session.save(news);
关闭事务,关闭Session。tx.commit();session.close();sf.close();
定义一个POJO,普通的、简单的Java Bean
package org.crazyit.app.domain;
public class News {
private Integer id;
private String title;
private String content;
//省略以上属性的getter()和setter()方法
}
定义映射文件:New.hbm.xml
<hibernate-mapping default-lazy="false" package="org.crazyit.app.domain">
<class name="News" table="_news">
<id name="id" column="news_id" type="java.lang.Integer">
<generator class="identity"/>
</id>
<property name="title" column="news_title" />
<property name="content" column="news_content"/>
</class>
</hibernate-mapping>
定义hibernate的配置文件:hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">phpwind.net</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">true</property>
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<mapping resource="org/crazyit/app/domain/News.hbm.xml"/>
</session-factory>
</hibernate-configuration>
测试类
public static void main(String[] args) {
Configuration conf = new Configuration().configure();
SessionFactory sf = conf.buildSessionFactory();
Session sess = sf.openSession();
Transaction tx = sess.beginTransaction();
News n = new News();
n.setTitle("title");
n.setContent("context");
sess.save(n);
tx.commit();
sess.close();
sf.close();
}
运行结果:
Hibernate: insert into _news (news_title, news_content) values (?, ?)
如果在配置文件中设置<property name="hbm2ddl.auto">create</property>,则会先删表(表存着的话),在建表,插入数据。
Hibernate: drop table if exists _news
Hibernate: create table _news (news_id integer not null auto_increment, news_title varchar(255), news_content varchar(255), primary key (news_id)) type=InnoDB
Hibernate: insert into _news (news_title, news_content) values (?, ?)
3、Hibernate中PO的三种状态:
随PO与Session的关联关系,PO可有如下三种状态
瞬态:PO实例从未与Session关联过,该PO实例处于瞬态状态。
持久化:PO实例与Session关联起来,且该实例对应到数据库记录,则该PO实例处于持久化状态。
脱管:如果PO实例曾经与Session关联过,但是由于Session的关闭,PO实例脱离了Session的管理,这种状态称为脱管状态。
4、Hibernate需要的jar包:
Hibernate需要的jar包,需要lib\required目录下需要的jar包,如果使用c3p0数据源,需要将optional\c3p0目录下的jar包加进去。还需要加上slf4j-api-1.6.1.jar,以及slf4j-nop-1.6.1.jar(slf4j的实现)
hibernate.hbm2ddl.auto属性为create,每次都会删除表(表存在的话),建新表,插入数据。如果属性值为update的话,表不存在的话,会新建表,存着的话,每次都插入数据,不会删除存着的表。
Hibernate的体系结构
SessionFactory:数据库映射关系经过编译后的内存镜像,是线程安全的。
Session:应用程序与持久层直接交互的单线程对象,它底层封装了JDBC连接,它也是Transaction的工厂。
持久化对象:与Session关联的PO对象,数据库存着相应记录。在程序中对PO对象的修改,会自动转换为对持久层的修改。
瞬态对象和脱管对象:没有与Session关联的对象,为瞬态对象,如通过new关键字创建的PO对象。曾经持久化过的实例,由于session关闭,则转化为脱管对象。
事务Transaction:代表一次原子操作,具有数据库事务的概念。Hibernate事务是对底层具体的JDBC、JTA以及CORBA事务的抽象。
连接提供者(ConnectionProvider):生成JDBC连接的工厂,通过抽象将应用程序与底层的DataSource或DriverManager隔离开。应用中ConnectionProvider通常由DataSource充当,SessionFactory底层封装了ConnectionProvider,所以在实际应用中,SessionFactory底层封装了DataSource。
事务工厂(TransactionFactory):生成Transaction对象实例的工厂。该对象无须应用程序直接访问,负责对底层具体的事务实现进行封装、将底层具体的事务抽象成Hibernate事务。