Hibernate (一)
概念和配置
Hibernate
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
ORM
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
映射文件:类名.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入约束 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 配置类和表的映射 -->
<!--class标签: name:类的全限定名,table:表名(若类名和表名一样的话,table属性可以省略不写)-->
<class name="domain.Customer" table="cst_customer">
<!-- 配置属性和主键的映射 -->
<!--id标签: name:配置OID属性,column:主键列名 字段名(若列名和属性名一样的话,column可以省略)-->
<id name="cust_id" column="cust_id">
<!-- 主键的生成策略 -->
<generator class="native"></generator>
</id>
<!-- 配置属性和其他字段映射 -->
<!-- property name:配置OID属性 ,column:字段名(若列名和属性名一样的话,column可以省略)-->
<property name="cust_name"></property>
<property name="cust_source" column="cust_source"></property>
.....
</class>
</hibernate-mapping>
核心配置文件:hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!-- 导入约束 -->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库连接4个参数 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- hiberante属性 -->
<!-- 是否显示sql -->
<property name="hibernate.show_sql">true</property>
<!-- 是否格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- 方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 是否由hibernate来生成表ddl语句及如何生成-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置C3P0连接池 -->
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<mapping resource="domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
编写测试类:
public void t(){
//a.加载核心配置文件
Configuration config = new Configuration().configure();
//b.创建SessionFactory(类似于 连接池)
SessionFactory factory = config.buildSessionFactory();
//c.获取Session(类似于 conn)
Session session = factory.openSession();
//d.开启事务
Transaction tx = session.beginTransaction();
//e. 操作
Customer c = new Customer();
c.setCust_name("麦克雷");
session.save(c);
//f.提交事务
tx.commit();
//g.释放资源
session.close();
}
Hibernate核心类
Configuration
Configuration 类负责管理hibernate的配置信息。它包括如下内容:
Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。
Hibernate映射文件(*.hbm.xml)。
Hibernate配置的两种方法:
属性文件(hibernate.properties)。
调用代码:Configurationcfg = new Configuration();
Xml文件(hibernate.cfg.xml)。
调用代码:Configurationcfg = new Configuration().configure();
SessionFactory
应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂——例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。
会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。
调用代码:
SessionFactorysessionFactory = cfg.buildSessionFactory();
说明:SessionFactory由Configuration对象创建,所以每个Hibernate配置文件,实际上是SessionFactory的配置
作用: 1.获取Session: openSession() 2.初始化hibernate环境. 3.底层维护了一个连接池.
注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够。
抽取一个工具类:HibernateUtils提供一个方法 :获取连接,将sessionFactory设为static。
public class HibernateUtils { private static Configuration config; private static SessionFactory factory; static { config = new Configuration().configure(); factory = config.buildSessionFactory(); } public static Session openSession(){ return factory.openSession(); } }
Session
Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。
Session也称为持久化管理器,因为它是与持久化有关的操作接口。
Session通过SessionFactory打开,在所有的工作完成后,需要关闭。
它与Web层的HttpSession没有任何关系。
调用代码
Session session= sessionFactory.openSession();
Session作用:
1.开启事务
beginTransaction();
2.和数据库交互
Serializable save(Obejct obj);保存,返回值为id
update(Object obj):修改 先查询再操作
delete(Object obj):删除 先查询再操作
OID查询
T get(Class clazz,Serializable id):根据id返回一个对象
T load(Class clazz,Serializable id):根据id返回一个对象
区别:
get查询的时候会立即发送sql语句,返回的对象本身
load查询的时候不会立即发送sql语句,当使用该对象的非oid属性的时候才会发送.返回的代理对象(懒(lazy)加载,延迟加载)
Transaction(事务)
它将应用代码从底层的事务实现中抽象出来——这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)——允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。
调用代码:
Transaction tx =session.beginTransaction();
使用Hibernate进行操作时必须显式的调用Transaction(默认:autoCommit=false)。
控制事务 : commit(); rollback();