Hibernate运行原理
Hibernate是一个开放源代码的对象关系映射框架,她对JDBC进行了非常轻量级的对象封装,使得java程序员可以随心所欲的使用对象编程思维来操纵数据库,hibernate可以应用在任何使用JDBC的场合,既可以在java的客户端程序使用,也可以在Servlet/jsp中的Web应用中使用。最具革命意义的是,hibernate可以在应用的EJB的j2ee架构中取代cmp,完成数据持久化的重任。下面通过一张图来分析Hibernate的运行原理:
上面的执行过程图已经很清晰的阐释了hibernate的运行过程:首先,应用程序先调用Configration类,该类读取hibernate的配置文件及映射文件中的信息(如果我们使用注解的话则不需要读取映射文件),并使用这些信息生成一个SessionFactory对象。接着,从SessionFacctory生成一个Session对象,并用Session对象生成Transaction对象。通过Session对象的get()、sava()、update()、delete()和saveOrupdate()等方法对PO进行加载,保存,更新,删除等操作;在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作。如果没有异常,Transaction对象将提交这些操作结果到数据库中,否则会回滚事务。
Hibernate基本配置
hibernate.cfg.xml配置文件:
<span style="font-size:14px;"><!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 设置数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 设置数据库URL -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
<!-- 数据库用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库密码 -->
<property name="hibernate.connection.password">123456</property>
<!-- 指定对应数据库的方言,hibernate为了更好适配各种关系数据库,针对每种数据库都指定了一个方言dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 打印sql语句,方便调试 -->
<property name="show_sql">true</property>
<!-- 格式化sql语句,排版 -->
<property name="foramt_sql">true</property>
<!-- 指定hibernate生成数据库表的方式:create每次创建新表,update使用原表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 使用session.getCurrentSession时需要打开该配置 -->
<property name="hibernate.current_session_context_class">true</property>
<!-- 映射文件 -->
<mapping resource="com/pechen/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration> </span>
*.hbm.xml映射文件:
<span style="font-size:14px;"><?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--生成默认为user的数据库表-->
<class name="com.pechen.hibernate.User">
<id name="id">
<!-- 算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成GUID -->
<generator class="uuid"></generator>
</id>
<property name="name"></property>
<property name="password"></property>
<property name="createTime" type="date"></property>
<property name="expireTime" type="date"></property>
</class>
</hibernate-mapping></span>
Hibernate优缺点
优点:
- 更加对象化:以对象化的思维操作数据库,我们只需要操作对象就可以了,开发更加对象化。
- 移植性:因为Hibernate做了持久层的封装,你就不知道数据库,你写的所有的代码都具有可复用性。
- Hibernate是一个没有侵入性的框架,没有侵入性的框架我们称为轻量级框架。对比Struts的Action和ActionForm,都需要继承,离不开Struts。Hibernate不需要继承任何类,不需要实现任何接口。这样的对象叫POJO对象。测试更加方便,提高了效率。
- 由于对持久层封装过于完整,导致开发人员无法对SQL进行优化,无法灵活使用JDBC的原生SQL,Hibernate封装了JDBC,所以没有JDBC直接访问数据库效率高。要使用数据库的特定优化机制的时候,不适合用Hibernate。
- 框架中使用ORM原则,导致配置过于复杂,一旦遇到大型项目,配置文件和内容是非常庞大的,另外DTO满天飞,性能和维护问题随之而来。
- 如果项目中各个表中关系复杂,表之间的关系很多,在很多地方把lazy都设置false,会导致数据查询和加载很慢,尤其是级联查询的时候。
- Hibernate在批量数据处理时有弱势,对于批量的修改,删除,不适合用Hibernate,这也是ORM框架的弱点。