一、初识Hibernate
1.JDBC的缺点:
1).编写代码的时候过于繁琐,try和catch比较多2).没有做数据缓存 3).不是面向对象编程 4).sql语句固定,可移植性差
JDBC的优点:效率比较高
2.Hibernate优点
1).完全面向对象编程 2).hibernate的缓存很牛的,一级缓存,二级缓存,查询缓存3).跨平台性强
4).使用场合多应用于企业内部的系统
Hibernate缺点1).效率低 2).表中的数据如果在千万级别,则hibernate不适合 3).如果表与表之间的关系特别复杂,则hibernate也不适合
3.ORM
学习Hibernate,首先要先了解ORM(Object/Relation Mapping),对象关系映射,主要思想是:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作
4.Hibernate开发步骤图
二、Hibernate的配置文件
1.hibernate.cfg.xml与xxx.hbm .xml的书写告诉hibernate连接数据库的信息,用的什么样的数据库(方言),根据
持久化类和映射文件生成表的策略
<hibernate-configuration>
<session-factory name="foo">
<property name="hibernate.dialect"><![CDATA[org.hibernate.dialect.MySQLDialect]]></property>
<property name="hibernate.connection.driver_class"><![CDATA[com.mysql.jdbc.Driver]]></property>
<property name="hibernate.connection.url"><![CDATA[jdbc:mysql:///hibernate1]]></property>
<property name="hibernate.connection.username"><![CDATA[root]]></property>
<property name="hibernate.connection.password"><![CDATA[root]]></property>
<!-- 是否显示sql语句 -->
<property name="show_sql">true</property>
<!--是否格式化sql语句-->
<property name="format_sql">true</property>
<!--生成表的策略,通常是update-->
<property name="hbm2ddl.auto">update</property>
<!--添加映射文件-->
<mapping resource="cn/xxx/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
<hibernate-mapping package="cn.cil.domain">
<class name="User" table="USERS" >
<!--id 主键,column是数据表中对应的列名 -->
<id name="id" type="java.lang.Integer">
<column name="u_id"/>
<generator class="native"/><!-- 主键的增长策略 -->
</id>
<!--type:该属性对应的类型,该类型可分为Hibernate类型与java类型-->
<property name="name" type="java.lang.String">
<column name="NAME"/>
</property>
<!--hibernate类型为type="string"-->
<property name="age" type="java.lang.Integer">
<column name="AGE"/>
</property>
</class>
</hibernate-mapping>
在hibernate内部,有一张类型对应表,这张表中有如下的映射关系:
故书写Java类型的方式效率比较高,hibernate类型的书写方式比较简单
2.hibernate.cfg.xml的加载
public class HibernateUtils {
private static SessionFactory factory;
static{
factory = new Configuration()//
//这种方式需要注意,hibernate的配置文件名必须是hibernate.hbm.xml,
//且必须放classpath目录下
.configure()//
.buildSessionFactory();
//new Configuration().configure(xxx)可以指定配置文件的路径,配置文件可以随意放
}
public static SessionFactory getSessionFactory(){
return factory;
}
public static Session openSession(){
return factory.openSession();
}
}
3、SessionFactory接口
1).hibernate中的配置文件、映射文件、持久化类的信息都在sessionFactory中
2).sessionFactory中存放的信息都是共享的信息
3).sessionFactory是线程安全的
4).一个hibernate框架sessionFactory只有一个
5).sessionFactory是一个重量级别的类,很消耗资源
4、Session接口
1).得到了一个session,相当于打开了一次数据库的连接
2).在hibernate中,对数据的crud操作都是由session来完成的
5、生成数据表
public class SessionfatoryTest {
@Before
public void init(){
SessionFactory factory = HibernateUtils.getSessionFactory();
}
@Test
public void test(){
}
}
sessionFactory初始化后,对应的数据表也就生成了
6、Transaction(事务)
代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,且hibernate中的事务默认不是自动提交的
设置了connection的setAutoCommit为false, 只有产生了连接,才能进行事务的操作。所以只有有了session以后,才能有transaction
public class SessionfatoryTest {
SessionFactory factory;
Session session ;
Transaction transaction;
@Before
public void init(){
factory = HibernateUtils.getSessionFactory();
session = factory.openSession();
transaction = session.beginTransaction();
}
@Test
public void test(){
User user = new User();
user.setAge(10);
user.setName("A");
session.save(user);
}
@After
public void destory(){
transaction.commit();
session.close();
}
}
7、Hibernate的执行流程
8.内部执行原理图