这几天对Hibernate的学习,我有了自己的一些认识,所以写下了我的理解,有不足之处还请多多指点!!!
Hibernate的优势
首先我们先了解一下Hibernate的优势。与JDBC相比,JDBC明显有很多缺点,无法直接面向对象;开发效率低;代码冗余 ;pstmt的setXX方法 ;方法参数冗余的getXX方法 ;如果POJO的属性很多,代码增加 ;重复性工作多。 而Hibernate 却很大程度上有了改进:
1. Hibernate是 一个开发源代码的对象关系映射框架 ;
2.对JDBC进行了非常轻量级的对象封装,简化了JDBC 繁琐的编码 ;
3.将JavaBean对象和数据库的表建立对应关系 。
Hibernate的工作原理:
1.读取并解析配置文件
2.创建SessionFactory
3.打开Session
4.开始一个事物
5.持久化操作
6.提交事务
7.关闭Session
持久化和ORM
持久化:数据模型(内存)《--》存储模型(持久化设备),在Java中说持久化,通常指的是使用SQL将数据存储在关系型数据库中。
<?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:XE</property>
<!-- 数据库用户名 -->
<property name="connection.username">oa</property>
<!-- 数据库密码 -->
<property name="connection.password">oa123</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="实体类映射文件路径" />
…
</session-factory>
</hibernate-configuration>
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());
}
}
1.创建实体类
2.创建和配置映射文件
代码示例:
<?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="org.ijob.bean.Seeker" table="ijob_seeker">
<!-- 主键映射 -->
<id name="id" type="string">
<column name="id" length="32"></column>
<generator class="uuid" />
</id>
<!—属性映射 -->
<property name="email" type="string">
<column name="email" length="100"></column>
</property>
<property name="password" type="string">
<column name="password" length="20"></column>
</property>
<property name="name" type="string">
<column name="name" length="10"></column>
</property>
<!—此处省略系列属性映射 -->
</class>
</hibernate-mapping>
3.主键映射
4.主键生成策略
5.在主配置文件中添加实体映射文件路径
6.数据库操作
7.单表增删改查
代码示例:
// 1、获取配置
Configuration cfg = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(cfg.getProperties()).buildServiceRegistry();
// 2、创建SessionFactory
SessionFactory factory = cfg.buildSessionFactory(serviceRegistry);
// 3、获取session
Session session = factory.openSession();
Transaction tx = session.getTransaction();
try {
// 4、开启事务
tx.begin();
Seeker seeker = new Seeker();
seeker.setEmail("abc@163.com");
seeker.setPassword("abc");
// 5、保存seeker对象
session.save(seeker);
// 6、提交事务
session.getTransaction().commit();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
} finally {
// 7、关闭session
session.close();
}
}
<hibernate-mapping>
<class name="org.ijob.bean.Resume" table="ijob_resume">
<!—省略主键映射及属性映射 -->
<!-- 多对一关联 -->
<many-to-one name="seeker" class="org.ijob.bean.Seeker"> 1
<column name="seeker_id"></column> 2
</many-to-one>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="org.ijob.bean.Seeker" table="ijob_seeker">
<!—省略主键映射及属性映射 -->
<set name="resumes" > 1
<key column="seeker_id"></key> 2
<one-to-many class="org.ijob.bean.Resume"/> 3
</set>
</class>
</hibernate-mapping>
<composite-id>
<!--同时表达这是外键-->
<key-many-to-one name=“**” column=“***" class=“***" ></key-many-to-one>
<key-many-to-one name=“**” column=“**" class=“**" ></key-many-to-one>
</composite-id>