写在前面
首先你要有eclipse的软件,并且加载有相关hibernate的包,这是前提否则没法学习验证。
有了以上的条件就可以来学习hibernate了。
第一
我们要了解hibernate和JDBC比较有什么不同?我们已经学习了JDBC,它是访问数据库最原始最直接的办法,那么我们为什么还要学Hibernate,以我之见Hibernate直接面向对象,不用再去写SQL,而JDBC无法直接面向对象,重复性工作多,
Hibernate一次编写适用各种不同的数据库。
首先我们要学会建立XML映射文件下面是主配置文件的示例
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库连接URL -->
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<!-- 数据库用户名 -->
<property name="connection.username">hr</property>
<!-- 数据库密码 -->
<property name="connection.password">hr123</property>
<!-- 数据库JDBC驱动类名 -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<!-- 数据库方言 -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- ddl语句自动建表 -->
<property name="hbm2ddl.auto">none</property>
<!-- 是否输出Hibernate生成的SQL语句,开发阶段一般需要开启 -->
<property name="show_sql">true</property>
<!-- 是否对输出SQL进行格式化 -->
<property name="format_sql">true</property>
<!-- 连接池配置 -->
<property name="hibernate.connection.provider_class">
org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider
</property>
<!-- 这是C3P0随时准备好的最少的JDBC连接数量 -->
<property name="hibernate.c3p0.min_size">5</property>
<!-- 连接池中JDBC连接的最大数量 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 超时周期,在它之后,闲置连接将从池中移除 -->
<property name="hibernate.c3p0.timeout">300</property>
<!-- 最多高速缓存100个预编译语句,该属性是使Hibernate获得较好性能的要素。 -->
<property name="hibernate.c3p0.max_statements">100</property>
<!-- 连接被自动验证前,以秒为单位的闲置时间 -->
<property name="hibernate.c3p0.idle_test_period">3000</property>
<!--注册ORM实体类映射文件 -->
<mapping resource="entity/Type.hbm.xml" ></mapping>
<mapping resource="entity/Book.hbm.xml" ></mapping>
<mapping resource="entity/Student.hbm.xml" ></mapping>
<mapping resource="entity/Record.hbm.xml" ></mapping>
</session-factory>
</hibernate-configuration>
主配置文件基本为四部分:
1、 数据库连接信息:驱动程序类名、URL、用户名、密码。
2、 Hibernate相关特性:dialect(方言)、show_SQL(输出SQL语句到控制台)、format_SQL(格式化SQL语句)。
3、 连接池相关信息。
4、 实体类映射文件:实体类与数据库表之间的逻辑映射。
配置文件应放在src下面,然后用下面的代码测试一下。
public class HibernateTest {
public static void main(String[] args) {
//获取配置,默认读取classpath根目录下名为hibernate.cfg.xml的文件
Configuration cfg = new Configuration().configure();
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
//创建SessionFactory
SessionFactory factory = cfg.buildSessionFactory(serviceRegistry);
//获取session
System.out.println(factory.openSession());
}
}
成功后我们就完成了第一步了
第二
首先我们要明白类和表之间的对应关系,类→表;属性→主键;属性→普通字段。Hibernate所直接操作的都是类、属性。我们来配置一下文件以Type为例,附上Type的表
下面是配置文件
<?xml version="1.0"?>
<!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="entity.Type" table="book_type">
<!-- 属性和主键 -->
<id name="id" column="type_id">
<!-- 主键生成策略 -->
<generator class="sequence">
<param name="sequence">lib_seq</param><!--sequence对象的名字 -->
</generator>
</id>
<!-- 属性和字段 -->
<property name="name" column="name"></property>
<property name="desc" column="descp"></property>
<set name="books" >
<key column="type_id"></key>
<one-to-many class="entity.Book"/>
</set>
</class>
</hibernate-mapping>
其中要注意一对多,多对一,联合主键的配置问题
配置完就可以对数据库操作了,分为7个步骤:
1、配置Configuration
2、创建Session工厂
3、打开session
4、开始事务
5、持久化操作(save,update等)
6、提交事务
7、关闭session
不过在写方法的时候一般不要提交事务和关闭session,在事务层实现,操作就行了挂起就行了
第三
Hibernate的核心接口
1、Configuration
Configuration cfg = new Configuration().configure();
用来配置引导文件
2、SessionFactory
3、Session
持久化操作管理器,对对象进行操作,拥有一系列API
4、Transaction
主要定义了commit()和rollback()两个方法,前者是提交事务的方法,后者是回滚事务的方法。
5、Query
a) 查询使用HQL或SQL
b) Query实例可用来绑定查询参数,限定查询返回的结果数,并且最终执行查询
第四
Hibernate中对象的三种状态
瞬时状态(Transient)
刚用new语句创建,还没有被持久化,且不处于Session的缓存中
持久状态(Persistent)
已经被持久化,且加入到Session的缓存中
游离状态(Detached)
已经被持久化,但不再处于Session的缓存中
三种状态的关系