Hibernate工作流程及与 MyBatis的比较

来源:互联网 发布:mysql分库分表策略 编辑:程序博客网 时间:2024/06/06 08:25

Hibernate创建步骤

(五大核心接口:Configuration/SessionFactory/Session/Transaction/Query)

   Configuration类:Configuration对象用来读取配置文件并创建SessionFactory对象。一般情况下,一个应用程序会创建Configuration对象,然后建立唯一的SessionFactory实例,意味着Configuration对象只存在系统的初始化阶段,然后所有的持久化操作通过唯一的SessionFactroy实例来进行

   SessionFactory接口:用来生成Session对象,并且它是一个重量级对象,占用的内存空间较大,所以一个程序只有一个SessionFactory实例

  Session接口(Hibernate核心对象):Session接口是java应用程序和Hibernate进行交互时所使用的主要接口,Session对象不是线程安全的,每个调用者应使用单独的session

 Transaction接口:用于管理事务,如果因为程序的异常或者其他原因导致没有执行commit()或rollback(),那么很可能会造成数据库中数据不一致现象发生

   Query :查询接口,用于向数据库查询对象,包装了HQL查询语言,采用了新的面向对象的查询方式。


 


1.新建工程,导入需要的jar包。

2.利用MyEclipse自动生成功能在工程中创建hibernate.cfg.xml配置文件和

 HibernateSessionFactory.java工具类。生成的主要内容如下:

hibernate.cfg.xml:

[html] view plain copy
  1. <hibernate-configuration>  
  2.   
  3.     <session-factory>  
  4.         <property name="connection.username">root</property>  
  5.         <property name="connection.url">  
  6.             jdbc:mysql://localhost:3306/databasename  
  7.         </property>  
  8.         <property name="dialect">  
  9.             org.hibernate.dialect.MySQLDialect  
  10.         </property>  
  11.         <property name="myeclipse.connection.profile">  
  12.             dangdang  
  13.         </property>  
  14.         <property name="connection.password">root</property>  
  15.         <property name="connection.driver_class">  
  16.             com.mysql.jdbc.Driver  
  17.         </property>  
  18.         <mapping resource="entity/User.hbm.xml" />  
  19.   
  20.     </session-factory>  
  21.   
  22. </hibernate-configuration>  
HibernateSessionFactory.java:
[html] view plain copy
  1. 略。。。  

3.创建UserDao接口和接口的实现类UserDaoImpl,实现类中测试:

UserDaoImpl.java:

[java] view plain copy
  1. public class UserDaoImpl implements UserDao {  
  2.   
  3.     public List<User> findAll() {  
  4.         Session session = HibernateSessionFactory.getSession();  
  5.         Transaction tx = session.beginTransaction();  
  6.         Query query = session.createQuery("from User");  
  7.                 query.setFirstResult(0);//分页  
  8.                 query.setMaxResults(2);  
  9.                 List<User> lists = query.list();  
  10.         tx.commit();  
  11.         HibernateSessionFactory.closeSession();  
  12.         return lists;  
  13.     }  
  14.     public static void main(String[] args) {  
  15.         UserDaoImpl user = new UserDaoImpl();  
  16.         System.out.println(user.findAll().size());  
  17.     }  
  18. }  


访问的时候其工作流程:

1.读取并解析配置文件;

2.Configuration负责读取并创建映射信息,创建sessionfactory;

3.SessionFactory负责创建session;

4.Transaction负责开启事物Transaction;

5.Query负责执行持久化操作;

6.Transaction负责提交实物;

7.关闭session;

8.关闭sessionfactory。

持久化对象的三种状态:



 HibernateMybatis对比总结

两者相同点

  • HibernateMyBatis都可以是通过SessionFactoryBuiderXML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuiderSessionFactorySession的生命周期都是差不多的。
  • HibernateMyBatis都支持JDBCJTA事务处理。

Mybatis优势

  • MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
  • MyBatis容易掌握,而Hibernate门槛较高。

Hibernate优势

  • HibernateDAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
  • Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
  • Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL
  • Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

他人总结

  • Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。 
  • Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。 
  • iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。 
  • iBATIS的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

0 0