一、初识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类型的书写方式比较简单
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(); } }
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初始化后,对应的数据表也就生成了
代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,且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.内部执行原理图